为什么SignHash需要知道使用了什么哈希算法?

时间:2012-08-07 09:50:24

标签: .net cryptography digital-signature

这可能是http://crypto.stackexchange.com的问题,但我想我先在这里尝试,因为答案可能与.NET有关,而不是加密算法本身。

RSACryptoServiceProvider class中,有一个方法SignHash,其中包含:

  

通过使用私钥加密指定哈希值的签名。

第一个参数是数据的哈希值(看起来很公平),但第二个参数是一个字符串,说明用于创建哈希值的算法。

问题是为什么哈希算法很重要?当然,所有方法需要做的是使用其私钥加密给定值并返回结果?如果它确实需要知道,为什么RSACryptoServiceProvider没有一个方法可以做到这一点(以及适当的验证方法)?

2 个答案:

答案 0 :(得分:5)

感谢Iridium让我在这里思考正确的方向。

收件人得到两件事:

  • 消息
  • 签名(由发件人的私钥加密)

要验证邮件,收件人需要使用发件人的公钥解密签名,并根据邮件的哈希检查该邮件。

如果未向收件人指定哈希算法,则他们无法知道如何对邮件进行哈希处理,因此无法对其进行验证。

因此必须为收件人指定算法。

为了让发送方指定哈希算法(谁知道签名是如何创建的),而不是其他任何人可以修改,它需要包含在签名中,并与哈希一起加密。

因此,为了创建有用的签名,需要在加密哈希时指定哈希算法。

答案 1 :(得分:0)

例如,RSA签名的PKCS#1填充意味着在签名之前向哈希值添加哈希函数标识符。

正如我所见,你正在使用这种方法。尝试设置具有相同摘要长度的另一种算法,您将看到签名不同。