【问题标题】:C# RSA FromXmlString() BadData ExceptionC# RSA FromXmlString() 错误数据异常
【发布时间】:2014-05-29 07:21:02
【问题描述】:

我像这样生成一个密钥:

ssh-keygen -t rsa1 -b 768 -C 测试

我得到一个如下所示的公钥:

768 65537 1244818534536334574875801623177648392314095757825816788136360615069738317432684324135107640137961040160008388231420349935694006787032419425836353385388446738225464450963417153771331511902010734528761152834146019053540579969112124269 测试

我在导入公钥时遇到问题。据我所知,以下应该可以工作。对 FromXmlString() 的调用因 BadData 加密异常而失败。我不确定我做错了什么。

string rsaKeyValue = "<RSAKeyValue>";
rsaKeyValue += "<Modulus>";
rsaKeyValue += Convert.ToBase64String(Encoding.ASCII.GetBytes(openSSHKeySplit[2]));
rsaKeyValue += "</Modulus>";
rsaKeyValue += "<Exponent>";
rsaKeyValue += Convert.ToBase64String(Encoding.ASCII.GetBytes(openSSHKeySplit[1]));
rsaKeyValue += "</Exponent>";
rsaKeyValue += "</RSAKeyValue>";                
mRSAContext.FromXmlString(rsaKeyValue); // This throws a BadData Crypto Exception

【问题讨论】:

  • 我可以建议使用实际的 Xml Parser/Builder 而不是自己创建 xml 字符串吗?自己构建是一个糟糕的想法,可能会导致许多软件错误。

标签: c# rsa


【解决方案1】:

您需要将数字解释为实际数字,而不是十进制 ascii 数字流。例如,对于指数,您当前正在获取 ascii 字节流的 base64 (0x36 0x35 0x35 0x33 0x37),而您应该使用 int.Parse("65537") 将其转换为整数,然后获取在传递给 base64 编码器之前使用 BitConverter.GetBytes() 的字节数组。模数有点棘手,因为它比标准整数要大。您可以尝试 System.Numerics 中的 BigInteger 类。即BigInteger.Parse("");

注意,您不必创建自己的 XML 字符串。我相信您可以使用 RSACryptoServiceProvider 和 RSAParameters 对象来实现相同的目标。

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
RSAParameters parameters = new RSAParameters();
parameters.Modulus = mod; // Your calculated modulus
parameters.Exponent = exp; // Your calculated exponent
rsa.ImportParameters(parameters);

【讨论】:

  • 哇,我觉得自己像个白痴。我会试一试并报告。
  • 做到了,我不知道为什么我之前没有想到这一点。谢谢。
猜你喜欢
  • 2017-10-17
  • 2017-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-14
  • 1970-01-01
  • 2014-07-13
  • 1970-01-01
相关资源
最近更新 更多