C# 从x509Certificate2启动RSACryptServiceProvider的最佳方法?

C# 从x509Certificate2启动RSACryptServiceProvider的最佳方法?,c#,.net,cryptography,certificate,rsacryptoserviceprovider,C#,.net,Cryptography,Certificate,Rsacryptoserviceprovider,从我从密钥存储中取出的X509Certificate2初始化新RSACryptServiceProvider对象的最佳方法是什么?该证书与公钥(用于加密)和私钥(用于解密)相关联 我目前正在使用FromXmlString方法,但肯定有更好的方法 谢谢 及 证书的公钥或私钥属性上的密钥属性是非对称gorithm类型。Blowdart的答案确实正确。但是,为了清楚起见,我应该指出,如果您希望您的RSACryptServiceProvider实例同时包含X509证书的公钥和私钥(假设该证书确实包含私钥

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

我目前正在使用
FromXmlString
方法,但肯定有更好的方法

谢谢


证书的公钥或私钥属性上的密钥属性是非对称gorithm类型。

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

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

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

建议使用

RSA
基类并调用
certificate.GetRSAPrivateKey()

从.NET 4.6开始,不再推荐使用@blowdart建议的
rsacyptoserviceprovider
。这是一个更大的问题,因为现在有几个版本的.NET(如.NETCore)

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

无法将“System.Security.Cryptography.RSACng”类型的对象强制转换为“System.Security.Cryptography.rsacCryptoServiceProvider”类型

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


(请寻找杰里米·巴顿的答案)。

谢谢你,布劳达特,他的工作很有魅力。也许我应该买你的书。注意:应该是
certificate.PrivateKey
证书.PrivateKey.Key很好的答案,简短而甜蜜。非RSA提供商只是无关紧要吗?这些属性可能是非对称的Gorithm,并且不能保证它们的运行时类型实际上是RSACryptoServiceProvider….?不工作'System.InvalidCastException:'无法将'System.Security.Cryptography.RSACng'类型的对象强制转换为'System.Security.Cryptography.RSACryptoServiceProvider'。“我遇到了错误。”“无法将类型为'System.Security.Cryptography.RSACng'的对象强制转换为类型为'System.Security.Cryptography.RSACryptoServiceProvider'。”在.NET Core 3.1(RSACryptoServiceProvider)中(c.HasPrivateKey?c.PrivateKey:c.PublicKey.Key);然而:我永远不会这样做。我只会在我打算使用提供程序进行某些需要私钥的操作时加载私钥-当然,只加载公钥是没有帮助的。Dag是正确的,但要澄清的是…我要么想用私钥解密,要么用公钥加密。我不希望出现这种情况我可以用这种方法向前迈进。请考虑将接受的答案改为Rosdi Kasim。目前接受的答案现在已经过时和不可靠。
RSACryptoServiceProvider privateKeyProvider = 
    (RSACryptoServiceProvider)certificate.PrivateKey;
RSACryptoServiceProvider rsa;
if (cert.HasPrivateKey)
    rsa = (RSACryptoServiceProvider)cert.PrivateKey;
else
    rsa = (RSACryptoServiceProvider)cert.PublicKey.Key;
RSA publicKeyProvider = certificate.GetRSAPrivateKey();