1

假设我有两个字符串(或字节数组)A 和 B,它们都具有相同的散列(散列是指 MD5 或 SHA1 之类的东西)。如果我在它后面连接另一个字符串,A+C 和 B+C 是否也具有相同的哈希 H'?C+A 和 C+B 会发生什么?

我用MD5对其进行了测试,在我的所有测试中,在末尾附加一些东西使哈希值相同,但在开头附加却没有。

这是否总是正确的(对于所有输入)?

对于所有(众所周知的)散列函数都是这样吗?如果不是,是否存在(众所周知的)散列函数,其中 A+C 和 B+C 不会碰撞(C+A 和 C+B 也不会)?

(除了MD5(x + reverse(x))我的意思是和其他构造的东西)

4

3 回答 3

2

细节取决于散列函数 H,但通常它们的工作方式如下:

  1. 消耗输入 X 块(例如,512 位)
  2. 将输入分解成更小的部分(比如 32 位)并根据输入更新哈希内部状态
  3. 如果有更多输入,请转到步骤 1
  4. 最后吐出内部状态作为哈希值H(X)

因此,如果 A 和 B 发生碰撞,即 H(A) = H(B),则哈希在消耗它们后将处于相同状态。使用相同的输入 C 进一步更新状态可以使生成的哈希值相同。这就解释了为什么 H(A+C) 有时是 H(B+C)。但这取决于 A 和 B 的大小如何与输入块大小对齐以及哈希如何在内部破坏输入块。

如果 C 是散列块大小的倍数,则 C+A 和 C+B 可以相同,否则可能不同。

于 2009-06-15T14:57:25.320 回答
0

完全取决于散列函数。此外,发生这些碰撞的可能性非常小。

于 2009-06-15T14:43:12.950 回答
0

这里讨论的散列函数通常是加密的(SHA1、MD5)。这些散列函数具有雪崩效应——输出将随着输入的微小变化而发生巨大变化。

的前缀和后缀扩展C将有效地使输入更长。因此,在输入的前面或后面添加任何内容应该会显着改变有效的哈希输出。

我不明白您是如何进行 MD5 检查的,这是我的测试。

echo "abcd" | md5sum
70fbc1fdada604e61e8d72205089b5eb

echo "0abcd" | md5sum
f5ac8127b3b6b85cdc13f237c6005d80

echo "abcd0" | md5sum
4c8a24d096de5d26c77677860a3c50e3

您是说您找到了两个具有相同 MD5 哈希的输入,然后在输入的末尾或开头附加了一些内容,并发现在末尾添加会导致与原始输入相同的 MD5?

请提供样品与您的测试结果。

于 2009-06-15T16:40:37.647 回答