我最近在Twitter上偶然发现了这个“时刻”,那里有三个文件,显示了它们自己的MD5哈希值。

例如,此GIF(下图为屏幕截图),哈希值:

f5ca4f935d44b85c431a8bf788c0eaca



它们显然匹配。同样,这看起来像是一种攻击,通常需要$ 2 ^ {128} $个评估,而不是通常的$ 2 ^ {64} $冲突,因为您要使用非常特定的消息-哈希对。

那么,文件如何显示其自己的MD5哈希,该如何工作?

评论

应该通过滥用多个冲突来直截了当。

@CodesInChaos好吧,至少对我而言,它不是“直截了当”的东西,您介意写一个解释性的答案吗? ;)到目前为止,我发现的所有材料(尤其是关于secse的内容)都表明它是“硬”的,并且仅适用于小的子字符串。

#1 楼

要了解发生了什么,您必须考虑MD5的工作方式以及碰撞攻击的工作方式。

MD5是Merkle-Damgård哈希函数:它按块处理输入数据(每个块64个字节) ),并具有128位的“运行状态”。因此,有一个内部函数$ f $将当前状态$ s $和下一个消息块$ m $作为输入,并输出新状态。处理完最后一个消息块后的状态为哈希值。

已知的冲突攻击会生成两对触发了冲突的两块消息,其起始状态值为$ s $。也就是说,给定128位的值$ s $,攻击会生成块$ m_1 $,$ m_2 $,$ m'_1 $和$ m'_2 $,这样$(m_1,m_2)\ neq(m' _1,m'_2)$和$ f(f(s,m_1),m_2)= f(f(s,m'_1)m'_2)$。这里的重点是,由于$ s $是任意的,因此可以“串连”冲突:将上面表达式的输出$ s'$作为状态值(即,在处理$ m_1 || m_2 $或$ m'_1 || m'_2 $),那么您可以再次发起攻击并找到新的碰撞对$ m_3 || m_4 $和$ m'_3 || m'_4 $。

此时,您将遇到四向多重冲突:以下四个消息:


$ m_1 || m_2 || m_3 || m_4 $
$ m_1 || m_2 || m'_3 || m'_4 $
$ m'_1 || m'_2 || m_3 || m_4 $
$ m'_1 || m'_2 || m'_3 | | m'_4 $

所有散列都具有相同的值。

现在通过运行攻击128次来迭代该进程。您最终遇到128个两个块的冲突,可以将它们链接在一起,从而允许总计$ 2 ^ {128} $条消息(每条消息由128对块组成,即长度为16384个字节),所有消息都散列为相同值。 br />
Merkle-Damgård结构的另一个重要结果是,一旦发生冲突,便可以向冲突的邮件中添加任意后缀,但仍然是冲突。同样,由于攻击可以使用任何起始状态值进行操作,因此您还可以具有任意前缀。

其余的攻击是非密码黑客。基本上,您需要一种足够灵活的文档格式来执行“选择”:一种可以根据文件中其他位置的特定字节打印出不同图片的文件格式。粗略地说,文件将具有以下格式:

prefix || multicollision || suffix


其中前缀和后缀根据“多碰撞”部分的内容选择要显示的图片。然后,您只需要在“ multicollision”部分中选择正确的组合(在$ 2 ^ {128} $中),以使显示的内容与预期的输出相匹配:由于这是一次多冲突,因此选择不会更改最终的哈希值。

基于格式的灵活性,这种“图像选择”机制或多或少容易实现。对于图灵等效语言(例如PostScript),这是微不足道的(*)。使用PDF和GIF动画,这是可行的。对于某些格式,这是极其困难的,甚至是不可能的(例如,如果格式是“人类可读的纯ASCII文本,那么就没有”选择”机制)。


(* )实际上,使用完全等效于Turing的格式,即使没有任何冲突也可以使用Quine技术显示文件哈希,它也可以与不中断的哈希函数(例如SHA-256)一起使用。并不是密码学的问题。

评论


$ \ begingroup $
有关打印自己的SHA256哈希的程序的Python3示例,请参见此处。 (注意:文件应以换行符结尾。)
$ \ endgroup $
– yyyyyyy
17 Mar 8 '17 at 20:20