使用BouncyCastle在C#中读取DER私钥

时间:2013-11-28 15:08:17

标签: c# encryption bouncycastle

我正在尝试使用BouncyCastle将RSA私钥读入.Net,以测试我之前加密的数据。使用公钥和Bouncy Castle加密数据工作正常,我也使用下面的相同私钥(这是DER格式)在PHP应用程序中成功解密我的数据,但我不知道为什么我不能在.Net中创建私钥来做同样的事情:

byte[] privatekey = File.ReadAllBytes(@"C:\Users\Luke\privkey.der");
var rsaKeyParameters = (RsaKeyParameters)PrivateKeyFactory.CreateKey(privatekey);

第二行引发异常:

  

“工厂中的未知对象:DerInteger \ r \ nParameter name:obj”

我也尝试使用流而不是字节数组,并发生同样的错误。密钥对是使用OpenSSL创建的,如前所述,解密在PHP中使用openssl_private_decrypt()和.Net代码中的密钥相同。我也尝试了相同密钥的PEM格式,但也没有用(但我不认为BC直接支持PEM)

以前有人这样做过吗?感谢

1 个答案:

答案 0 :(得分:8)

问题在于我假设PublicKeyFactory和PrivateKeyFactory是互补的,因为它们位于同一名称空间中。他们不是!

要解码私钥,我需要以下替代代码:

var privKeyObj = Asn1Object.FromStream(privatekey);
var privStruct = new RsaPrivateKeyStructure((Asn1Sequence)privKeyObj);

// Conversion from BouncyCastle to .Net framework types
var rsaParameters = new RSAParameters();
rsaParameters.Modulus = privStruct.Modulus.ToByteArrayUnsigned();
rsaParameters.Exponent = privStruct.PublicExponent.ToByteArrayUnsigned();
rsaParameters.D = privStruct.PrivateExponent.ToByteArrayUnsigned();
rsaParameters.P = privStruct.Prime1.ToByteArrayUnsigned();
rsaParameters.Q = privStruct.Prime2.ToByteArrayUnsigned();
rsaParameters.DP = privStruct.Exponent1.ToByteArrayUnsigned();
rsaParameters.DQ = privStruct.Exponent2.ToByteArrayUnsigned();
rsaParameters.InverseQ = privStruct.Coefficient.ToByteArrayUnsigned();
var rsa = new RSACryptoServiceProvider();
rsa.ImportParameters(rsaParameters);
return Encoding.UTF8.GetString(rsa.Decrypt(Convert.FromBase64String(ciphertext), true));

非常感谢你们的帮助。