为什么使用 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)