Luk*_*kos 4 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);
Run Code Online (Sandbox Code Playgroud)
第二行引发异常:
"工厂中的未知对象:DerInteger\r \nParameter name:obj"
我也尝试使用流而不是字节数组,并发生相同的错误.密钥对是使用OpenSSL创建的,如前所述,解密在PHP中使用openssl_private_decrypt()和.Net代码中的密钥相同.我也尝试了相同密钥的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));
Run Code Online (Sandbox Code Playgroud)
对于他们的帮助来说,还有很大的感谢.