从x509Certificate2初始化RSACryptoServiceProvider的最佳方法

本文关键字:最佳 方法 RSACryptoServiceProvider x509Certificate2 初始化 | 更新日期: 2023-09-27 17:54:21

从密钥存储中取出的X509Certificate2初始化新的RSACryptoServiceProvider对象的最佳方法是什么?证书与公钥(用于加密)和私钥(用于解密)相关联。

我目前使用的FromXmlString方法,但必须有一个更好的方法。

谢谢

从x509Certificate2初始化RSACryptoServiceProvider的最佳方法

注意:虽然这是公认的答案,并且在2011年是有效的,但这段代码现在在。net Core下不起作用。如果你正在使用。net Framework 4.6+,或者。net Core/。net .

RSACryptoServiceProvider publicKeyProvider = 
    (RSACryptoServiceProvider)certificate.PublicKey.Key;

RSACryptoServiceProvider privateKeyProvider = 
    (RSACryptoServiceProvider)certificate.PrivateKey;

证书的公钥或私钥属性的密钥属性类型为AsymmetricAlgorithm

建议使用RSA基类,调用certificate.GetRSAPrivateKey()

RSA publicKeyProvider = certificate.GetRSAPrivateKey();

从。net 4.6开始,不再推荐像@blowdart那样强制转换为RSACryptoServiceProvider。这是一个更大的问题,因为现在有几个版本的。net(如。net Core)。

通过这种方式强制转换为RSACryptoServiceProvider,很有可能会得到这个强制转换异常(取决于所使用的平台和库):

无法强制转换类型为"System.Security.Cryptography"的对象。

rsacryptoserviceprovider

原因是每个平台的实际实现可能不同,在Windows上使用RSACng

这是一个描述这个问题的链接(寻找Jeremy Barton的答案)

Blowdart的答案确实正确。但是,为了清楚起见,我应该指出,如果您希望RSACryptoServiceProvider实例同时包含 X509证书的公钥和私钥(假设证书确实有私钥)。检查证书的HasPrivateKey属性

RSACryptoServiceProvider rsa;
if (cert.HasPrivateKey)
    rsa = (RSACryptoServiceProvider)cert.PrivateKey;
else
    rsa = (RSACryptoServiceProvider)cert.PublicKey.Key;

在RSA的情况下,当只有公钥存在时,RSA参数将只有Exponent和Modulus,其他所有参数将为空;另一方面,如果私钥存在,RSA参数将包含D、DP、DQ、Exponent、InverseQ、Modulus、P和q。