C#RSA FromXmlString()BadData异常

时间:2014-05-28 20:32:58

标签: c# rsa

我生成一个如此的密钥:

  

ssh-keygen -t rsa1 -b 768 -C Test

我得到的公钥如下:

  

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

1 个答案:

答案 0 :(得分:2)

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

注意,您不必创建自己的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);