【正文】
0000 1111 1010 1111 0100 0101 0100 1001) =1001 1001 0101 1011 0001 0011 0011 1000=955b1338這樣就計(jì)算出第一步的運(yùn)算,下面的運(yùn)算和上面的運(yùn)算類同就不在這里浪費(fèi)篇幅.關(guān)于加密算法的分析就重來沒有停止過,現(xiàn)有的加密算法的密鑰動輒就256,為強(qiáng)行破解提供了很大的障礙;隨著計(jì)算機(jī)速度的提高,位數(shù)還在增減,對密碼的分析就成為唯一的突破 口.由上面的MD5加密的原理,我們知道,其加密主要有三步:(1)對字符串的填充(2)分段求摘要(3)最終摘要的輸出第一步和第三步都不是MD5算法的核心,也不是碰撞的可能發(fā)生地,所以下面的介紹還是分析和討論都是基于第二步進(jìn)行的不妨?。▁,y,z)=(1,1,1),(1,1,0),(1,0,0) ,(1,0,1)(0,0,1),(0,1,1),(0,1,0),(0,0,0)經(jīng)過分析就可以得到:結(jié)論一:F=0,當(dāng)且僅當(dāng)(x,y,z){(0,0,0),(0,1,0) ,(1,0,0), (1,0,1)}F=1, 當(dāng)且僅當(dāng)(x,y,z){(1,1,1),(1,1,0),(0,0,1),(0,1,1)}結(jié)論二:G=0,當(dāng)且僅當(dāng)(x,y,z){(0,0,0),(0,0,1),(0,1,1),(1,0,0)}G=1,當(dāng)且僅當(dāng)(x,y,z){(0,1,0), (1,0,1),(1,1,0), (1,1,1)}結(jié)論三:H=0,當(dāng)且僅當(dāng)(x,y,z){(0,0,0),(0,1,1),(1,0,1),(1,1,1)}H=1,當(dāng)且僅當(dāng)(x,y,z){(0,0,1),(0,1,0), (1,0,0),(1,1,0)}結(jié)論四:I=0,當(dāng)且僅當(dāng)(x,y,z){(0,0,1),(0,1,0), (1,1,0),(1,1,1)}I=1,當(dāng)且僅當(dāng)(x,y,z){(0,0,0),(0,1,1),(1,0,1),(1,0,0)從文獻(xiàn)[7]可以知道,在使用相應(yīng)的概率分析就會產(chǎn)生一定概率的碰撞從文獻(xiàn)[7]可以知道,要產(chǎn)生對第一輪的碰撞,只需要在報(bào)文中修改三位就可以了,設(shè)中的最高位,或者相應(yīng)的位就會出現(xiàn)一定概率的碰撞.MD5加密技術(shù)廣泛應(yīng)用于數(shù)字簽名領(lǐng)域,它的典型應(yīng)用是對一段信息產(chǎn)生信息摘要,以防止被篡改.比如在發(fā)布軟件的時(shí)候,在這個(gè)文件中通常只有一行文本,大致結(jié)構(gòu)如:MD5:a5fdfeb0af54ef8397c4ea4a06e25d8f,這就是該軟件文件的數(shù)字簽名,MD5將整個(gè)文件當(dāng)做一個(gè)大文本信息,通過其不可逆的字符串變換算法,產(chǎn)生了這個(gè)MD5信息摘要.在以后傳播這個(gè)文件的過程中,只要文件的內(nèi)容發(fā)生任何形式的改變(包括人為的修改或者下載過程中線路不穩(wěn)定引起的傳輸錯誤等,換句話說,哪怕源文件的一個(gè)字符被改變,MD5值也會發(fā)生改變),在對這個(gè)文件重新計(jì)算MD5值時(shí)就會發(fā)現(xiàn)信息摘要不相同,由此可以判定得到的文件是否被篡改.如果再配合一個(gè)第三方認(rèn)證機(jī)構(gòu),利用MD5加密技術(shù)還可以防止文件作者的“抵賴”.MD5還廣泛用于加密保密信息上.如對于數(shù)據(jù)庫中登陸密碼一般都是經(jīng)過MD5加密后存放的.當(dāng)?shù)顷懙臅r(shí)候,根據(jù)用戶填報(bào)的密碼生成相應(yīng)的MD5值再與數(shù)據(jù)庫中的信息對比,從而判定登陸的合法性,但實(shí)際中如果把用戶的密碼MD5處理后再存儲到數(shù)據(jù)庫中是不安全的.因?yàn)橛脩舻拿艽a往往是比較短的,而且很多用戶的密碼都是使用生日,身份證等比較熟悉的號碼,常用的一些吉利的數(shù)字以方便記憶,如果把常用的密碼先經(jīng)過MD5處理形成MD5值集群,然后把要破譯的MD5結(jié)果相匹配,就可能找到原文.因此,對于MD5加密保密信息時(shí),一般需要同時(shí)設(shè)置一個(gè)隨機(jī)附加值來保證密碼的安全性.例如:某用戶的注冊密碼為“move”,則在將密碼保存至數(shù)據(jù)庫時(shí)應(yīng)當(dāng)先在密碼原文后附加一個(gè)隨機(jī)附加值,比如附加值為“8dx9087h”,然后將帶有附加值的密碼經(jīng)過MD5加密,即將“move8dx9087h”做為原密碼進(jìn)行加密,然后存入數(shù)據(jù)庫中,同時(shí)將隨機(jī)附加碼也存入數(shù)據(jù)庫中.在檢測用戶登陸密碼時(shí),則將用戶輸入的密碼與數(shù)據(jù)庫中的附加碼共同進(jìn)行MD5加密后進(jìn)行對比.這樣可以有效地降低通過密文比對獲得密碼原碼的可能性.研究的實(shí)質(zhì)是為了對現(xiàn)有的運(yùn)用提供借鑒,對未來的應(yīng)用提供前瞻性的認(rèn)識.研究MD5算法就是為了怎樣使得碰撞更難通過分析實(shí)現(xiàn).以下是對Hash算法的改進(jìn)策略:(1)增加Hash運(yùn)算的輪數(shù).輪數(shù)越多,其計(jì)算空間越大,進(jìn)行運(yùn)算的計(jì)算量就會成百倍成千萬倍的增加,這樣在無形中就會增加密碼破譯的難度,這樣密碼的安全系數(shù)就會升高,達(dá)到預(yù)定的安全指數(shù).(2)模運(yùn)算和位運(yùn)算是加密算法的主要計(jì)算過程.可以嘗試使用新的理論去實(shí)現(xiàn)加密思想,而不單單是運(yùn)用類同的模運(yùn)算,可以使用數(shù)論,離散對數(shù),橢圓曲線等知識,從根本上做到創(chuàng)新.(3)Hash算法的其他設(shè)計(jì)方法的研究.現(xiàn)在無論是SHA1,HAVAL128還是RIPEMD都在一定程度上仿照了MD5加密算法,無論是從消息的填充還是從核心的模運(yùn)算,位運(yùn)算都有驚人的相似之處,所以研究新的加密算法已經(jīng)迫在眉睫,理論創(chuàng)新才是真正的出路.7. 附錄 Private Const BITS_TO_A_BYTE = 8 Private Const BYTES_TO_A_WORD = 4 Private Const BITS_TO_A_WORD = 32 Private m_lOnBits(30) Private m_l2Power(30) Private Function LShift(lValue, iShiftBits) ’定義左移函數(shù) If iShiftBits = 0 Then LShift = lValue Exit Function ElseIf iShiftBits = 31 Then If lValue And 1 Then LShift = amp。H80000000 Else LShift = ((lValue And m_lOnBits(31 iShiftBits)) * m_l2Power(iShiftBits)) End IfEnd Function Private Function RShift(lValue, iShiftBits) ’定義右移函數(shù) If iShiftBits = 0 Then RShift = lValue Exit Function ElseIf iShiftBits = 31 Then If lValue And amp。H7FFFFFFE) \ m_l2Power(iShiftBits) If (lValue And amp。H40000000 \ m_l2Power(iShiftBits 1))) End IfEnd Function Private Function RotateLeft(lValue, iShiftBits) ’定義循環(huán)左移函數(shù) RotateLeft = LShift(lValue, iShiftBits) Or RShift(lValue, (32 iShiftBits)) End Function Private Function AddUnsigned(lX, lY) ’定義模加法運(yùn)算 Dim lX4 Dim lY4 Dim lX8 Dim lY8 Dim lResult lX8 = lX And amp。H80000000 lX4 = lX And amp。H40000000 lResult = (lX And amp。H3FFFFFFF) If lX4 And lY4 Then lResult = lResult Xor amp。H40000000 Then lResult = lResult Xor amp。H40000000 Xor lX8 Xor lY8 End If Else lResult = lResult Xor lX8 Xor lY8 End If AddUnsigned = lResult End Function Private Function md5_F(x, y, z) md5_F = (x And y) Or ((Not x) And z) End FunctionPrivate Function md5_G(x, y, z) md5_G = (x And z) Or (y And (Not z)) End Function Private Function md5_H(x, y, z)