MD5 算法描述

對MD5 算法的簡要敘述爲:MD5 以512 位分組來處理輸入的信息,且每一分組又
被劃分爲16 個32 位子分組,經過一系列的處理後,算法的輸出由4 個32 位分組組成,
將這4 個32 位分組級聯後將生成一個128 位的散列值。
在MD5 算法中,首先需要對信息進行填充,使其位長度對512 求餘的結果等於448。
因此,信息的位長度(Bits Length)將被擴展至N*512+448,即N*64+56 個字節(Bytes),
N 爲一個正整數。填充的方法如下:
在信息的後面填充一個1 和無數個0,直到滿足上面的條件時才停止用0 對信息的
填充。然後,在這個結果後面附加一個以64 位二進制表示的填充前信息長度。經過這
兩步的處理,現在的信息字節長度=N*512+448+64=(N+1)*512,即長度恰好是512 的整
數倍。這樣做的原因是爲了滿足後面處理中對信息長度的要求。
MD5 中有4 個32 位被稱作鏈接變量(Chaining Variable)的整數參數,它們分別爲:
A=0x01234567, B=0x89abcdef, C=0xfedcba98, D=0x76543210。
當設置好這四個鏈接變量後,就開始進入算法的四輪循環運算。循環的次數是信息
中512 位信息分組的數目。
將上面4 個鏈接變量複製到另外4 個變量中:A 到a,B 到b,C 到c,D 到d。
主循環有四輪(MD4 只有三輪),每輪循環都很相似。第一輪進行16 次操作。每次
操作對a、b、c 和d 中的三個做一次非線性函數運算,然後將所得結果依次加上第四個
變量、文本的一個子分組和一個常數。再將所得結果向右循環移動一個不定的數,並加
上a、b、c 或d 中之一。最後用該結果取代a、b、c 或d 中之一。
以下是每次操作中用到的四個非線性函數(每輪一個)。
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))
(&是與,|是或,~是非,^是異或)
這四個函數的說明:如果X、Y 和Z 的對應位是獨立和均勻的,那麼結果的每一位
也應是獨立和均勻的。F 是一個逐位運算的函數。即,如果X,那麼Y,否則Z。函數
H 是逐位奇偶操作符。
假設Mj 表示消息的第j 個子分組( 從0 到15) , FF(a,b,c,d,Mj,s,ti) 表示
a=b+((a+(F(b,c,d)+Mj+ti),GG(a,b,c,d,Mj,s,ti)表示a=b+((a+(G(b,c,d)+Mj+ti), HH(a,b,c,d,Mj,s,ti)表示
26
1
a=b+((a+(H(b,c,d)+Mj+ti),II(a,b,c,d,Mj,s,ti)表示a=b+((a+(I(b,c,d)+Mj+ti)。
這四輪(64 步)是:
第一輪
FF(a,b,c,d,M0,7,0xd76aa478)
FF(d,a,b,c,M1,12,0xe8c7b756)
FF(c,d,a,b,M2,17,0x242070db)
FF(b,c,d,a,M3,22,0xc1bdceee)
FF(a,b,c,d,M4,7,0xf57c0faf)
FF(d,a,b,c,M5,12,0x4787c62a)
FF(c,d,a,b,M6,17,0xa8304613)
FF(b,c,d,a,M7,22,0xfd469501)
FF(a,b,c,d,M8,7,0x698098d8)
FF(d,a,b,c,M9,12,0x8b44f7af)
FF(c,d,a,b,M10,17,0xffff5bb1)
FF(b,c,d,a,M11,22,0x895cd7be)
FF(a,b,c,d,M12,7,0x6b901122)
FF(d,a,b,c,M13,12,0xfd987193)
FF(c,d,a,b,M14,17,0xa679438e)
FF(b,c,d,a,M15,22,0x49b40821)
第二輪
GG(a,b,c,d,M1,5,0xf61e2562)
GG(d,a,b,c,M6,9,0xc040b340)
GG(c,d,a,b,M11,14,0x265e5a51)
GG(b,c,d,a,M0,20,0xe9b6c7aa)
GG(a,b,c,d,M5,5,0xd62f105d)
GG(d,a,b,c,M10,9,0x02441453)
GG(c,d,a,b,M15,14,0xd8a1e681)
GG(b,c,d,a,M4,20,0xe7d3fbc8)
GG(a,b,c,d,M9,5,0x21e1cde6)
GG(d,a,b,c,M14,9,0xc33707d6)
GG(c,d,a,b,M3,14,0xf4d50d87)
GG(b,c,d,a,M8,20,0x455a14ed)
GG(a,b,c,d,M13,5,0xa9e3e905)
GG(d,a,b,c,M2,9,0xfcefa3f8)
GG(c,d,a,b,M7,14,0x676f02d9)
GG(b,c,d,a,M12,20,0x8d2a4c8a)
第1 章全面剖析網絡爬蟲
27
第三輪
HH(a,b,c,d,M5,4,0xfffa3942)
HH(d,a,b,c,M8,11,0x8771f681)
HH(c,d,a,b,M11,16,0x6d9d6122)
HH(b,c,d,a,M14,23,0xfde5380c)
HH(a,b,c,d,M1,4,0xa4beea44)
HH(d,a,b,c,M4,11,0x4bdecfa9)
HH(c,d,a,b,M7,16,0xf6bb4b60)
HH(b,c,d,a,M10,23,0xbebfbc70)
HH(a,b,c,d,M13,4,0x289b7ec6)
HH(d,a,b,c,M0,11,0xeaa127fa)
HH(c,d,a,b,M3,16,0xd4ef3085)
HH(b,c,d,a,M6,23,0x04881d05)
HH(a,b,c,d,M9,4,0xd9d4d039)
HH(d,a,b,c,M12,11,0xe6db99e5)
HH(c,d,a,b,M15,16,0x1fa27cf8)
HH(b,c,d,a,M2,23,0xc4ac5665)
第四輪
II(a,b,c,d,M0,6,0xf4292244)
II(d,a,b,c,M7,10,0x432aff97)
II(c,d,a,b,M14,15,0xab9423a7)
II(b,c,d,a,M5,21,0xfc93a039)
II(a,b,c,d,M12,6,0x655b59c3)
II(d,a,b,c,M3,10,0x8f0ccc92)
II(c,d,a,b,M10,15,0xffeff47d)
II(b,c,d,a,M1,21,0x85845dd1)
II(a,b,c,d,M8,6,0x6fa87e4f)
II(d,a,b,c,M15,10,0xfe2ce6e0)
II(c,d,a,b,M6,15,0xa3014314)
II(b,c,d,a,M13,21,0x4e0811a1)
II(a,b,c,d,M4,6,0xf7537e82)
II(d,a,b,c,M11,10,0xbd3af235)
II(c,d,a,b,M2,15,0x2ad7d2bb)
II(b,c,d,a,M9,21,0xeb86d391)
常數ti 可以如下選擇:
在第i 步中,ti 是4294967296*abs(sin(i))的整數部分,i 的單位是弧度(4294967296
等於2 的32 次方)。
所有這些都完成之後,將A、B、C、D 分別加上a、b、c、d。然後用下一分組數據
繼續運行算法,最後的輸出是A、B、C 和D 的級聯。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章