7

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

RSACryptoServiceProvider 类中,有一个方法SignHash,它:

通过使用私钥对其进行加密来计算指定哈希值的签名。

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

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

4

2 回答 2

5

感谢 Iridium 让我在这里按照正确的思路思考。

收件人得到两件事:

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

为了验证消息,收件人需要使用发件人的公钥解密签名,并根据消息的哈希值进行检查。

如果没有为接收者指定哈希算法,他们就无法知道如何对消息进行哈希处理,因此他们无法验证它。

所以算法必须指定给接收者。

为了让发件人(谁知道签名是如何创建的)指定散列算法,并且不能被其他任何人修改,它需要包含在签名中,并与散列一起加密。

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

于 2012-08-07T10:30:29.140 回答
0

例如,用于 RSA 签名的 PKCS#1 填充意味着在签名之前将散列函数标识符添加到散列值。

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

于 2012-08-27T10:19:49.903 回答