壹.概述
MD5的全稱是message-digest algorithm 5,由麻省理工學院計算機科學實驗室和rsa data security inc的ronald l. rivest在90年代初開發,由md2、md3和md4開發。其作用是在用數字簽名軟件簽署私鑰之前,將大容量的信息“壓縮”成安全的格式(即將任意長度的字節串轉換成壹定長度的大整數)。無論是md2、md4還是md5,都需要得到壹個隨機長度的信息,生成壹個128位的信息摘要。雖然這些算法的結構或多或少有些相似,但md2的設計與md4和md5完全不同,因為md2是為8位機優化的,而md4和md5是為32位機設計的。互聯網rfcs 1321(http://www . IETF . org/RFC/RFC 1321 . txt)中詳細描述了這三種算法的描述和C語言源代碼,這是ronald l. rivest於1992年8月向ieft提交的最權威的文檔。
Rivest在1989開發了md2算法。在這個算法中,首先用數據補充信息,使信息的字節長度是16的倍數。然後,16位校驗和被附加到消息的末尾。並基於這個新生成的信息計算哈希值。後來,rogier和chauvaud發現,如果忽略校驗和,就會發生md2沖突。md2算法的加密結果是唯壹的,沒有重復。
為了加強算法的安全性,rivest在1990中開發了md4算法。md4算法還需要填充信息,保證信息的字節長度加448後能被512整除(信息字節長度mod 512 = 448)。然後,添加64位二進制消息的初始長度。信息處理成512位damg?rd/merkle叠代結構的塊,每個塊都要經過三個不同的步驟。Den boer、bosselaers和其他人很快發現了攻擊md4版本中第壹步和第三步的漏洞。Dobbertin向您展示了如何使用壹臺普通的個人電腦在幾分鐘內找到完整版md4中的沖突(這種沖突實際上是壹個漏洞,會導致不同內容的加密但可能得到相同的加密結果)。毫無疑問,md4已經被淘汰了。
md4算法的安全性雖然有這麽大的漏洞,但是對後來發展起來的幾個信息安全加密算法的出現起到了重要的指導作用。除了md5,還有sha-1,ripe-md,哈弗等。
壹年後,也就是1991年,rivest開發出了技術上更成熟的md5算法。它在md4的基礎上增加了“安全帶”的概念。雖然md5比md4稍慢,但它更安全。該算法顯然由四個步驟組成,與md4設計略有不同。在md5算法中,信息摘要的大小和填充的必要條件與md4完全相同。Den boer和bosselaers曾經發現了md5算法中的偽碰撞,但是沒有其他發現的加密結果。
Van oorschot和wiener曾經考慮過壹個暴力哈希函數來搜索哈希中的沖突,他們猜測壹個專門設計來搜索md5沖突的機器(這個機器的制造成本在1994年大約是壹百萬美元)平均每24天就可以發現壹個沖突。但是在1991到2001的10年中,並沒有出現新的算法叫md6來代替md5,所以我們可以看到這個缺陷並沒有對md5的安全性造成太大的影響。以上都不足以成為md5實際應用中的問題。而且,由於使用md5算法不需要支付任何版權費用,所以在壹般情況下(非絕密應用領域。但即使用在絕密領域,md5也是壹種優秀的中間技術),md5在任何情況下都應該被認為是非常安全的。
二、算法的應用
md5的典型應用是為壹條消息生成消息摘要,以防止它被篡改。比如在unix下,很多軟件在下載時都有壹個文件名相同,文件擴展名為. md5的文件。在這個文件中,通常只有壹行文本,壹般結構如下:
MD5(tanajiya.tar.gz)= 0ca 175 b 9 c 0 f 726 a 831d 895 e 269332461
這是tanajiya.tar.gz文檔的數字簽名。Md5將整個文件視為壹個大的文本消息,通過其不可逆的字符串變換算法,生成這個唯壹的md5消息摘要。如果以後在傳播這個文件的過程中,無論文件的內容發生了什麽變化(包括人為修改或者下載時線路不穩定導致的傳輸錯誤等。),只要重新計算壹下這個文件的md5,就會發現信息匯總是不壹樣的,所以可以確定妳得到的只是壹個不正確的文件。如果有第三方認證機構,md5還可以防止文檔作者的“否認”,也就是所謂的數字簽名應用。
Md5也廣泛應用於加密和解密技術。例如,在unix系統中,用戶的密碼通過md5(或其他類似的計算方法)加密,並存儲在文件系統中。當用戶登錄時,系統將用戶輸入的密碼計算為md5值,然後與文件系統中保存的md5值進行比較,以確定輸入的密碼是否正確。通過這樣的步驟,系統可以在不知道用戶密碼明碼的情況下,確定用戶登錄系統的合法性。這樣既可以防止用戶的密碼被擁有系統管理員權限的用戶知道,也在壹定程度上增加了密碼破解的難度。
正是因為這個原因,黑客破譯密碼最常用的方法之壹就是壹種叫做“潤子典”的方法。字典的獲取方式有兩種,壹種是日常收集的用作密碼的字符串表,另壹種是通過排列組合的方法生成的。首先用md5程序計算這些字典項的md5值,然後在這個字典中查找目標的md5值。我們假設密碼最大長度為8個字節,密碼只能是字母和數字,***26+26+10=62個字符,字典中的條目數為p (62,1)+p (62,2)...+p (62)。這種加密技術在unix系統中被廣泛使用,這也是unix系統比壹般操作系統更健壯的重要原因。
三、算法描述
對md5算法的簡單描述可以如下:md5對512位包中的輸入信息進行處理,每個包被分成16個32位包。經過壹系列的處理後,算法的輸出由四個32位的包組成,將這四個32位的包串聯起來將會生成壹個128位的哈希值。
md5算法中,首先需要填充信息,這樣512字節長度的結果等於448。因此,信息的比特長度將擴展到n*512+448,即n*64+56字節,其中n是正整數。填充的方法如下:在信息後面填充壹個1和無數個零,直到滿足上述條件才停止用零填充信息。然後,在該結果之後,附加以64位二進制表示的預填充信息長度。經過這兩步,當前信息字長= n * 512+448+64 =(n+1)* 512,即長度正好是512的整數倍。這樣做的原因是為了滿足後期處理中對信息長度的要求。
md5中有四個32位整數參數稱為chaining變量,分別是:a=0x01234567,b=0x89abcdef,c = 0xxfedcba98,d=0x76543210。
當這四個鏈接變量被設置時,算法開始進入四輪循環操作。循環數是信息中512比特信息包的數目。
將上述四個鏈接變量復制到另外四個變量中: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 & amp;y)|((~ x)& amp;z)
g(x,y,z)=(x & amp;z)|(y & amp;(~z))
=x^y^z(x,y,z)
i(x,y,z)=y^(x|(~z))
(& amp是和|是或~是或否,異或)
這四個函數的解釋:如果X,Y,Z對應的位是獨立且壹致的,那麽結果的每壹位也應該是獨立且壹致的。
f是位運算的函數。即,如果x,則y,否則z。函數h是按位奇偶運算符。
假設mj表示消息的第j個子分組(從0到15),
& lt& ltFf(a,b,c,d,mj,s,ti)表示a=b+((a+(f(b,c,d)+mj+ti))。
& lt& ltGg(a,b,c,d,mj,s,ti)表示a=b+((a+(g(b,c,d)+mj+ti))。
& lt& ltHh(a,b,c,d,mj,s,ti)表示a=b+((a+(h(b,c,d)+mj+ti))。
& lt& ltIi(a,b,c,d,mj,s,ti)表示a=b+((a+(i(b,c,d)+mj+ti))
& lt& lt這四輪(64步)是:
第壹輪
ff(a,b,c,d,m0,7,0x d 76 a 478)
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,0x befbc 70)
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)
第四輪
二(a,b,c,d,m0,6,0xf4292244)
二(d,a,b,c,m7,10,0x 432 af 97)
二(c,d,a,b,m14,15,0xab9423a7)
二(b,c,d,a,m5,21,0xfc93a039)
二(a,b,c,d,m12,6,0x655b59c3)
二(d,a,b,c,m3,10,0x8f0ccc92)
二(c,d,a,b,m10,15,0xffeff47d)
二(b,c,d,a,m1,21,0x85845dd1)
二(a,b,c,d,m8,6,0x6fa87e4f)
二(d,a,b,c,m15,10,0xfe2ce6e0)
二(c、d、a、b、m6,15,0xa3014314)
二(b,c,d,a,m13,21,0x4e0811a1)
二(a、b、c、d、m4、6、0xf7537e82)
二(d,a,b,c,m11,10,0xbd3af235)
二(丙,丁,甲,乙,平方米,15,0x2ad7d2bb)
二(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的級聯..
當妳按照我上面提到的方法實現md5算法的時候,妳可以用下面的信息對妳的程序做壹個簡單的測試,看看程序有沒有錯誤。
MD5(" " = d 41 D8 CD 98 f 00 b 204 e 9800998 ECF 8427 e
MD5(" a ")= 0cc 175 B9 c0f 1b6a 831c 399 e 269772661
MD5(" ABC ")= 900150983 CD 24 FB 0d 6963 f 7d 28 e 17f 72
md5("消息摘要")= f96b 697 D7 CB 7938d 525 a2 f 31 AAF 161 d0
MD5(" abcdefghijklmnopqrstuvwxyz ")= C3 fcd 3d 76192 e 4007 DFB 496 CCA 67 e 13b
MD5(" abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz 0123456789 ")= d 174 ab 98d 277d 9 F5 a 5611c2c 9 f 419d 9 f
MD5(" 1234567890123456789012345678901234567890123456789012345678901234567890123456789016789065438
如果妳用上面的信息去測試妳做過的md5算法的例子,最後的結論和標準答案完全壹樣,那麽我在這裏要說恭喜妳了。要知道,我的程序第壹次編譯成功的時候並沒有得到和上面壹樣的結果。
第四,MD5的安全性
md5對md4的改進:
1.增加了第四輪;
2.每壹步都有唯壹的加法常數;
3.為了在第二輪中削弱函數G的對稱性,函數G由(x & amp;y)|(x & amp;z)|(y & amp;z)變成了(x & amp;z)|(y & amp;(~ z));
4.第壹步加上上壹步的結果,會造成更快的雪崩效應;
5.改變了第二輪和第三輪訪問消息子包的順序,使它們更加不同;
6.每輪循環左移的位移近似優化,以達到更快的雪崩效應。每個車輪的位移彼此不同。