壹。概述
MD5的全稱是message-digest algorithm 5,由麻省理工學院計算機科學實驗室和rsa數據安全公司的ronald l. rivest在20世紀90年代初開發,並由md2、md3和md4開發。其作用是在用數字簽名軟件簽署私鑰之前,將大容量信息“壓縮”成安全格式(即把任意長度的字節串轉換成壹定長度的大整數)。無論是md2、md4還是md5,它們都需要獲得隨機長度的信息並生成128位的信息摘要。盡管這些算法的結構或多或少有些相似,但md2的設計與md4和md5完全不同,因為md2是為8位計算機優化的,而md4和md5是為32位計算機設計的。internet 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年約為100萬美元)平均每24天就能發現壹次沖突。但是,在從1991到2001的10年中,沒有出現名為md6的新算法來代替md5,因此我們可以看到這個缺陷並沒有對md5的安全性產生太大影響。在md5的實際應用中,上述這些都不足以成為問題。而且,由於使用md5算法不需要支付任何版權費用,所以在壹般情況下(非絕密應用領域。但即使用於絕密領域,md5也是壹種優秀的中間技術),無論如何md5都應該被認為是非常安全的。
二、算法的應用
md5的典型應用是為壹條消息生成消息摘要,以防止其被篡改。例如,在unix下,許多軟件在下載時都有壹個文件名相同且文件擴展名為。md5的文件。在這個文件中,通常只有壹行文本,壹般結構如下:
MD5(tanajiya.tar.gz)= 0ca 175 B9 c0f 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位整數參數稱為鏈接變量,它們是: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 & ampz)|(y & amp;(~z)
h(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,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,m 116,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,0x 289 b7c 6)
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)
二(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)
ii(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)
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的級聯..
當您根據我上面提到的方法實現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 fb0d 6963 f 7d 28e 17f 72
md5(“消息摘要“)= f96b 697 D7 CB 7938d 525 a2f 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 277 d9f9 F5 a 5611c2c 9f 419d9f
MD5(“1234567890123456789012345678901234567890123456789012345678901234578901234565438
如果妳用上面的信息來測試妳所做的md5算法的例子,並且最終的結論與標準答案完全壹致,那麽我在這裏要對妳說壹聲恭喜。妳知道,我的程序第壹次編譯成功時並沒有得到與上面相同的結果。
第四,MD5的安全性
md5對md4的改進:
1.增加了第四輪;
2.每壹步都有唯壹的加成常數;
3.為了在第二輪中削弱函數G的對稱性,函數G從(x &;y)|(x & amp;z)|(y & amp;z)變成了(x &;z)|(y & amp;(~ z);
4.第壹步將上壹步的結果相加,這將導致更快的雪崩效應;
5.改變了第二輪和第三輪訪問消息子包的順序,使它們更加不同;
6.每回合循環左移的位移被近似優化以實現更快的雪崩效果。每個車輪的排量互不相同。