我正在尝试使用 BouncyCaSTLe 将 RSA 私钥读入 .Net 以测试我之前加密的数据。使用公钥和 Bouncy CaSTLe 加密的数据工作正常,我也使用了与下面相同的私钥(DER 格式)在 PHP 应用程序中成功解密我的数据,但我不知道为什么我不能在 .Net 中创建私钥来做同样的事情:
byte[] privatekey = File.ReadAllBytes(@"C:\Users\Luke\privkey.der");
var rsaKeyParameters = (RsaKeyParameters)PrivateKeyFactory.CreateKey(privatekey);
第二行抛出异常:
"unknown object in factory: DerInteger\r\nParameter name: obj"
我也尝试过使用流而不是字节数组,但出现了同样的错误。 key 对是使用 OpenSSL 创建的,如前所述,解密在 PHP 中使用 openssl_private_decrypt() 和与 .Net 代码中相同的 key 进行。我还尝试了相同 key 的 PEM 格式,但也没有用(但我认为 BC 无论如何都不直接支持 PEM)
有人做过吗?谢谢
最佳答案
问题是我假设 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));
非常感谢 owlstead 的帮助。
关于c# - 使用 BouncyCaSTLe 在 C# 中读取 DER 私钥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20269406/