算法輸入是一個(gè)字節(jié)串,每個(gè)字節(jié)是8個(gè)bit.
算法的執(zhí)行分為以下幾個(gè)步驟:
第一步,補(bǔ)位:
MD5算法先對輸入的數(shù)據(jù)進(jìn)行補(bǔ)位,使得數(shù)據(jù)的長度(以byte為單位)對64求余的結(jié)果是56。
即數(shù)據(jù)擴(kuò)展至LEN=K*64+56個(gè)字節(jié),K為整數(shù)。
補(bǔ)位方法:補(bǔ)一個(gè)1,然后補(bǔ)0至滿足上述要求。相當(dāng)于補(bǔ)一個(gè)0x80的字節(jié),再補(bǔ)值
為0的字節(jié)。這一步里總共補(bǔ)充的字節(jié)數(shù)為0~63個(gè)。
第二步,附加數(shù)據(jù)長度:
用一個(gè)64位的整數(shù)表示數(shù)據(jù)的原始長度(以bit為單位),將這個(gè)數(shù)字的8個(gè)字節(jié)按低位的在前,
高位在后的順序附加在補(bǔ)位后的數(shù)據(jù)后面。這時(shí),數(shù)據(jù)被填補(bǔ)后的總長度為:
LEN = K*64+56+8=(K+1)*64 Bytes。
※注意那個(gè)64位整數(shù)是輸入數(shù)據(jù)的原始長度而不是填充字節(jié)后的長度,我就在這里栽了跟頭.
第三步,初始化MD5參數(shù):
有四個(gè)32位整數(shù)變量 (A,B,C,D) 用來計(jì)算信息摘要,每一個(gè)變量被初始化成以下
以十六進(jìn)制數(shù)表示的數(shù)值,低位的字節(jié)在前面。
word A: 01 23 45 67
word B: 89 ab cd ef
word C: fe dc ba 98
word D: 76 54 32 10
※注意低位的字節(jié)在前面指的是Little Endian平臺(tái)上內(nèi)存中字節(jié)的排列方式,
而在程序中書寫時(shí),要寫成:
A=0x67452301
B=0xefcdab89
C=0x98badcfe
D=0x10325476
第四步,定義四個(gè)MD5基本的按位操作函數(shù):
X,Y,Z為32位整數(shù)。
F(X,Y,Z) = (X and Y) or (not(X) and Z)
G(X,Y,Z) = (X and Z) or (Y and not(Z))
H(X,Y,Z) = X xor Y xor Z
I(X,Y,Z) = Y xor (X or not(Z))
再定義四個(gè)分別用于四輪變換的函數(shù)。
設(shè)Mj表示消息的第j個(gè)子分組(從0到15),<<