这几天在看密码学的长度扩展攻击,看了不少文章,感觉都说得不够清楚,自己弄清楚之后想写一篇,做一个记录。
1. 简介
长度扩展攻击(length extension attack),是指针对某些允许包含额外信息的加密散列函数的攻击手段。对于满足以下条件的散列函数,都可以作为攻击对象:
① 加密前将待加密的明文按一定规则填充到固定长度(例如512或1024比特)的倍数;
② 按照该固定长度,将明文分块加密,并用前一个块的加密结果,作为下一块加密的初始向量(Initial Vector)。
满足上述要求的散列函数称为Merkle–Damgård散列函数(Merkle–Damgård hash function),下列散列函数都属于Merkle–Damgård散列函数:
- MD4
- MD5
- RIPEMD-160
- SHA-0
- SHA-1
- SHA-256
- SHA-512
- WHIRLPOOL
① 知道密文的加密算法且该算法满足Merkle–Damgård散列函数特征;
② 不知道salt,但知道salt的长度,并可控制data的值;
③ 可以得到一个H(salt+data)的值。
2. 攻击方法详解
下面以MD5算法为例,讲述该攻击方式如何进行攻击。
百度百科中详细阐述了MD5算法的实现过程https://baike.baidu.com/item/MD5/212708?fr=aladdin,我们并不需要知道MD5具体的算法是怎么回事,只需要知道它的实现是满足上面所说的Merkle–Damgård散列函数的两个条件的,具体过程是这样的:
① 填充
拿到明文后,MD5现将明文转为二进制文件,然后将二进制文件的长度除以512比特(即64字节),如果余数等于448比特(即64-8字节),那么直接在后面加上八个字节的长度标识,使之成为512比特的倍数。否则则在明文后填一个1,再填充0直至其长度除以512