摘要算法:MD2
MD2是MD系列摘要算法的鼻祖,能夠接受任意長度的輸入,得到針對輸入特定的16字節(jié)(128位)輸出。輸入數(shù)據(jù)只要變化一位,輸出就會(huì)相應(yīng)變化,因此可以用于驗(yàn)證數(shù)據(jù)。盡管現(xiàn)在已經(jīng)有了更安全的摘要算法,如SHA3,但其和MD2的基本結(jié)構(gòu)都是一樣的。其計(jì)算方法為:
(1)將數(shù)據(jù)填充為16的整倍數(shù),填充值是缺失的字節(jié)數(shù)。比如“a”,其后面需要填充15個(gè)字節(jié),這15個(gè)字節(jié)的值都是0x0f。此時(shí)字節(jié)總數(shù)為N,記填充后數(shù)據(jù)為M。
(2)為這N個(gè)字節(jié)添加校驗(yàn)和。MD2根據(jù)圓周率構(gòu)建了一個(gè)256位偽隨機(jī)數(shù)組,稱為“S盒”。通過S盒計(jì)算偽碼如下:
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字節(jié)的校驗(yàn)和放在填充后的數(shù)據(jù)后面,記為M`,此時(shí)總長度為N`。
(3)初始化緩存。創(chuàng)建一個(gè)48位的輸出緩存X,并清零初始化。
(4)處理數(shù)據(jù)。
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字節(jié)取出,就是MD2值。
一個(gè)C語言實(shí)例如下: