RSA加密 C# 和 JAVA无法互通

发布于 2022-09-12 03:51:07 字数 3377 浏览 14 评论 0

C#利用xml公钥进行加密
Java利用私钥进行解密

Java总是无法解密成功
在网上找了各种开源的实现

xml 转 pem啊
pksc1 转 PKSC8 啊

不是报超长的错,就是Decryption error

C# 端的代码是不许更改的,只能改java去兼容
密钥是随机生成的,随便拿其中一个举例子

/**
 * xml私钥
 * 要解密的字符串
 */
public static string RSADecrypt(string xmlPrivateKey, string decryptString)
{
    try
    {
        RSACryptoServiceProvider rSACryptoServiceProvider = new RSACryptoServiceProvider();
        rSACryptoServiceProvider.FromXmlString(xmlPrivateKey);
        byte[] rgb = Convert.FromBase64String(decryptString);
        byte[] bytes = rSACryptoServiceProvider.Decrypt(rgb, fOAEP: false);
        return new UnicodeEncoding().GetString(bytes);
    }
    catch(Exception ex)
    {
        throw ex;
    }
}

public static string RSAEncrypt(string xmlPublicKey, string encryptString)
{
    try
    {
        RSACryptoServiceProvider rSACryptoServiceProvider = new RSACryptoServiceProvider();
        rSACryptoServiceProvider.FromXmlString(xmlPublicKey);
        byte[] bytes = new UnicodeEncoding().GetBytes(encryptString);
        byte[] inArray = rSACryptoServiceProvider.Encrypt(bytes, fOAEP: false);
        return Convert.ToBase64String(inArray);
    }
    catch(Exception ex)
    {
        throw ex;
    }
}

公钥

<RSAKeyValue>
  <Modulus>x2wFUbicePuwimH3NI4fJtnNgEHRY8AFSlZY8DhBvOdXq15vA0/UFz6vbO3tnDQxGqehzOwhaYd6e6Z+ZmN9kUnuIqTxFlsKxpDYvXfZjuwM+kfpJBrx6TxFEACOspdXqeYzAZDdGThu2CqTsgjo8ZY0EJClVK1n29RcnD6THtGAiIAwUWWhu+RhXYQ0822RxQwDIGphAqnnyJwpjmllsQ==</Modulus>
  <Exponent>AQAB</Exponent>
</RSAKeyValue>

私钥

<RSAKeyValue>
  <Modulus>x2wFUbicePuwimH3NI4fJtnNgEHRY8AFSlZY8DhBvOdXq15vA0/UFz6vbO3tnDQxGqehzOwhaYd6e6Z+ZmN9kUnuIqTxFlsKxpDYvXfZjuwM+kfpJBrx6TxFEACOspdXqeYzAZDdGThu2CqTsgjo8ZY0EJClVK1n29RcnD6THtGAiIAwUWWhu+RhXYQ0822RxQwDIGphAqnnyJwpjmllsQ==</Modulus>
  <Exponent>AQAB</Exponent>
  <P>7Izxh8oFQfHxoPDAlp/KzAX/CbQuK8gl5YirObf0eb6sKTZdpcAHYcinD4Ihem3zkV/hm1eOZ/341BZDDj6120IxpVfXx0RgbeqPvg92AgM=</P>
  <Q>19GSiY/XCM4ZxKZo8+UUE+qnRMWeC0rC+cQevjPzlmMIRdbO0B+NYz/Uu72EA3KKS5gfI3FRbYGCtvduQlycoKVsUSObtETceOpCiv75pTs=</Q>
  <DP>JtKrAWJCoqQWyBc7RH1NR1bkmK8dtMnQjm9zyrFKSoDkuI7Xp9BwZbgM0xrEa9eH1iAqYthn4uFn6UcOElRwfF/Mzhowq9+pA+EvXj4jXAk=</DP>
  <DQ>iakhCmPYqsIkB56J9YBaZTXZCfHvlI5UfdKONY6XwoZawYl6E6D8o6EUhcgly7kk44Ed45KleO8SPLjo+KVwNrwtsje/WqZN50atuVFYVf8=</DQ>
  <InverseQ>NPsUuCuEhUqTDnS61a78H1Bnd/He8ztIzYDo+t6pM0BbRrTM2J+fPYfJSF0nRVj7TuY+5GcQZRCoRJGq1y+nTxEQdLWArZtSnlGEyuPNum0=</InverseQ>
  <D>MZDOraYl9ggQtARvbfeZFI3z/tndEl7qsbROfL5u0GXrq2NYUkloHLLu5TMp6LYsMkTR+V4DW/hZYBxctFQsJI1si93VMkpEnl/oDweX4mamz1hY7SKvZ5SHJsDCgB6mWzvfMEOXRGBH/EtxzEfju5+Q2Svwg7kw1zjfQFWoKwqcz9BtRpKC1cz033g6Ww+4WoX8zI+1L34BS5a0nvpS9Q==</D>
</RSAKeyValue>

要被加密的文本

0-GjkYclhkx2MxneE1CIWqEma6dU-ivFS1UWp4r2X4EmkH1AKtXiAU5vSfTAIkuH

C# 调用encrypt方法后得到的其中一次结果

wwEw4f-NtvrCAW+Pbrg6fvdJVX0EIShlDZ4C1p47glbD-BcTwmftO5IXukqBvMRXJzzajGAmLuzIe+GOJo-vhF5AOeVo06StdXMMWIpqsow4rZzZiq+7tbYw5jw8c2fZzyyNqMVIM4wkz+lyTNrnxh7kYY2mXHSaMxAS5pQNcMOZSMMzD9pSPhG5+imQT2mbZhFpbFE9LDPyaKk2CUdqjg==

这一段扔到java程序里次次报错
网上找了各种开源实现都没有用,是哪里的编码不对吗?

C#端对文本进行了一次Unicode编码,这个会导致生成的密文java端无法解析吗?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

溺渁∝ 2022-09-19 03:51:07

看一下这边文章,用工具转换成xml格式就可以在c#里用了:https://cloud.tencent.com/dev...

在 java 中是用的Pem格式的密钥,而在 c# 中用的是 xml 格式的密钥,所以在用的时候要用工具转换一下

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文