Author:ProofZ

0x00 MD(Merkle-Damgard)迭代结构

这种结构定义的Hash函数中,输入消息m,并将其分为L个固定长度,若最后一个不满足输入分组长度的要求,按照一定规则进行填充。该Hash函数重复使用一个压缩函数f。压缩函数f有两个输入,一个是前一阶段的n bit输入,另外一个是源于消息b bit分组,并产生一个n bit的输出,作为下一个阶段的输入。算法开始要有一个初始值IV。具体如下图:
(7B00{@KF`BZ0D[8~__ZLPO.png

如上图,假设明文M分组为Y1、Y2、Y3、Y4。看第一步,先将消息分组Y1与初始变量IV进行f函数操作之后,得出的值和Y2继续使用f函数操作,直到最后得出的值就是hash值,这就是MD迭代结构。

MD5和sha系列的算法也是这种结构,只不过它们才去不同长度的IV和f函数。

0x01 验证逻辑的不严谨

思考以下情况:

A生成一个key和消息m,计算h=hash(m,key),公布{m,h},A采用这种方式验证自己的消息m是否被篡改过。此时,A觉得没人能更改他的消息m,因为更改之后,无法更改h,因为篡改者没有key。也就无法计算h_fake=hash(m_fake, key)。便可以采用hash扩展攻击。

0x02 攻击原理

篡改者没有key,但是又得找到一个h_fake=hash(m_fake, key),得到一个{m_fake, h_fake}骗过A,这时候就可以用到hash扩展攻击。前提是满足上面两个条件。

观察MD结构,公布了{m,h},假设这里的(m, key)就是上面MD解释图中的M,生成的hash值为h。如图:

Z$@V{E(L}8B0(30SSIKUY9R.png

hash扩展攻击主要就是在这后面夹了一块Y5,通过公布出来的h和Y5得出新的hash,新的hash就是h_fake,m_fake=(m,key,xxx)=(Y1,Y2,Y3,Y4,Y5)。

如图:

333NCT4EAQNI0)L7DR4I(Q6.png

15D20R0A9~1H91O`JPE7J95.png