MD5加密 - 不可逆的加密算法
MD5是一種不可逆的加密算法,md5的全稱是message-digest algorithm 5.在90年代初由mit laboratory for computer science和rsa data security inc的ronald l. rivest開發(fā)出來,經(jīng)md2、md3和md4發(fā)展而來。它的作用是讓大容量信息在用數(shù)字簽名軟件簽署私人密匙前被"壓縮"成一種保密的格式(就是把一個(gè)任意長度的字節(jié)串變換成一定長的大整數(shù))。
保密格式
MD5是讓大容量信息在用數(shù)字簽名軟件簽署私人密匙前被"壓縮"成一種保密的格式(就是把一個(gè)任意長度的字節(jié)串變換成一定長的大整數(shù))。不管是MD2、MD4還是MD5,它們都需要獲得一個(gè)隨機(jī)長度的信息并產(chǎn)生一個(gè)128位的信息摘要。雖然這些算法的結(jié)構(gòu)或多或少有些相似,但MD2的設(shè)計(jì)與MD4和MD5完全不同,那是因?yàn)镸D2是為8位機(jī)器做過設(shè)計(jì)優(yōu)化的,而MD4和MD5卻是面向32位的電腦。這三個(gè)算法的描述和C語言源代碼在Internet RFCs 1321中有詳細(xì)的描述,這是一份最權(quán)威的文檔,由Ronald L. Rivest在1992年8月向IETF提交。
MD2
Rivest在1989年開發(fā)出MD2算法。在這個(gè)算法中,首先對(duì)信息進(jìn)行數(shù)據(jù)補(bǔ)位,使信息的字節(jié)長度是16的倍數(shù)。然后,以一個(gè)16位的檢驗(yàn)和追加到信息末尾。并且根據(jù)這個(gè)新產(chǎn)生的信息計(jì)算出散列值。后來,Rogier和Chauvaud發(fā)現(xiàn)如果忽略了檢驗(yàn)和將產(chǎn)生MD2沖突。MD2算法的加密后結(jié)果是唯一的–即沒有重復(fù)。
MD4
為了加強(qiáng)算法的安全性,Rivest在1990年又開發(fā)出MD4算法。MD4算法同樣需要填補(bǔ)信息以確保信息的字節(jié)長度加上448后能被512整除(信息字節(jié)長度mod 512 = 448)。然后,一個(gè)以64位二進(jìn)制表示的信息的最初長度被添加進(jìn)來。信息被處理成512位Damg?rd/Merkle迭代結(jié)構(gòu)的區(qū)塊,而且每個(gè)區(qū)塊要通過三個(gè)不同步驟的處理。Den Boer和Bosselaers以及其他人很快的發(fā)現(xiàn)了攻擊MD4版本中第一步和第三步的漏洞。Dobbertin向大家演示了如何利用一部普通的個(gè)人電腦在幾分鐘內(nèi)找到MD4完整版本中的沖突(這個(gè)沖突實(shí)際上是一種漏洞,它將導(dǎo)致對(duì)不同的內(nèi)容進(jìn)行加密卻可能得到相同的加密后結(jié)果)。毫無疑問,MD4就此被淘汰掉了。
盡管MD4算法在安全上有個(gè)這么大的漏洞,但它對(duì)在其后才被開發(fā)出來的好幾種信息安全加密算法的出現(xiàn)卻有著不可忽視的引導(dǎo)作用。除了MD5以外,其中比較有名的還有SHA-1、RIPE-MD以及HAVAL等。
MD5
一年以后,即1991年,Rivest開發(fā)出技術(shù)上更為趨近成熟的MD5算法。它在MD4的基礎(chǔ)上增加了"安全-帶子"(Safety-Belts)的概念。雖然MD5比MD4稍微慢一些,但卻更為安全。這個(gè)算法很明顯的由四個(gè)和MD4設(shè)計(jì)有少許不同的步驟組成。在MD5算法中,信息-摘要的大小和填充的必要條件與MD4完全相同。Den Boer和Bosselaers曾發(fā)現(xiàn)MD5算法中的假?zèng)_突(Pseudo-Collisions),但除此之外就沒有其他被發(fā)現(xiàn)的加密后結(jié)果了。
Van Oorschot和Wiener曾經(jīng)考慮過一個(gè)在散列中暴力搜尋沖突的函數(shù)(Brute-Force Hash Function),而且他們猜測一個(gè)被設(shè)計(jì)專門用來搜索MD5沖突的機(jī)器(這臺(tái)機(jī)器在1994年的制造成本大約是一百萬美元)可以平均每24天就找到一個(gè)沖突。但單從1991年到2001年這10年間,竟沒有出現(xiàn)替代MD5算法的MD6或被叫做其他什么名字的新算法這一點(diǎn),我們就可以看出這個(gè)瑕疵并沒有太多的影響MD5的安全性。上面所有這些都不足以成為MD5的在實(shí)際應(yīng)用中的問題。并且,由于MD5算法的使用不需要支付任何版權(quán)費(fèi)用的,所以在一般的情況下(非絕密應(yīng)用領(lǐng)域。但即便是應(yīng)用在絕密領(lǐng)域內(nèi),MD5也不失為一種非常優(yōu)秀的中間技術(shù)),MD5怎么都應(yīng)該算得上是非常安全的了。
在一些初始化處理后,MD5以512位分組來處理輸入文本,每一分組又劃分為16個(gè)32位子分組。算法的輸出由四個(gè)32位分組組成,將它們級(jí)聯(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ù)目。
將上面四個(gè)變量復(fù)制到另外的變量中:A到a,B到b,C到c,D到d。
主循環(huán)有四輪(MD4只有三輪),每輪很相似。第一輪進(jìn)行16次操作。每次操作對(duì)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中之一。
函數(shù)設(shè)計(jì)
以下是每次操作中用到的四個(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的對(duì)應(yīng)位是獨(dú)立和均勻的,那么結(jié)果的每一位也應(yīng)是獨(dú)立和均勻的。
函數(shù)F是按逐位方式操作:如果X,那么Y,否則Z。函數(shù)H是逐位奇偶操作符。
四輪操作
設(shè)Mj表示消息的第j個(gè)子分組(從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表示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,0×02441453
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的級(jí)聯(lián)。
