加密算法——MD5深入學習

任意長度的輸入都輸出128位的散列值。

1 算法概述:

MD5以512位分組來處理輸入的消息,且每一分組又被劃分爲16個32位子分組,Mj表示,經過處理後,輸出由4個32位分組級聯成的128位散列值。

2 算法步驟

分組

將輸入信息M按順序每512位一組進行分組:M = M1,M2,…,Mn-1,Mn

數據填充

分爲兩次填充,第一次填充後的大小對521取餘結果爲448;第二次再加上64位(該64位負責紀錄信息的總長度),使最後一個448位也爲512位。

將信息M的“最後”一個分組Mn長度填充爲448位方法如下:

當Mn長度L(bit爲單位) < 448時,在信息Mn後加一個“1”,然後再填充若干個“0”,使最後的信息Mn長度爲448位。

當Mn長度L > 448時,在信息Mn後加一個“1”,然後再填充512-L+448個“0”,使最後的信息Mn長度爲512位,Mn+1長度爲448位

 

初始化散列值

MD5算法的中間結果和最終結果保存在128位的緩衝區中,緩衝區用4個32位的變量表示,這些變量被稱爲鏈接變量,初始化爲(16進制):

A=0x01234567

B=0x89ABCDEF

C=0xFEDCBA98

D=0x76543210

計算散列值

(1)將填充後的信息Mi認作爲一塊(Block),每塊按32位爲一組劃分成16個分組,即 Mi = Mi0,Mi2,…,Mi15,i = 1 ~ n。

(2)分別對每一塊信息進行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));

   (&是與,|是或是非,⊕是異或)

將A、B、C、D這四個變量分別複製到變量a、b、c、d中。

每一輪進行16次操作,每次操作對a、b、c、d中的三個變量作一次非線性函數運算,然後將所得的結果與第四個變量、信息的一個分組Mj和一個常數ti相加。再將所得的結果循環左移一個不定數s,並加上a、b、c、d中的一個變量。

FF(a,b,c,d,Mj,s,ti)表示a=b+((a+F(b,c,d)+Mj+ti)<<<s)
GG(a,b,c,d,Mj,s,ti)表示a=b+((a+G(b,c,d)+Mj+ti)<<<s)
HH(a,b,c,d,Mj,s,ti)表示a=b+((a+H(b,c,d)+Mj+ti)<<<s)
II(a,b,c,d,Mj,s,ti)表示a=b+((a+I(b,c,d)+Mj+ti)<<<s)

Mj表示消息的第j個子分組(從0到15),ti=232×abs sin(i)的整數部分,i=1,2,…,64,i單位是弧度。+爲模232加法,<<<s表示循環左移s位。

第一輪
a=FF(a,b,c,d,M0,7,0xd76aa478)
b=FF(d,a,b,c,M1,12,0xe8c7b756)
c=FF(c,d,a,b,M2,17,0x242070db)
d=FF(b,c,d,a,M3,22,0xc1bdceee)
a=FF(a,b,c,d,M4,7,0xf57c0faf)
b=FF(d,a,b,c,M5,12,0x4787c62a)
c=FF(c,d,a,b,M6,17,0xa8304613)
d=FF(b,c,d,a,M7,22,0xfd469501)
a=FF(a,b,c,d,M8,7,0x698098d8)
b=FF(d,a,b,c,M9,12,0x8b44f7af)
c=FF(c,d,a,b,M10,17,0xffff5bb1)
d=FF(b,c,d,a,M11,22,0x895cd7be)
a=FF(a,b,c,d,M12,7,0x6b901122)
b=FF(d,a,b,c,M13,12,0xfd987193)
c=FF(c,d,a,b,M14,17,0xa679438e)
d=FF(b,c,d,a,M15,22,0x49b40821)

第二輪
a=GG(a,b,c,d,M1,5,0xf61e2562)
b=GG(d,a,b,c,M6,9,0xc040b340)
c=GG(c,d,a,b,M11,14,0x265e5a51)
d=GG(b,c,d,a,M0,20,0xe9b6c7aa)
a=GG(a,b,c,d,M5,5,0xd62f105d)
b=GG(d,a,b,c,M10,9,0x02441453)
c=GG(c,d,a,b,M15,14,0xd8a1e681)
d=GG(b,c,d,a,M4,20,0xe7d3fbc8)
a=GG(a,b,c,d,M9,5,0x21e1cde6)
b=GG(d,a,b,c,M14,9,0xc33707d6)
c=GG(c,d,a,b,M3,14,0xf4d50d87)
d=GG(b,c,d,a,M8,20,0x455a14ed)
a=GG(a,b,c,d,M13,5,0xa9e3e905)
b=GG(d,a,b,c,M2,9,0xfcefa3f8)
c=GG(c,d,a,b,M7,14,0x676f02d9)
d=GG(b,c,d,a,M12,20,0x8d2a4c8a)

第三輪
a=HH(a,b,c,d,M5,4,0xfffa3942)
b=HH(d,a,b,c,M8,11,0x8771f681)
c=HH(c,d,a,b,M11,16,0x6d9d6122)
d=HH(b,c,d,a,M14,23,0xfde5380c)
a=HH(a,b,c,d,M1,4,0xa4beea44)
b=HH(d,a,b,c,M4,11,0x4bdecfa9)
c=HH(c,d,a,b,M7,16,0xf6bb4b60)
d=HH(b,c,d,a,M10,23,0xbebfbc70)
a=HH(a,b,c,d,M13,4,0x289b7ec6)
b=HH(d,a,b,c,M0,11,0xeaa127fa)
c=HH(c,d,a,b,M3,16,0xd4ef3085)
d=HH(b,c,d,a,M6,23,0x04881d05)
a=HH(a,b,c,d,M9,4,0xd9d4d039)
b=HH(d,a,b,c,M12,11,0xe6db99e5)
c=HH(c,d,a,b,M15,16,0x1fa27cf8)
d=HH(b,c,d,a,M2,23,0xc4ac5665)

第四輪
a=II(a,b,c,d,M0,6,0xf4292244)
b=II(d,a,b,c,M7,10,0x432aff97)
c=II(c,d,a,b,M14,15,0xab9423a7)
d=II(b,c,d,a,M5,21,0xfc93a039)
a=II(a,b,c,d,M12,6,0x655b59c3)
b=II(d,a,b,c,M3,10,0x8f0ccc92)
c=II(c,d,a,b,M10,15,0xffeff47d)
d=II(b,c,d,a,M1,21,0x85845dd1)
a=II(a,b,c,d,M8,6,0x6fa87e4f)
b=II(d,a,b,c,M15,10,0xfe2ce6e0)
c=II(c,d,a,b,M6,15,0xa3014314)
d=II(b,c,d,a,M13,21,0x4e0811a1)
a=II(a,b,c,d,M4,6,0xf7537e82)
b=II(d,a,b,c,M11,10,0xbd3af235)
c=II(c,d,a,b,M2,15,0x2ad7d2bb)
d=II(b,c,d,a,M9,21,0xeb86d391)

每輪循環後,A=a+A,B=b+B,C=c+C,D=d+D,然後作爲下一輪的初始化向量。

輸出結果

最後的輸出是 A、B、C和 D的級聯,即A作爲低位,D作爲高位。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章