假设我有两个字符串(或字节数组)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))
和其他构造的东西我的意思)
答案 0 :(得分:2)
详细信息取决于散列函数H,但通常它们的工作方式如下:
因此,如果A和B发生碰撞,即H(A)= H(B),则在消耗它们之后,散列将处于相同的状态。使用相同的输入C进一步更新状态可以使得到的散列值相同。这解释了为什么H(A + C)有时是H(B + C)。但这取决于A和B的大小如何与输入块大小对齐以及散列如何在内部打破输入块。
如果C是散列块大小的倍数,则C + A和C + B可以是相同的,但可能不是。答案 1 :(得分:0)
这取决于哈希函数的完全。此外,您遇到这些碰撞的可能性非常小。
答案 2 :(得分:0)
这里讨论的散列函数通常是加密的(SHA1,MD5)。这些散列函数有一个Avalanche effect - 输出会随着输入的微小变化而急剧变化。
C
的前缀和后缀扩展名将有效地延长输入时间。
因此,在输入的前面或后面添加任何内容都应该显着改变有效的哈希输出。
我不明白你是如何进行MD5检查的,这是我的测试。
echo "abcd" | md5sum
70fbc1fdada604e61e8d72205089b5eb
echo "0abcd" | md5sum
f5ac8127b3b6b85cdc13f237c6005d80
echo "abcd0" | md5sum
4c8a24d096de5d26c77677860a3c50e3
你是说你找到了两个具有相同MD5哈希的输入,然后在输入的结尾或开头添加了一些东西,发现最后添加导致与原始输入相同的MD5?
请提供样品测试结果。