C# 使用.NET Core获取RSA私钥

C# 使用.NET Core获取RSA私钥,c#,rsa,x509certificate2,cng,C#,Rsa,X509certificate2,Cng,在.NETCore(3.1)上,在Windows和Linux平台上,我想使用X509Certificiate2实例的私钥解密消息。证书分别从Windows平台上的证书存储和Linux平台上的PFX文件中检索 我希望使用以下方法解密消息: static byte[] Decrypt(byte[] data, RSAParameters privateKey) { using (var rsa = RSA.Create()) { rsa.ImportParameter

在.NETCore(3.1)上,在Windows和Linux平台上,我想使用X509Certificiate2实例的私钥解密消息。证书分别从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.CryptographyException:不支持请求的操作。”

var privateKey=x509cert.GetRSAPrivateKey();

var privateKeyParams=privateKey.ExportParameters(true);// 在第二个参数中,更改自己的
Decrypt
方法的signaure以接受
RSA
类的实例。您正在做一些额外的工作,将私钥导出为明文形式,然后将其导入另一个对象进行解密

var privateKey = x509cert.GetRSAPrivateKey();
此行已返回
RSA
类的实例。也就是说,您的所有代码都简化为:

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

由于您的私钥不可导出,因此引发异常。而且您实际上不需要有可导出的密钥。

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

var privateKey = x509cert.GetRSAPrivateKey();
此行已返回
RSA
类的实例。也就是说,您的所有代码都简化为:

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

由于您的私钥不可导出,因此引发异常。而且您实际上不需要有可导出的密钥。

您是仅在Windows上还是在两者上都出现异常?该错误至少在Windows平台上出现。将很快在Linux上进行测试。错误也在Linux上发生@Crypt32修复了它。您是仅在Windows上还是在两者上都出现异常?错误至少发生在Windows平台上。将很快在Linux上进行测试。错误也在Linux上发生@Crypt32修复了它。完美-根本不需要密钥参数。谢谢!完美-根本不需要关键参数。谢谢!