如何从.NET读取PEMRSA私钥?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (21)

我有一个格式的RSA私钥PEM,是否有直接的方式来从.NET中读取并实例化一个RSACryptoServiceProvider解密使用相应公钥加密的数据?

提问于
用户回答回答于

bouncycastle就是这么做的,因为缺乏来自我方和文档的知识,我花了一些时间。这是代码:

var bytesToDecrypt = Convert.FromBase64String("la0Cz.....D43g=="); // string to decrypt, base64 encoded

AsymmetricCipherKeyPair keyPair; 

using (var reader = File.OpenText(@"c:\myprivatekey.pem")) // file containing RSA PKCS1 private key
    keyPair = (AsymmetricCipherKeyPair) new PemReader(reader).ReadObject(); 

var decryptEngine = new Pkcs1Encoding(new RsaEngine());
decryptEngine.Init(false, keyPair.Private); 

var decrypted = Encoding.UTF8.GetString(decryptEngine.ProcessBlock(bytesToDecrypt, 0, bytesToDecrypt.Length)); 
用户回答回答于

关于轻松导入RSA私钥,不使用BouncyCastle等第三方代码,我认为答案是“不是,只有私钥的PEM”。

但是,正如Simone所指出的那样,可以简单地将私钥(* .key)的PEM和使用该密钥(* .crt)的证书文件合并到* .pfx文件中,然后可以轻松导入该文件。

从命令行生成PFX文件:

openssl pkcs12 -in a.crt -inkey a.key -export -out a.pfx

然后通常使用.NET证书类,例如:

using System.Security.Cryptography.X509Certificates;

X509Certificate2 combinedCertificate = new X509Certificate2(@"C:\path\to\file.pfx");

现在可以按照MSDN中的示例通过RSACryptoServiceProvider进行加密和解密:

我遗漏了解密需要导入使用PFX密码和Exportable标志。(请参阅:BouncyCastle RSAPrivateKey到.NET RSAPrivateKey

X509KeyStorageFlags flags = X509KeyStorageFlags.Exportable;
X509Certificate2 cert = new X509Certificate2("my.pfx", "somepass", flags);

RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)cert.PrivateKey;
RSAParameters rsaParam = rsa.ExportParameters(true); 

扫码关注云+社区