我正在尝试使用下面的方法对流进行签名但是我总是得到一个加密异常,说它不是一个有效的哈希算法,即使它在文档中列出:
byte[] SignData(RSACryptoServiceProvider rsa, Stream stream, string hashName)
{
HashAlgorithm hash = HashAlgorithm.Create(hashName);
byte[] signature = rsa.SignData(stream, hash);
return signature;
}
我用" SHA256"作为hashName参数。并且在调用rsa.SignData()的行处抛出异常。
这不是使用X509证书,它不是重复的。 BTW见下面的答案。
答案 0 :(得分:2)
刚解决,不是重复,因为我使用的是.NET的普通 RSACryptoServiceProvider ,而不是X509证书。
我遇到了这篇文章: http://hintdesk.com/c-how-to-fix-invalid-algorithm-specified-when-signing-with-sha256/
读到它时,我想到检查RSA SignatureAlgorithm,结果URI表明它是 SHA1 ,因此没有SHA256或SHA512。然后我在MSDN文档中查找了该属性,它说该属性总是返回该值,因为它只支持该值,所以只有 SHA1 。
答案 1 :(得分:2)
当CSP ProviderType值为24(PROV_RSA_AES)且ProviderName为“Microsoft Enhanced RSA and AES Cryptographic Provider”(MS_ENH_RSA_AES_PROV)时,软件支持的RSACryptoServiceProvider
仅能够使用SHA-2摘要算法执行RSA签名)。硬件可能需要也可能不需要PROV_RSA_AES,仅取决于硬件。
RSACng
总是可以使用SHA-2摘要进行RSA签名(除非硬件支持并且硬件拒绝,但这似乎不太可能),RSACng
也能够使用SHAA 2加密SHA-2摘要(RSACryptoServiceProvider
只有PKCS#1 v1.5和OAEP-SHA-1)和RSA PSS签名。
但RSACryptoServiceProvider
是唯一内置的RSA提供程序,直到.NET Framework 4.6.2才能让整个框架对接受RSACng
感到满意(在4.6中添加)。 / p>
对于SignatureAlgorithm
属性,它被硬编码为SHA-1 XML值。您无法从中提取任何信息。 (https://referencesource.microsoft.com/#mscorlib/system/security/cryptography/rsacryptoserviceprovider.cs,e4a5c015070c0714)