Hash 散列上的多次迭代:不';它不是减少了熵吗?

Hash 散列上的多次迭代:不';它不是减少了熵吗?,hash,md5,iteration,sha1,Hash,Md5,Iteration,Sha1,我在很多地方看到了这种技术的推荐(包括堆栈),我无法忘记这会降低熵!毕竟,您正在再次散列某个已被散列且有冲突机会的内容。碰撞的机会超过碰撞的机会不会导致更多的碰撞机会吗?研究之后,似乎我错了,但为什么呢?既然您标记了md5,我就以它为例。发件人: 如果可以构造具有相同散列的两个前缀,则可以向这两个前缀添加一个公共后缀,以使冲突更有可能被使用它的应用程序接受为有效数据。此外,当前的冲突查找技术允许指定任意前缀:攻击者可以创建以相同内容开头的两个冲突文件。攻击者生成两个冲突文件所需的只是一个包含12

我在很多地方看到了这种技术的推荐(包括堆栈),我无法忘记这会降低熵!毕竟,您正在再次散列某个已被散列且有冲突机会的内容。碰撞的机会超过碰撞的机会不会导致更多的碰撞机会吗?研究之后,似乎我错了,但为什么呢?

既然您标记了md5,我就以它为例。发件人:

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

然后他们给出的示例明文是256字节长。由于冲突攻击依赖于128字节的数据块,而哈希摘要仅为128位,因此在第一次迭代之后不会增加冲突攻击成功的风险——也就是说,在第一次哈希之后,您无法真正影响冲突发生的可能性

也考虑散列的熵是上述128位。即使考虑到总碰撞概率仅为2^20.96(再次从),也需要大量迭代才能导致两个输入发生碰撞。我认为你是受害者的第一眼理由是:

  • 任意两个输入都有可能发生x%的冲突
  • 第一个散列的输出本身就是两个这样的输入
  • 因此,每次迭代都会增加x%的碰撞几率
这可以很容易地用反例来证明。再考虑MD5:

  • 两个输入发生冲突的几率为1:2^21(从维基百科的MD5密码分析中得出最坏的情况)
  • 再次散列会导致发生碰撞的几率相等,因此第二轮碰撞的几率为1:2^20
  • 因此,对于任何两个散列次数等于摘要熵的输入,都保证会发生冲突
MD5一行中任意两个输入128次,您将看到这不是真的。您可能不会在它们之间找到一个重复的散列-毕竟,您只创建了256个可能的2^128个散列值,剩下2^120个可能。每轮之间碰撞的概率是所有其他轮的概率

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

另一种方法是实现哈希函数在运行时实际上增加了熵。考虑到空字符串与其他输入一样有128位摘要;如果不在算法步骤中添加熵,则无法实现。这实际上是加密哈希函数的必要部分:必须销毁数据,否则可以从摘要中恢复输入。对于比摘要更长的输入,是的,总的来说熵是丢失的;它必须是,以适应摘要的长度。但也加入了一些熵


对于其他哈希算法,我没有精确的数字,但我认为我所提出的所有观点都可以推广到其他哈希函数和单向/映射函数。

它确实减少了熵

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

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

其他参考资料如下:

  • Gligoroski,D.和Klima,V.,2010年9月。理想随机函数窄管道散列设计畸变的实际后果。信息和通信技术创新国际会议(第81-93页)。施普林格柏林海德堡

  • Bhumik,R.,Dutta,A.,Guo,J.,Jean,J.,Mouha,N.和Nikolić,I.,2015年

  • Dinur,I.和Leurent,G.,2014年8月。改进了针对基于哈希的Mac和HAIFA的通用攻击。国际密码学会议(第149-168页)。施普林格柏林海德堡

从上一篇参考文献中,我们会发现以下两个引理: . 因此,如果使用k个独立的随机函数,而不是一个迭代k次的随机函数,熵损失的观测也成立