MD5 算法簡介

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

MD5 將任意長度的“字節(jié)串”變換成一個(gè) 128bit 的大整數(shù),并且它是一個(gè)不可逆的字符串變換算法,換句話說就是,即使你看到源程序和算法描述,也無法將一個(gè) MD5 的值變換回原始的字符串,從數(shù)學(xué)原理上說,是因?yàn)樵嫉淖址袩o窮多個(gè),這有點(diǎn)象不存在反函數(shù)的數(shù)學(xué)函數(shù)。

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

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


一、MD5?算法


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

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

四個(gè)32位變量初始化為:

??? A=0x01234567

??? B=0x89abcdef

??? C=0xfedcba98

??? D=0x76543210

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


接著進(jìn)行算法的主循環(huán),循環(huán)的次數(shù)是消息中 512 位消息分組的數(shù)目。主循環(huán)有四輪(MD4 只有三輪),每輪很相擬。將上面四個(gè)變量復(fù)制到別外的變量中:A 到 a,B 到 b,C 到 c,D 到 d。

第一輪進(jìn)行 16 次操作。每次操作對 a,b,c 和 d 中的其中三個(gè)作一次非線性函數(shù)運(yùn)算,然后將所得結(jié)果加上第四個(gè)變量,文本的一個(gè)子分組和一個(gè)常數(shù)。再將所得結(jié)果向右環(huán)移一個(gè)不定的數(shù),并加上 a,b,c 或 d 中之一。最后用該結(jié)果取代 a,b,c 或 d 中之一。


以下是每次操作中用到的四個(gè)非線性函數(shù)(每輪一個(gè))。

??? 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ù)是這樣設(shè)計(jì)的:如果 X、Y 和 Z 的對應(yīng)位是獨(dú)立和均勻的,那么結(jié)果的每一位也應(yīng)是獨(dú)立和均勻的。

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

函數(shù) H 是逐位奇偶操作符。


設(shè) Mj 表示消息的第 j 個(gè)子分組(從 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ù)運(yùn)行算法,最后的輸出是 A,B,C 和 D 的級聯(lián)。


二、MD5 的安全性


MD5 相對 MD4 所作的改進(jìn):

增加了第四輪

每一步均有唯一的加法常數(shù)

為減弱第二輪中函數(shù) G 的對稱性,從 (X&Y)|(X&Z)|(Y&Z) 變?yōu)?(X&Z)|(Y&(~Z))

第一步加上了上一步的結(jié)果,這將引起更快的雪崩效應(yīng)

改變了第二輪和第三輪中訪問消息子分組的次序,使其更不相似

近似優(yōu)化了每一輪中的循環(huán)左移位移量以實(shí)現(xiàn)更快的雪崩效應(yīng),各輪的位移量互不相同


2004 年 8 月,在國際密碼大會(huì)上,中國的王小云教授首次宣布了她及她的研究小組的研究成果:對 MD5、HAVAL-128、MD4 和 RIPEMD 等四個(gè)著名密碼算法的破譯結(jié)果。宣告了固若金湯的世界通行密碼標(biāo)準(zhǔn) MD5 大廈轟然倒塌,引發(fā)了密碼學(xué)界的軒然大波。事實(shí)上,在 MD5 被王小云為代表的中國專家破譯之后,世界密碼學(xué)界仍然認(rèn)為 SHA-1 是安全的。而僅僅在一周之后,王小云就宣布了破譯 SHA-1 的消息。因?yàn)?SHA-1 在美國等國家有更加廣泛的應(yīng)用,密碼被破的消息一出,在國際社會(huì)的反響可謂石破天驚。換句話說,王小云的研究成果表明了從理論上講電子簽名可以偽造,必須及時(shí)添加限制條件,或者重新選用更為安全的密碼標(biāo)準(zhǔn),以保證電子商務(wù)的安全。


國際密碼學(xué)家 Lenstra 利用王小云提供的 MD5 碰撞,偽造了符合?X.509標(biāo)準(zhǔn)?的數(shù)字證書,這就說明了 MD5 的破譯已經(jīng)不僅僅是理論破譯結(jié)果,而是可以導(dǎo)致實(shí)際的攻擊,MD5 的撤出已迫在眉睫。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容