c# - 使用 BouncyCaSTLe 在 C# 中读取 DER 私钥

标签 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);

第二行抛出异常:

"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/

相关文章:

c# - 无法访问要在 HandleRequest 中使用的 EventArgs e 值

c# - 在 Internet Explorer 控件中禁用上下文菜单

encryption - 如何加密某些东西以便可以使用三个 key 中的任意两个解密?

c# - 使用 BouncyCaSTLe 生成 HMAC-SHA256 哈希

jar - 充气城堡 : How to get bcpkix-jdk15on-1. 47.jar 带有调试信息

c# - 生成 WAV 文件铃声

c# - 可以创建不区分大小写的字符串类吗?

java - 可以使用 RSA 加密的数据量有多少限制?

c - 仅使用 RSA 加密来加密长文本字符串

java - 使用 secp256r1 曲线 (BouncyCaSTLe) 生成长度为 127 的签名的 ECDSA 签名