.net 从x509Certificate2启动RSACryptoServiceProvider的最佳方式是什么?

8cdiaqws  于 2022-12-20  发布在  .NET
关注(0)|答案(3)|浏览(178)

从我从密钥库中取出的X509Certificate2初始化一个新的RSACryptoServiceProvider对象的最佳方法是什么?证书与公钥(用于加密)和私钥(用于解密)都关联。
我目前使用的是FromXmlString方法,但肯定有更好的方法。
谢啦,谢啦

pbossiut

pbossiut1#

  • 注意:虽然这是公认的答案,并且早在2011年就有效,但此代码现在无法在.NET Core下运行。如果您使用的是.NET Framework 4.6+或.NET Core /. NET,请参阅this answer。*
RSACryptoServiceProvider publicKeyProvider = 
    (RSACryptoServiceProvider)certificate.PublicKey.Key;

以及

RSACryptoServiceProvider privateKeyProvider = 
    (RSACryptoServiceProvider)certificate.PrivateKey;

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

piv4azn7

piv4azn72#

推荐的方法是使用RSA基类并调用certificate.GetRSAPrivateKey()

RSA publicKeyProvider = certificate.GetRSAPrivateKey();

从.NET 4.6开始,@blowdart建议的RSACryptoServiceProvider类型转换不再被推荐,这是一个更大的问题,因为.NET有多个版本(如.NET Core)。
通过这种方式强制转换为RSACryptoServiceProvider,您很可能会遇到此强制转换异常(取决于所使用的平台和库):
无法将类型为“System.Security.Cryptography.RSACng”的对象强制转换为类型“System.Security.Cryptography.RSACryptoServiceProvider”
原因是每个平台的实际实现可能不同,在Windows RSACng上使用。
Here is a link that describes this issue(寻找Jeremy巴顿的答案)。

jobtbby3

jobtbby33#

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

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

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

相关问题