哈希函数
是一种将任意输入长度转变为固定输出长度的函数。
一些常见哈希函数有:MD5、SHA1、SHA256。
MD5算法
MD5算法是一种消息摘要算法,用于消息认证。
数据存储方式:小段存储。
数据填充
首先对我们明文数据进行处理,使其比特位数模512余448,如果明文数据已经满足这个条件就再填充512比特。这里每512比特即64字节是分组长度,最后一个分组留64位用来存储初始数据长度。
这里的数据填充方式是先补一个1,后面全都补0,使得长度满足模512余448。
然后附加64位8字节的初始数据长度,这里也是小端序存储。
初始化寄存器
这里用到四个32位的寄存器,他们的内容是:
A=01234567
B=89ABCDEF
C=FEDCBA98
D=76543210
由于小端存储他们实际在内存中的值为:
A=0x67452301
B=0xEFCDAB89
C=0x98BADCFE
D=0x10325476
数据分组
把明文数据进行分组,每512比特64字节为一组,组还要进行分块,分为M1~M16的16块,每块32位4字节。
MD5Transform
接下来就进行计算了,首先根据下图介绍下计算过程中用到的相关的参数。
首先是图中上方四个初始化变量A、B、C、D,经过一次计算后得到下面的A、B、C、D,而从图中可以看出,只有A参与了计算结果赋值给了B,而其他的B直接赋值给了C,C直接赋值给了D,D直接赋值给了A,这样的计算在MD5中一共要经过四轮,一轮16次,共64次,每次更新一个变量,循环4次,这四个变量就都更新一次,每个变量在这个过程中更新16次。如果填充后的铭文数据只有一组512位,那么把MD5Transform得到的结果加上他们在计算前的值,然后拼接在一起,就是其MD5值。这里要注意的是内存中的数据是以小端序存储的。
MD5Transform过程分析
图中红色的田代表相加的意思,F是函数,这里不是代表一个函数,而是代表一类函数,Mi对应明文数据分块后的值,Ki对应的是一个K表,这个表里记录的是经过计算后得到的常量值。<<<s代表循环左移s位,s也是有固定的几个值。
对于A的计算可以通过一个公式来表示:B=(A+F+Mi+Ki)<<s+B。
先分析到这里,后续结合源码继续分析。