从我从密钥库中拉出的新RSACryptoServiceProvider
对象中启动新对象的最佳方法是什么?X509Certificate2
证书与公共(用于加密)和私有(用于解密)密钥相关联。
我目前正在使用该FromXmlString
方法,但必须有更好的方法。
谢谢
从我从密钥库中拉出的新RSACryptoServiceProvider
对象中启动新对象的最佳方法是什么?X509Certificate2
证书与公共(用于加密)和私有(用于解密)密钥相关联。
我目前正在使用该FromXmlString
方法,但必须有更好的方法。
谢谢
RSACryptoServiceProvider publicKeyProvider =
(RSACryptoServiceProvider)certificate.PublicKey.Key;
和
RSACryptoServiceProvider privateKeyProvider =
(RSACryptoServiceProvider)certificate.PrivateKey;
证书的公钥或私钥属性的密钥属性是 AsymmetricAlgorithm 类型。
推荐的方法是使用RSA
基类并调用certificate.GetRSAPrivateKey()
.
RSA publicKeyProvider = certificate.GetRSAPrivateKey();
从 .NET 4.6 开始,RSACryptoServiceProvider
不再建议按照@blowdart 的建议进行强制转换。由于有多个版本的 .NET(例如 .NET Core),这现在更是一个问题。
通过以RSACryptoServiceProvider
这种方式进行转换,您很有可能会遇到此转换异常(取决于所使用的平台和库):
无法将“System.Security.Cryptography.RSACng”类型的对象转换为“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 参数将只有指数和模数,所有其他参数都将为空;另一方面,如果存在私钥,则 RSA 参数将包含 D、DP、DQ、指数、InverseQ、模数、P 和 Q。