摘要算法:MD2
MD2是MD系列摘要算法的鼻祖,能够接受任意长度的输入,得到针对输入特定的16字节(128位)输出。输入数据只要变化一位,输出就会相应变化,因此可以用于验证数据。尽管现在已经有了更安全的摘要算法,如SHA3,但其和MD2的基本结构都是一样的。其计算方法为:
(1)将数据填充为16的整倍数,填充值是缺失的字节数。比如“a”,其后面需要填充15个字节,这15个字节的值都是0x0f。此时字节总数为N,记填充后数据为M。
(2)为这N个字节添加校验和。MD2根据圆周率构建了一个256位伪随机数组,称为“S盒”。通过S盒计算伪码如下:
checksum[16];
For i = 0 to 15 do
checksum[i] = 0;
End; // 初始化
L = 0;
For i = 0 to (N / 16 - 1) do
For j = 0 to 15 do
c_tmp = M[i * 16 + j];
checksum[j] = checksum[j] ^ S[c_tmp ^ L];
L = checksum[j];
End; // j
End; // I
然后把这16字节的校验和放在填充后的数据后面,记为M`,此时总长度为N`。
(3)初始化缓存。创建一个48位的输出缓存X,并清零初始化。
(4)处理数据。
For i = 0 to (N` / 16 – 1) do
For j = 0 to 15 do
X[16 + j] = M`[i * 16 + j];
X[32 + j] = X[16 + j] ^ X[j];
End;
t = 0;
For j = 0 to 17 do
For k = 0 to 47 do
t = X[k] = X[k] ^ S[t];
End;
t = (t + j) % 256;
End;
End;
(5)最后把前16字节取出,就是MD2值。
一个C语言实例如下: