【问题标题】:Getting RSA private key with .NET Core使用 .NET Core 获取 RSA 私钥
【发布时间】:2020-06-06 15:50:39
【问题描述】:

在 .NET Core (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.CryptographicException:不支持请求的操作。”

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

我错过了什么?

【问题讨论】:

  • 您是仅在 Windows 上还是在两者上都出现异常?
  • 这个错误至少出现在windows平台上。即将在 Linux 上进行测试。
  • Linux 上也有该错误。 @Crypt32 修复了它。

标签: c# rsa x509certificate2 cng


【解决方案1】:

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

var privateKey = x509cert.GetRSAPrivateKey();

这一行已经返回了RSA 类的一个实例。也就是说,您的所有代码都简化为:

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

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

【讨论】:

  • 完美 - 根本不需要 KeyParameters。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-19
  • 2012-01-02
  • 1970-01-01
  • 2014-05-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多