MD5消息摘要算法(Message-Digest Algorithm)。它对输入的任意长度的消息进行运算,产生一个128位的消息摘要。
算法原理
- 数据填充
填充消息使其长度与448模512同余(长度=448 mod 512),即时消息长度本身已经满足了上述长度要求也需要填充。
填充方法:附一个1在消息后面,然后用0填充,直至符合长度要求(长度=448 mod 512)。 - 添加长度
在上一步结果之后添加64位的消息长度。如果消息长度大于264,则只使用其低64位。最终消息长度正好是512的整数倍。 - 初始化变量
用4个变量(A、B、C、D)计算消息摘要。A、B、C、D都是32位寄存器。这些寄存器以下面的16进制数来初始化:
A=01234567h ,B=89abcdefh , C=fedcba98h , D=76543210h - 数据处理
以512位分组为单位,进行处理消息。首先定义4个辅助函数,每个都是以3个32位双字作为输入,输出1个32位双字。
4个函数:
F(X,Y,Z)=(X & Y) | ((~X) & Z);
G(X,Y,Z)=(X & Z) | (Y & (~Z));
H(X,Y,Z)=X ^ Y ^ Z;
I(X,Y,Z)=Y ^ (X | (~Z));
"&“是与操作,”|“是或操作,”~“是非操作,”^"是异或操作。
这4轮变换是对进入主循环的512位消息分组的16个32位字分别进行如下操作:将A、B、C、D的副本a、b、c、d中的3个经F、G、H、I运算后的结果与第4个相加,再加上32位字和一个32位字的加法常数,并将所得之值循环左移若干位,最后将所得结果加上a、b、c、d之一,并回送至ABCD,由此完成一次循环。
所用的加法常数由这样一张表T[i]来定义,其中i为1…64,T[i]等于4294967296乘以abs(sin(i))的整数部分,这样做是为了通过正弦函数和幂函数来进一步消除变换中的线性。
512位分组运算完毕后,A、B、C、D的级联被输出为MD5散列的结果。