MD5加密算法解析

MD5加密算法的全稱是Message-Digest Algorithm 5,在90年代初由MIT的計算機科學實驗室和RSA Data Security Inc發(fā)明,經(jīng)MD2、MD3和MD4加密算法發(fā)展而來。

MD5加密算法將任意長度的“字節(jié)串”變換成一個128bit的大整數(shù),并且它是一個不可逆的字符串變換算法,換句話說就是,即使你看到源程序和算法描述,也無法將一個MD5值變換回原始的字符串,從數(shù)學原理上說,是因為原始的字符串有無窮多個,這有點象不存在反函數(shù)的數(shù)學函數(shù)。

MD5加密算法的典型應用之數(shù)字簽名

MD5的典型應用是對一段Message(字節(jié)串)產(chǎn)生fingerprint(指紋),以防止被“篡改”。舉個例子,你將一段話寫在一個叫 readme.txt文件中,并對這個readme.txt產(chǎn)生一個MD5的值并記錄在案,然后你可以傳播這個文件給別人,別人如果修改了文件中的任何內(nèi)容,你對這個文件重新計算MD5時就會發(fā)現(xiàn)。如果再有一個第三方的認證機構(gòu),用MD5還可以防止文件作者的“抵賴”,這就是所謂的數(shù)字簽名應用。

MD5加密算法的典型應用之存儲用戶密碼

MD5還廣泛用于加密和解密技術上,在很多系統(tǒng)中的用戶密碼是以MD5值(或類似的其它算法)的方式保存的, 用戶登錄系統(tǒng)時,系統(tǒng)是把用戶輸入的密碼計算成MD5值,然后再去和系統(tǒng)中保存的MD5值進行比較,而系統(tǒng)并不“知道”用戶的密碼是什么。

MD5加密算法解析

在一些初始化處理后,MD5以512位分組來處理輸入文本,每一分組又劃分為16個32位子分組。算法的輸出由四個32位分組組成,將它們級聯(lián)形成一個128位散列值。

首先填充消息使其長度恰好為一個比512位的倍數(shù)僅小64位的數(shù)。填充方法是附一個1在消息后面,后接所要求的多個0,然后在其后附上64位的消息長度(填充前)。這兩步的作用是使消息長度恰好是512位的整數(shù)倍(算法的其余部分要求如此),同時確保不同的消息在填充后不相同。

四個32位變量初始化為:
A=0x01234567
B=0x89abcdef
C=0xfedcba98
D=0x76543210

它們稱為鏈接變量(chaining variable)

接著進行算法的主循環(huán),循環(huán)的次數(shù)是消息中512位消息分組的數(shù)目。

將上面四個變量復制到別外的變量中:A到a,B到b,C到c,D到d。

主循環(huán)有四輪(MD4只有三輪),每輪很相擬。第一輪進行16次操作。每次操作對a,b,c和d中的其中三個作一次非線性函數(shù)運算,然后將所得結(jié)果加上第四個變量,文本的一個子分組和一個常數(shù)。再將所得結(jié)果向右環(huán)移一個不定的數(shù),并加上a,b,c或d中之一。

最后用該結(jié)果取代a,b,c或d中之一。

以下是每次操作中用到的四個非線性函數(shù)(每輪一個)。
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))

(&是與,|是或,~是非,^是異或)

這些函數(shù)是這樣設計的:如果X、Y和Z的對應位是獨立和均勻的,那么結(jié)果的每一位也應是獨立和均勻的。

函數(shù)F是按逐位方式操作:如果X,那么Y,否則Z。函數(shù)H是逐位奇偶操作符。

設Mj表示消息的第j個子分組(從0到15),<<< s表示循環(huán)左移s位,則四種操作為:
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)

這四輪(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)

第三輪
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)

常數(shù)ti可以如下選擇:

在第i步中,ti是4294967296*abs(sin(i))的整數(shù)部分,i的單位是弧度。 (2的32次方)所有這些完成之后,將A,B,C,D分別加上a,b,c,d。然后用下一分組數(shù)據(jù)繼續(xù)運行算法,最后的輸出是A,B,C和D的級聯(lián)。

MD5加密算法的安全性

MD5相對MD4所作的改進:

1.增加了第四輪.
2.每一步均有唯一的加法常數(shù).
3.為減弱第二輪中函數(shù)G的對稱性從(X&Y)|(X&Z)|(Y&Z)變?yōu)?X&Z)|(Y&(~Z))
4.第一步加上了上一步的結(jié)果,這將引起更快的雪崩效應.
5.改變了第二輪和第三輪中訪問消息子分組的次序,使其更不相似.
6.近似優(yōu)化了每一輪中的循環(huán)左移位移量以實現(xiàn)更快的雪崩效應.各輪的位移量互不相同.