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

推荐答案

更新日期:2021年3月3日

现在,.NET 5开箱即可支持此功能.

要try 下面的代码片段,请生成密钥对并在http://travistidwell.com/jsencrypt/demo/处加密一些文本

var privateKey = @"-----BEGIN RSA PRIVATE KEY-----
{ the full PEM private key } 
-----END RSA PRIVATE KEY-----";

var rsa = RSA.Create();
rsa.ImportFromPem(privateKey.ToCharArray());

var decryptedBytes = rsa.Decrypt(
    Convert.FromBase64String("{ base64-encoded encrypted string }"), 
    RSAEncryptionPadding.Pkcs1
);

// this will print the original unencrypted string
Console.WriteLine(Encoding.UTF8.GetString(decryptedBytes));

原始答案

我解决了,谢谢.如果有人感兴趣,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)); 

.net相关问答推荐

将Visual Studio更新到v17.9.3后,IDE关闭,dotnet.exe命令报告致命错误.内部CLR错误.(0x80131506)

节省用户在整个应用程序中使用的Flutter

.NET最小API BadRequest响应不返回正文

从删除项目时重新索引的列表中删除项目的最佳算法是什么?

Msbuild try 构建 msbuild.exe 而不是我的 .csproj 文件

将 Span 传递到函数时出现 F# 错误

maxRequestLength 的最大值?

整个命名空间的SuppressMessage

C# 的部分类是糟糕的设计吗?

如何明智地使用 StringBuilder?

BackgroundWorker 中未处理的异常

C# 中基于接口编程的运算符重载

测试没有预期的异常

在 C# 中将匿名类型转换为键/值数组?

如何制作通用类型转换函数

是 C# 中的 bool 读/写原子

Windows 服务在哪个目录中运行?

浮动与双重性能

Dictionary.Add 与 Dictionary[key]=value 的区别

如何将两个 List 相互比较?