MD5
MD5是一种常用的哈希算法,固定长度为128位
一、 特点
- 长度固定:无论输入多少字节,输出总是16字节(128位)
- 不可逆:从结果无法反推原始数据
- 高度离散性:输出的16字节毫无规律可言,也就是说MD5的输出结果无法预测
- 抗碰撞性:两个不同的数据产生的MD5一致的可能性极低
二、用途
- 密码保护:只记录密码的MD5,输入密码时只要校验MD5结果是否一致即可
- 文件完整性校验:传输文件时记录一次MD5结果,接收时在计算一次MD5,检查是否一致即可
- 数字签名:发布程序时同时发布其MD5,下载程序时,只需计算其MD5是否于发布的一致即可知道程序有无被篡改
- 云盘秒传:上传文件时,计算一下该文件的MD5,并在数据库中搜索改MD5是否存在,存在即可不用上传,从而实现文件秒传
三、MD5算法的实现
- 填充补位:对输入的内容进行补位,使长度变为N * 512 + 448
补位方法:先补一个1,后补若干个0
注意:补位操作必须进行,哪怕长度满足N * 512 + 448,也要补512位
ps:最后还要在后面加上64位,用来记录原始数据长度,最后信息长度会变成为512位的整数倍 - 初始值设定:初始的4个标准幻数分别为A = 01234567,B = 89ABCDEF,C = FEDCA98,D = 76543210,(在计算机中用小端存储)用循环计算初始值,最后的MD5也是这4个标准幻数经过多轮哈希的结果。
- 分组处理:把原始数据分为若干个64字节的消息块,每次只计算其中一份。然后在将64字节分为16份,每份4字节,然后调用以下函数计算:
//A,B,C,D为幻数,x为每一小份的4字节数据,S,AC为一些固定常数
//函数内部都是一些逻辑运算(与、或、非、移位等等)
FF(A, B, C, D, X, S, AC)
GG(A, B, C, D, X, S, AC)
HH(A, B, C, D, X, S, AC)
II(A, B, C, D, X, S, AC)
最后上面4个函数会被执行16次,并且每次执行时前4个参数会按照不同的顺序进行传参。
- 循环运算:经过上一操作,4个标准幻数会变得与原来完全不同,并与一开始的值相加,得到4个新的4个标准幻数。然后将这4个新的标准幻数用于第二轮计算,如此往复,直到计算完所有数据块。
最终得到的4个幻数,用16进制表示出来,就是最终的MD5结果。