MD5简介
MD5即Message-Digest Algorithm 5, 信息学中使用广泛的哈希算法
这个算法具有很多性质:
- 压缩性: 对于任意长度的输入, 输出长度总是相同的
- 容易计算: 线性时间复杂度
- 抗修改性: 对原数据的一点点修改都会导致最终结果的巨大变化
- 抗碰撞性: 已知原数据和MD5值很难生成与原数据不同但MD5值相同的数据
MD5可以生成任意一个文件的“数字指纹”,对文件的微小改动都会直接导致数字指纹的巨大变化。
注:MD5加密中文需要使用UTF-8编码,但Windows下默认是GBK编码,两种编码得到的结果是不一样的
加密步骤
填充
MD5中,首先要对信息进行填充,先填充一个1,后面都填充0,使得信息的长度 ,即 。为什么要求模出来是448呢?因为448=512-64,而填充完后后面还要再填上64位的原数据长度,如果超出64位则填充原数据长度的后64位,这样可以使得最终的数据长度为512的整数倍,才可以满足后面继续加密的需要。
初始化变量
初始化4个128位链接变量如下:
A = 0x67452301
B = 0xEFCDAB89
C = 0x98BADCFE
D = 0x10325476
处理数据
分组
将原始数据每512bits为一个分组 (这就是前面要求填充到512整数倍的原因),对每组分别进行处理
处理每个分组的数据
每个分组有四个变量
现在定义四个非线性函数 (逻辑运算) :
其中表示
接下来,我们设
现在定义四个操作:
注意:<<在这里是左环移而不是一般的左移!!!
左环移和左移的区别:
现有一个二进制数11010010,左环移三位后是10010110,而左移三位后是10010000
接下来就可以操作了,共4轮循环,每轮16次,伪代码如下