0

假设 H 是某个散列函数(例如 MD5 或 SHA256 或其他),并且我对这个散列有冲突:两个不同的数据 x 和 y,它们具有相同的散列。

换句话说,x≠y,但 H(x)=H(y)。

现在,如果我连接一些随机数据 z,H(x+z) 是否与 H(y+z) 相同?

这个想法是:x 和 y 发生冲突可能意味着它们碰巧使 H 函数处于相同的状态(从而导致相同的哈希)。从那时起,无论我们附加什么其他数据,它们的哈希值都将保持相等。

我在上面测试了这个 MD5 碰撞,它似乎在那里工作。但我不知道这是否是真的?

4

3 回答 3

1

这种特殊的技术称为长度扩展攻击。散列函数是否易受攻击显然取决于特定的散列函数。基于Merkle-Damgård 结构的哈希函数,例如 MD5 和 SHA-1,很容易受到攻击。SHA-3 不易受攻击,HMAC 结构也不易受攻击。

于 2013-10-29T15:15:29.303 回答
0

取决于 has 功能。由于散列函数不是同态的(即,其中:f(x) = f(y)暗示x = y),它不遵循这一点f(x + z)并且f(y + z)将映射到同一个项目。考虑一个反例:

给定哈希函数

f(x) = (x * 3) + 1 mod 6

然后f(2) = 1f(6) = 1。让z = 1. 然后:

f(2 + z) = 4 and f(6 + z) = 1

因此f(2) = f(6)但是f(2 + z) ≠ f(6 + z)

但是,如果哈希函数是同态的,那么根据同态的定义:

f(p + q) = f(p) + f(q)

因此:

f(x + z) = f(x) + f(z) 
f(y + z) = f(y) + f(z)

f(x) = f(y)正如你最初所说的那样:

f(x) + f(z) = f(y) + f(z)

所以他们的哈希值是一样的。

于 2013-10-29T15:12:35.307 回答
0

(请放纵,这是我的第一个答案:D)不一定:

考虑以下数据(作为数字列表)

x = [8 0 4]
y = [8 1 0]
z = [5]

和散列函数:

H([a b c]) = a + b*c
H([a b c d]) = H([b c d]) + H([a b c]) 

然后,发生 x 和 y 的碰撞:

H(x) = H([8 0 4]) = 8 + 0*4 = 8
H(y) = H([8 1 0]) = 8 + 1*0 = 8

但是在附加数据时,哈希值不相等:

H(z + x) = H([5 8 0 4]) = H([5 0 8]) + H([8 0 4]) = 5 + 8 = 13
H(z + y) = H([5 8 1 0]) = H([5 8 1]) + H([8 1 0]) = 13 + 8 = 21
于 2013-10-29T15:44:15.713 回答