对哈希进行多次迭代:它不会降低熵吗?

时间:2012-04-04 12:37:13

标签: hash md5 iteration sha1

我在很多地方(包括堆栈)都看到了这种技术,我无法理解这会减少熵!毕竟,你再次对某些东西进行哈希处理,这已经被哈希并且具有碰撞机会。碰撞机会碰撞机会不会导致更多的碰撞机会吗?经过研究,似乎我错了,但为什么呢?

2 个答案:

答案 0 :(得分:3)

由于您标记了md5,我将以此为例。来自wikipedia

  

如果可以构造具有相同散列的两个前缀,则可以向两者添加公共后缀,以使得碰撞更可能被使用它的应用程序接受为有效数据。此外,当前的冲突查找技术允许指定任意前缀:攻击者可以创建两个以相同内容开头的冲突文件。所有攻击者需要生成两个冲突文件的是一个模板文件,其中包含一个128字节的数据块,在64字节边界上对齐,可以通过冲突查找算法自由更改。 MD5冲突的示例是两个不同的6位消息:

然后他们提供的示例明文长度为256字节。由于冲突攻击依赖于128 字节数据块,并且哈希摘要仅为128 ,因此冲突攻击的成功风险确实没有增加第一次迭代 - 也就是说你无法真正影响第一次散列之外的碰撞可能性。

还要考虑哈希的熵是前面提到的128位。即使考虑到总碰撞机会仅为2 ^ 20.96(同样来自wikipedia),也需要大量迭代才能使两个输入发生碰撞。我认为你成为受害者的第一眼推理是:

  • 任意两个任意输入都有可能发生碰撞x%。
  • 第一个哈希的输出本身就是两个这样的输入。
  • 因此,每次迭代都会增加x%碰撞的几率。

这可以通过相当容易的反例来证明。再次考虑MD5:

  • 两个输入碰撞的机会是1:2 ^ 21(从维基百科的MD5加密分析中得出最坏的情况)
  • 哈希再次导致碰撞碰撞的机会相同,因此第二轮碰撞的机会是1:2 ^ 20
  • 因此,任何两个输入的哈希数等于摘要的熵都会保证发生碰撞。

MD5连续128次任意两个输入,你会发现这不是真的。你可能不会在它们之间找到一个重复的哈希值 - 毕竟,你只用可能的2 ^ 128个哈希值创建了256个,留下了2 ^ 120种可能性。每轮之间碰撞的概率是所有其他回合的independent

有两种方法可以理解为什么会这样。首先,每次迭代基本上都试图击中一个移动的目标。我认为你可以构建一个基于生日悖论的证明,即散列的迭代次数非常少,你可能会看到一个输入的一个散列摘要与不同输入的散列摘要相匹配。但它们几乎肯定会在迭代的不同的步骤中发生。一旦发生这种情况,它们在同一次迭代中永远不会有相同的输出,因为哈希算法本身是确定性的。

另一种方法是认识到哈希函数在运行时实际上添加了熵。考虑到空字符串具有128位摘要,就像任何其他输入一样;在算法步骤中没有添加熵的情况下不会发生这种情况。这实际上是加密哈希函数的必要部分:必须销毁数据,否则可以从摘要中恢复输入。对于比摘要更长的输入,是的,熵总体上会丢失;它必须是为了适应摘要长度。但是也添加了一些熵。

我没有其他哈希算法的确切数字,但我认为我所做的所有要点都归结为其他哈希函数和单向/映射函数。

答案 1 :(得分:1)

它确实减少了熵。

在Flajolet和Odlyzko的一篇名为Random Mapping Statistics的论文中,一个定理(定理2)表明:

“如果 n 位随机函数迭代 k 次,预期的图像点数为( 1 - t_k )* 2 ^ n (对于大型 n ),其中 t_k 满足递归关系 t_0 = 0 t_ {k + 1} = e ^ { - 1 + t_k} 。由此可以看出,预期的图像点数是 2 ^ {n-i + 1} 当迭代随机函数时 k = 2 ^ i 次。“

进一步参考如下:

  • Gligoroski,D。和Klima,V.,2010,September。从理想随机函数中窄管哈希设计的像差的实际后果。在ICT创新国际会议(第81-93页)。施普林格柏林海德堡。

  • Bhaumik,R.,Dutta,A.,Guo,J.,Jean,J.,Mouha,N。和Nikolić,I.,2015。More Rounds, Less Security?

  • Dinur,I。和Leurent,G.,2014,August。改进了基于散列的MAC和HAIFA的通用攻击。在国际密码学会议(第149-168页)。施普林格柏林海德堡。

从上一篇参考文献中,我们会发现以下两个词条: Two lemmas on entropy loss。 因此,如果使用 k 独立随机函数,而不是一个迭代 k 次的随机函数,则对熵损失的观察也成立。