如何使用RSA和SHA256和.NET签署文件?

如何使用RSA和SHA256和.NET签署文件?,第1张

如何使用RSA和SHA256和.NET签署文件?

RSA + SHA256可以并且将…

您后面的示例 可能
并非始终有效,它应使用哈希算法的OID,而不是名称。根据你的第一个例子,这是从调用获得的

CryptoConfig.MapNameToOID(AlgorithmName)
,其中
AlgorithmName
是您所提供的(即“SHA256”)。

首先,您需要的是带有私钥的证书。我通常通过使用公共密钥文件(

.cer
)来识别私钥,从LocalMachine或CurrentUser存储中读取我的私钥,然后枚举证书并在哈希上进行匹配…

X509Certificate2 publicCert = new X509Certificate2(@"C:mycertificate.cer");//Fetch private key from the local machine storeX509Certificate2 privateCert = null;X509Store store = new X509Store(StoreLocation.LocalMachine);store.Open(OpenFlags.ReadOnly);foreach( X509Certificate2 cert in store.Certificates){    if (cert.GetCertHashString() == publicCert.GetCertHashString())        privateCert = cert;}

无论您到达那里,一旦获得带有私钥的证书,我们都需要对其进行重建。由于证书创建它的私钥的方式可能是必需的,但我不确定为什么。无论如何,我们首先导出密钥,然后使用您喜欢的任何中间格式重新导入密钥,最简单的是xml:

//Round-trip the key to XML and back, there might be a better way but this worksRSACryptoServiceProvider key = new RSACryptoServiceProvider();key.FromXmlString(privateCert.PrivateKey.ToXmlString(true));

一旦完成,我们现在可以如下签名数据:

//Create some data to signbyte[] data = new byte[1024];//Sign the databyte[] sig = key.SignData(data, CryptoConfig.MapNameToOID("SHA256"));

最后,可以直接使用证书的公钥进行验证,而无需像使用私钥那样进行重建:

key = (RSACryptoServiceProvider)publicCert.PublicKey.Key;if (!key.VerifyData(data, CryptoConfig.MapNameToOID("SHA256"), sig))    throw new CryptographicException();


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5567502.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-14

发表评论

登录后才能评论

评论列表(0条)

保存