王小云老师破解MD5算法到底是怎么回事啊,有没有人给我们这些外行科普下?

王小云老师破解MD5算法到底是怎么回事啊,有没有人给我们这些外行科普下?

· json · rss
Subscribe:

About

本人在两年前系统学过密码分析的相关内容,当时的确是懂了,不过现在已经有些忘记了,如果有误可以在评论区指出。

我们要首先脱去所有的hash函数的外壳,在不考虑特殊构造的hash的情况下,hash函数本质是一个布尔方程组。

这句话什么意思呢?我们定义如下的式子就叫做 苏迟但到hash 吧。

\begin{align*} Output_0 &= x_0 x_1  + x_1 x_2 + x_1 \mod 2\\ Output_1 &= x_1  + x_1 x_2 x_0 + x_2\mod 2 \\ Output_2 &= x_2 x_1 + x_1  + x_2 \mod 2 \end{align*}

我们假设 x_i 是代表第i项输入, output_i 是代表第i项输出。

hash函数的本质就是定义了若干个这个式子。

当然现实生活中的式子都特别长,长到里面的项数可能是2^80的级别。

1.为什么可以做到那么长?

这是由于hash函数的迭代性质产生的。你可以重新看上面的公式,在第二轮的时候output又会变成x重新输入,那么代入第一轮的式子是不是就变得非常长,相当于乘上了一个原有的系数项的数量。

2.王小云想要破解什么?

王小云想要构造出一个碰撞对,换句话说就是实现在不同的输入但是相同的输出。

3.在原来我们碰撞一个hash对需要多少的计算量?

我们不考虑某个具体hash函数的性质,假设它的输出是随机的,长度为n,它的输出空间是 2^n 。那么大概平均需要遍历 \sqrt{2^n} 才能找到一个碰撞对。在这里就是 \sqrt{2^3} .

有几点要声明:1.n要足够大的情况下,才符合这个近似公式。

2.平均是指多次实验之后求平均值,在某一次你可能第一次就抽中了一个碰撞对,也可能你遍历完所有空间才抽中。这是一个期望值。

4.差分是什么?

输入差分是指存在一对输入 \Delta(x_0x_1x_2,x_0'x_1'x_2')=(m_0m_1m_2)

而这里的 m_i=x_i\oplus x_i'

我们在这里要引入一个知识,就是mod2下的加法和异或等价。也就是上式子可以写作 m_i=x_i+x_i' \mod 2

在后文我会省略mod2,同时加法和异或混用,你可以均看作加法即可(我主要是为了节约括号)。

我们会保持着m不变,而改变x的值,当然x'也会随之改变。

输出差分是指 \Delta(O,O')=O\oplus O'

注意,当m全部为0的时候,那么这个差分是平凡的差分,因为输出的值肯定相等,那么输出也全是0,所以我们不考虑这种情况。

5.魔力的一刻来了。

现在我们只关注output2.

Output_2 = x_2 x_1 + x_1  + x_2 \mod 2

\Delta O_2=O_2\oplus O_2'=( x_1x_2 + x_1  + x_2 )\oplus( x'_1x'_2 + x'_1  + x'_2)\\ =x_1x_2\oplus x'_1x'_2+x_1\oplus x'_1+x_2\oplus x'_2\\ =x_1x_2\oplus x'_1x'_2+m_1+m_2

现在我们发现输出的差分值可以被表示为 x_1x_2\oplus x'_1x'_2+m_1+m_2

x_1x_2\oplus x'_1x'_2 有一个性质就是当 x_1=x'_2 \& x'_1=x_2 的时候就等于0。

6.当我们设定了一个输入差分值为(0,1,1)。

我们惊奇的发现,在保持着这个差分的前提下,最后的一个输出值总是保持着0。

7.恭喜你.

你从密码学的角度成功破解了 苏迟但到hash 。

你成功发现了它的不均匀性,使得它不再是一个完美的hash函数。

因为我们保持这个输入差分的情况下,前面两个比特位的输出空间只有2*2,那么碰撞复杂度只需要根据生日攻击原理,对输出空间进行开根号,也就是 \sqrt{2^2}=2

但是这一步还不能够破解。

8.遍历,我们需要将 x_0x_1x_2 从000遍历到111,当然我们也要同步计算 x'_0x'_1x'_2

那么你就可以成功找到一个碰撞对。


在实际情况中,对于某一个输入差分对的输出差分是一个概率分布。

我们可以通过数学分析也可以通过遍历来实现对这个概率分布求解。当这个偏差足够大的时候就可以为破解提供条件。


对于多轮而言,这个偏差就是乘积形式存在,所以当轮次过多的时候它就被搅拌的足够均匀了,那么差分攻击的威力就没有那么强了。