这可能是 http://crypto.stackexchange.com 的问题,但我想我会先在这里尝试,因为答案可能与 .NET 而不是加密算法本身有关。
在 RSACryptoServiceProvider class ,有一个方法SignHash , 哪一个:
Computes the signature for the specified hash value by encrypting it with the private key.
第一个参数是数据的哈希值(这看起来很公平),但第二个参数是一个字符串,说明用于创建哈希值的算法。
问题是为什么哈希算法很重要?当然,所有方法需要做的就是使用其私钥加密给定值并返回结果?如果它真的需要知道,为什么 RSACryptoServiceProvider 没有一个方法可以做到这一点(以及适当的验证方法)?
最佳答案
感谢 Iridium 让我在这里按照正确的思路思考。
收件人得到两件事:
要验证消息,接收方需要使用发送方的公钥解密签名,并根据消息的哈希值进行检查。
如果未向收件人指定哈希算法,则他们无法知道如何对消息进行哈希处理,因此他们无法对其进行验证。
所以算法必须指定给接收者。
为了让散列算法由发送者(谁知道签名是如何创建的)指定,并且不能被其他任何人修改,它需要包含在签名中,并与散列一起加密。
因此,为了创建有用的签名,需要在加密散列时指定散列算法。
关于.net - 为什么 SignHash 需要知道使用的是什么哈希算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11843336/