为什么使用 RSA 签名时 SHA256 和无效哈希算法?
Why is SHA256 and invalid hash algorithm when signing with RSA?
我正在尝试使用以下方法对流进行签名,但我总是收到一个加密异常,指出它不是有效的哈希算法,即使它已列在文档中:
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 证书,它不是副本。顺便说一句,请参阅下面的答案。
刚刚解决并且它不是重复的因为我使用的是 .NET 的普通 RSACryptoServiceProvider 而不是 X509 证书。
我运行进入这个post:
http://hintdesk.com/c-how-to-fix-invalid-algorithm-specified-when-signing-with-sha256/
阅读它时我突然想到要检查 RSA SignatureAlgorithm,结果 URI 表明它是 SHA1,所以没有 SHA256 或 SHA512。然后我在 MSDN 文档中查找 属性,它说 属性 总是 returns 这个值,因为它只支持那个值,所以只支持 SHA1。
当 CSP ProviderType 值为 24 (PROV_RSA_AES) 且 ProviderName 为 "Microsoft Enhanced RSA and AES Cryptographic Provider" 时,软件支持 RSACryptoServiceProvider
只能使用 SHA-2 摘要算法进行 RSA 签名(MS_ENH_RSA_AES_PROV)。硬件可能需要也可能不需要 PROV_RSA_AES,这取决于硬件。
RSACng
总是可以使用 SHA-2 摘要进行 RSA 签名(除非硬件支持并且硬件拒绝,但这似乎不太可能),并且 RSACng
也能够进行 RSA OAEP使用 SHA-2 摘要加密(RSACryptoServiceProvider
只有 PKCS#1 v1.5 和 OAEP-SHA-1)和 RSA PSS 签名。
但是 RSACryptoServiceProvider
长期以来一直是唯一的内置 RSA 提供程序,直到 .NET Framework 4.6.2 才让整个框架满意地接受 RSACng
(在 4.6 中添加) .
至于 SignatureAlgorithm
属性,它被硬编码为 SHA-1 XML 值。您无法从中提取任何信息。 (https://referencesource.microsoft.com/#mscorlib/system/security/cryptography/rsacryptoserviceprovider.cs,e4a5c015070c0714)
我正在尝试使用以下方法对流进行签名,但我总是收到一个加密异常,指出它不是有效的哈希算法,即使它已列在文档中:
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 证书,它不是副本。顺便说一句,请参阅下面的答案。
刚刚解决并且它不是重复的因为我使用的是 .NET 的普通 RSACryptoServiceProvider 而不是 X509 证书。
我运行进入这个post: http://hintdesk.com/c-how-to-fix-invalid-algorithm-specified-when-signing-with-sha256/
阅读它时我突然想到要检查 RSA SignatureAlgorithm,结果 URI 表明它是 SHA1,所以没有 SHA256 或 SHA512。然后我在 MSDN 文档中查找 属性,它说 属性 总是 returns 这个值,因为它只支持那个值,所以只支持 SHA1。
当 CSP ProviderType 值为 24 (PROV_RSA_AES) 且 ProviderName 为 "Microsoft Enhanced RSA and AES Cryptographic Provider" 时,软件支持 RSACryptoServiceProvider
只能使用 SHA-2 摘要算法进行 RSA 签名(MS_ENH_RSA_AES_PROV)。硬件可能需要也可能不需要 PROV_RSA_AES,这取决于硬件。
RSACng
总是可以使用 SHA-2 摘要进行 RSA 签名(除非硬件支持并且硬件拒绝,但这似乎不太可能),并且 RSACng
也能够进行 RSA OAEP使用 SHA-2 摘要加密(RSACryptoServiceProvider
只有 PKCS#1 v1.5 和 OAEP-SHA-1)和 RSA PSS 签名。
但是 RSACryptoServiceProvider
长期以来一直是唯一的内置 RSA 提供程序,直到 .NET Framework 4.6.2 才让整个框架满意地接受 RSACng
(在 4.6 中添加) .
至于 SignatureAlgorithm
属性,它被硬编码为 SHA-1 XML 值。您无法从中提取任何信息。 (https://referencesource.microsoft.com/#mscorlib/system/security/cryptography/rsacryptoserviceprovider.cs,e4a5c015070c0714)