根据您的 .NET 版本,您可能根本不需要 BouncyCastle。从 .NET Core 3.1 开始,可以使用
RSA.ImportEncryptedPkcs8PrivateKey()
导入 DER 编码的加密私有 PKCS#8 密钥,而从 .NET 5.0 开始,甚至可以使用
RSA.ImportFromEncryptedPem()
导入 PEM 编码的加密密钥。
否则,使用 C# / BouncyCastle 可用于导入加密的私有 PKCS#8 密钥,例如:
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.OpenSsl;
...
string encPkcs8 = @"-----BEGIN ENCRYPTED PRIVATE KEY-----
...
-----END ENCRYPTED PRIVATE KEY-----";
StringReader stringReader = new StringReader(encPkcs8);
PemReader pemReader = new PemReader(stringReader, new PasswordFinder("<your password>"));
RsaPrivateCrtKeyParameters keyParams = (RsaPrivateCrtKeyParameters)pemReader.ReadObject();
...
使用以下实现的 IPasswordFinder
接口:
private class PasswordFinder : IPasswordFinder
{
private string password;
public PasswordFinder(string pwd) => password = pwd;
public char[] GetPassword() => password.ToCharArray();
}
如果需要的话,可以通过以下方式将
keyParams
转换为
System.Security.Cryptography.RSAParameters
:
using Org.BouncyCastle.Security;
...
RSAParameters rsaParameters = DotNetUtilities.ToRSAParameters(keyParams);
可以直接导入,例如使用RSA.ImportParameters()
。
编辑:
在查看C#/BouncyCastle源代码后,您的方法也是可行的(我之前不知道)。
DecryptKey()
有多个重载,其中一个可以处理Maarten Bodewes在评论中已经怀疑的DER编码加密密钥。后者可以使用Org.BouncyCastle.Utilities.IO.Pem.PemReader()
类轻松生成。
请注意,此PemReader
与第一种实现中的PemReader
不同(不同的命名空间),这就是为什么我在以下代码片段中明确使用命名空间的原因。通过这种方法,可以生成RsaPrivateCrtKeyParameters
实例,如下所示:
using Org.BouncyCastle.Security;
using Org.BouncyCastle.Crypto.Parameters;
...
StringReader stringReader = new StringReader(encPkcs8);
Org.BouncyCastle.Utilities.IO.Pem.PemReader pemReader = new Org.BouncyCastle.Utilities.IO.Pem.PemReader(stringReader);
Org.BouncyCastle.Utilities.IO.Pem.PemObject pem = pemReader.ReadPemObject();
RsaPrivateCrtKeyParameters keyParams = (RsaPrivateCrtKeyParameters)PrivateKeyFactory.DecryptKey("<your password>".ToCharArray(), pem.Content);
...
pem.Content
包含 DER 编码的加密私钥 PKCS#8。
new X509Certificate2(fileName, pw)
、GetECDsaPrivateKey()
或Export()
的方法从证书中提取密钥。同时,也可以查看一下RSA.Create(4096)
。 - Charles