使用 .NET Core 获取 RSA 私钥

Getting RSA private key with .NET Core

在 .NET Core (3.1) 上,在 Windows 和 Linux 平台上,我想使用 X509Certificate2 实例的私钥解密消息。证书分别从 Windows 平台上的证书存储和 Linux 平台上的 PFX 文件中检索。

我想用类似的东西解密邮件:

static byte[] Decrypt(byte[] data, RSAParameters privateKey)
{
    using (var rsa = RSA.Create())
    {
        rsa.ImportParameters(privateKey);
        return rsa.Decrypt(data, RSAEncryptionPadding.OaepSHA256);
    }
}

但是当我尝试提取私钥时,出现异常:"System.Security.Cryptography.CryptographicException: The requested operation is not supported."

var privateKey = x509cert.GetRSAPrivateKey();
var privateKeyParams = privateKey.ExportParameters(true); // <-- throws CryptographicException

我错过了什么?

更改您自己的 Decrypt 方法的签名以在第二个参数中接受 RSA class 的实例。您正在做一些额外的工作,将私钥导出为明文形式,然后将其导入另一个对象以进行解密。

var privateKey = x509cert.GetRSAPrivateKey();

此行已经 returns RSA class 的实例。也就是说,您所有的代码都简化为:

using (var rsa = x509cert.GetRSAPrivateKey())
{
    return rsa.Decrypt(data, RSAEncryptionPadding.OaepSHA256);
}

抛出异常是因为您的私钥不可导出。而且你真的不需要有可导出的密钥。