hash扩展攻击产生
hash扩展攻击存在的原因有两个,第一个是现在常用的hash函数如md5和sha系列的是采用的MD迭代结构;第二个就是验证逻辑的不严谨。
1、MD(Merkle-Damgard)迭代结构
这种结构定义的Hash函数中,输入消息m,并将其分为L个固定长度,若最后一个不满足输入分组长度的要求,按照一定规则进行填充。该Hash函数重复使用一个压缩函数f。压缩函数f有两个输入,一个是前一阶段的n bit输入,另外一个是源于消息b
bit分组,并产生一个n bit的输出,作为下一个阶段的输入。算法开始要有一个初始值IV。具体如下图:
如上图,假设明文M分组为Y1、Y2、Y3、Y4。看第一步,先将消息分组Y1与初始变量IV进行f函数操作之后,得出的值和Y2继续使用f函数操作,直到最后得出的值就是hash值,这就是MD迭代结构。
MD5和sha系列的算法也是这种结构,只不过它们才去不同长度的IV和f函数。
2、验证逻辑的不严谨
思考以下情况:
A生成一个key和消息m,计算h=hash(m,key),公布{m,h},A采用这种方式验证自己的消息m是否被篡改过。此时,A觉得没人能更改他的消息m,因为更改之后,无法更改h,因为篡改者没有key。也就无法计算h_fake=hash(m_fake, key)。变可以采用hash扩展攻击。
3、攻击产生
篡改者没有key,但是又得找到一个h_fake=hash(m_fake, key),得到一个{m_fake, h_fake}骗过A,这时候就可以用到hash扩展攻击。前提是满足上面两个条件。
观察MD结构,公布了{m,h},假设这里的(m, key)就是上面MD解释图中的M,生成的hash值为h。如图:
hash扩展攻击主要就是在这后面夹了一块Y5,通过的出来的h和Y5得出新的hash,新的hash就是h_fake,m_fake=(m,key,xxx)=(Y1,Y2,Y3,Y4,Y5)。
如图:
这样,我们便做到了在消息m之后添加xxx,求得{m_fake, h_fake}来欺骗A了。