MD5算法
MD5算法简介
MD5
MD5为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。
MD5即Message Digest Algorithm (信息-摘要算法5),一种被广泛使用的密码散列函数, 使用 little-endian,输入任意不定长度信息,以512位长进行分组,生成四个32位数据,最后联合起来输出固定128位长的信息摘要可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5 不是足够安全的,因为Hans Dobbertin 在1996年找到了两个不同的 512-bit 块,它们在 MD5 计算下产生相同的 hash 值。
MD5算法特点:
1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。
2、容易计算:从原数据计算出MD5值很容易。
3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
4、强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
MD5基本实现
输入不定长度信息,输出固定长度128-bits的算法。经过程序流程,生成四个32位数据,最后联合起来成为一个128-bits散列。基本方式为,求余、取余、调整长度、与链接变量进行循环运算。得出结果。
MD5算法实现
算法过程
1. 填充padding
在原始消息数据尾部填充标识 100…0,填充后的消息位数 L≡ 448 (mod 512)。至少要填充1个位,所以标识长度 1~512位。 再向上述填充好的消息尾部附加原始消息的位数的低64位,最后得到一个长度 L 是512位整数倍的消息。
填充的方法如下:
- 在信息的后面填充一个1和无数个0,直到满足上面的条件时才停止用0对信息的填充。
- 在这个结果后面附加一个以64位二进制表示的填充前信息长度(单位为Bit),如果二进制表示的填充前信息长度超过64位,则取低64位。经过这两步的处理,信息的位长=N*512+448+64=(N+1)*512,即长度恰好是512的整数倍。这样做的原因是为满足后面处理中对信息长度的要求。
2. 分块
把填充后的消息结果分割为 L 个512位的分组:Y0, Y1, …, YL-1。
结果也表示成 N 个32位长的字 M0, M1, …, MN-1,N = L ×16。
3. 初始化变量
初始化一个128位的 MD 缓冲区,记为 CVq,也表示为4个32位
寄存器 (A, B, C, D);CV0 = IV。迭代在 MD 缓冲区进行,最后一
步的128位输出即为算法结果
寄存器 (A, B, C, D) 置16进制初值作为初始向量 IV,并采用小端
存储 (little-endian) 的存储结构:
A = 0x67452301
B = 0xEFCDAB89
C = 0x98BADCFE
D = 0x10325476
Little-Endian 将低位字节排放在内存的低地址端,高位字节排放在
内存的高地址端。相反 Big-Endian 将高位字节排放在内存的低地
址端,低位字节排放在内存的高地址端。存储结构与 CPU 体系结
构和语言编译器有关。PowerPC 系列采用 big endian 方式存储数据
,而 Intel x86系列则采用 little endian 方式存储。
4. 压缩函数
- MD5 压缩函数 H(M