版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、. . . . MD5加密算法探究與其應(yīng)用引言MD5加密算法作為一種免費(fèi)的加密算法,廣泛地應(yīng)用于計(jì)算機(jī),數(shù)據(jù)安全傳輸,數(shù)字簽名認(rèn)證等安全領(lǐng)域MD5的全稱是Message-Digest Algorithm 5(信息-摘要算法),是由Ron Rivest (RSA 算法的發(fā)明人之一,于2002年獲得圖靈獎(jiǎng))于90年代初提出,經(jīng)MD2,MD3和MD4發(fā)展而來(lái)的Rivest 最早于1989年提出了MD2算法針對(duì)8位計(jì)算機(jī)做了優(yōu)化,為了提高算法的安全性與穩(wěn)定性,Rivest在1990年又開(kāi)發(fā)出MD4算法,但人們很快發(fā)現(xiàn)了MD4算法的漏洞隨后在1991年,Rivest開(kāi)發(fā)出來(lái)技術(shù)上更加穩(wěn)定安全更趨于成熟的
2、MD5算法1993年,美國(guó)國(guó)家標(biāo)準(zhǔn)和技術(shù)協(xié)會(huì)(NIST)提出了安全散列算法(SHA)1995年又發(fā)布了一個(gè)修訂版,即SHA-1.SHA-1與MD5均由MD4導(dǎo)出,所以彼此很相似相應(yīng)的,它們的強(qiáng)度和其他特征也是相似的2004年8月17日于美國(guó)加州圣巴巴拉召開(kāi)的國(guó)際密碼學(xué)會(huì)議(Crypto 2004)上,來(lái)自大學(xué)的王小云教授做了破譯MD5,HAVAL-128,MD4和RIPEMD算法的報(bào)告,宣告了MD系列算法的破解對(duì)于一個(gè)進(jìn)行身份認(rèn)證的摘要算法來(lái)說(shuō),MD5已經(jīng)是不安全了,但是很多實(shí)際的應(yīng)用領(lǐng)域MD5還有它的使用價(jià)值的,所以我們分析探究它的加密原理,我們?cè)诖嘶A(chǔ)上對(duì)它的加密進(jìn)行改進(jìn)利用,對(duì)于我們今后
3、的加密安全工作還是很有幫助的1.預(yù)備知識(shí)1.1 Hash函數(shù)Hash函數(shù)是一種將任意長(zhǎng)度的信息壓縮到某一固定長(zhǎng)度的消息摘要的函數(shù),又稱Hash算法Hash函數(shù)必須滿足一定的安全條件這里主要介紹三個(gè)主要的方面:?jiǎn)蜗蛐?,弱抗碰撞性,?qiáng)碰撞性單向性是指對(duì)Hash函數(shù)h而言,又x計(jì)算h(x)是容易的,但從h(x)計(jì)算x是不可行的一個(gè)弱碰撞的Hash函數(shù)是滿足下列條件的一個(gè)函數(shù)h: h的輸入 可以是任意長(zhǎng)度的消息或文件ph的輸出長(zhǎng)度是固定的給定h和M,計(jì)算h(p)是很容易的給定h和一個(gè)隨機(jī)選擇的消息p1,找到另一個(gè)消息p2,p1p2使得h(p1)=h(p2)計(jì)算上是不可行的一個(gè)強(qiáng)碰撞的Hash函數(shù)是滿足
4、下列條件的一個(gè)函數(shù)h:h的輸入 可以是任意長(zhǎng)度的消息或文件ph的輸出長(zhǎng)度是固定的給定h和M,計(jì)算h(p)是很容易的給定h,找到兩個(gè)不同的消息p1,p2 ,使得h(p1)=h(p2)在計(jì)算上是不可行的(如果有兩個(gè)不同的消息M,M,使得h(M)=h(M),我們就說(shuō)這兩個(gè)消息是碰撞的)1.2 16進(jìn)制的相關(guān)知識(shí)十六進(jìn)制在數(shù)學(xué)中是一種逢16進(jìn)1的進(jìn)位制,一般用數(shù)字0到9和字母A到F表示(A-F表示10-15)十六進(jìn)制轉(zhuǎn)換成二進(jìn)制的比特流(第一列16進(jìn)制,第二列2進(jìn)制)0123456789ABCDEF0000000100100011010001010110011110001001101010111100
5、110111101111例如:十六進(jìn)制為9FD,那么在計(jì)算機(jī)中二進(jìn)制表示1(9=1001,F(xiàn)=1111,D=1101)1.3 邏輯運(yùn)算 邏輯“與”運(yùn)算,用“”表示真值表表示為pq111100010000二進(jìn)制按位邏輯“與”運(yùn)算,即逐位進(jìn)行邏輯“與”運(yùn)算,并將逐位邏輯運(yùn)算的結(jié)果進(jìn)行組合得到的結(jié)果例如:如果 ,那么例如:如果,那么首先把轉(zhuǎn)換為二進(jìn)制為;其次把轉(zhuǎn)換而二進(jìn)制位;最后按位進(jìn)行邏輯“與”運(yùn)算結(jié)果為 邏輯“或”運(yùn)算,用“|”表示真值表表示為:pq|111101011000 邏輯“異或”運(yùn)算,用“”表示真值表表示為:pq110101011000 邏輯“取反”運(yùn)算二進(jìn)制數(shù)的所有0改為,1改為0,
6、這個(gè)過(guò)程叫“取反”例如:如果,那么1.4 模運(yùn)算基本概念給定一個(gè)正整數(shù),任意一個(gè)整數(shù),一定存在等式 ;其中是整數(shù),且 ,稱為除以的商,為除以的余數(shù)對(duì)于正整數(shù)和整數(shù),定義如下運(yùn)算: 模加法:,其結(jié)果是算術(shù)和除以的余數(shù),也就是說(shuō),則例如:,那么(注這里“+”是模加法運(yùn)算)首先將轉(zhuǎn)換為二進(jìn)制為;其次將轉(zhuǎn)換為二進(jìn)制為 然后逐位相加結(jié)果為1110因?yàn)閷?shí)行的是二進(jìn)制數(shù)據(jù),逢2向前一位進(jìn)1,所以最終結(jié)果為:01110,這個(gè)結(jié)果的十進(jìn)制是:,然后模,結(jié)果為,它的二進(jìn)制表示為:11102. MD5加密算法的原理簡(jiǎn)單的說(shuō),MD5加密以512位分組來(lái)處理輸入的信息,且每一分組又被劃分
7、為16個(gè)32位子分組,經(jīng)過(guò)一系列的處理后,算法的輸出有4個(gè)32位分組組成,將這4個(gè)32位分組級(jí)聯(lián)后將生成一個(gè)128位散列值第一步:消息的填充如果輸入的消息的長(zhǎng)度(以bit位單位)對(duì)512求余的結(jié)果不等于448,就需要填充使得對(duì)512求余的結(jié)果等于448,填充的方法是附加一個(gè)“1”在消息后面,再補(bǔ)充多個(gè)“0”,然后在其后附上64比特的消息長(zhǎng)度(填充前)的二進(jìn)制表示這兩步的作用是使最終填充后的消息恰好是512比特的整倍長(zhǎng),同時(shí)確保不同的消息在填充后不會(huì)一樣第二步:記錄消息長(zhǎng)度用64位來(lái)存儲(chǔ)填充前消息長(zhǎng)度,這64位加在第一步結(jié)果的后面,這樣消息長(zhǎng)度就變?yōu)镹*512+448+64=(N+1)*512(
8、bits)第三步:加載初始標(biāo)準(zhǔn)數(shù)據(jù)算法中使用了四個(gè)32比特的變量A,B,C,D,先將這四個(gè)變量初始化為:稱它們?yōu)樽兞?,接著進(jìn)行算法的主循環(huán),循環(huán)的次數(shù)是消息中512比特的塊的數(shù)目將上面四個(gè)標(biāo)準(zhǔn)變量復(fù)制到另外四個(gè)變量中:A到a,B到b,C到c,D到d第四步:四輪循環(huán)運(yùn)算循環(huán)的次數(shù)是分組的個(gè)數(shù)(N+1),每輪循環(huán)都很相似,每次操作對(duì)abcd中的其中三個(gè)作一次非線性函數(shù)運(yùn)算,然后將所得的結(jié)果加上第四個(gè)變量,文本的一個(gè)子分組和一個(gè)常數(shù),再將所得結(jié)果向左位移一個(gè)不定的數(shù),并加上a,b,c,d中之一,最后用該結(jié)果取代a,b,c,d中之一設(shè)XY表示輸入的塊,下面描述一些運(yùn)算:(1)表示與按位邏輯“與”運(yùn)算(
9、2)表示與按位邏輯“或”運(yùn)算(3)表示與按位邏輯“異或”運(yùn)算(4)表示的按位邏輯取“反”(5)+表示整數(shù)模加法運(yùn)算(6)表示將循環(huán)左移個(gè)單位有四個(gè)非線性函數(shù),每輪一個(gè)這四個(gè)函數(shù)的說(shuō)明:如果,,的對(duì)應(yīng)的位是獨(dú)立和均勻的,那么結(jié)果的每一位也應(yīng)該是均勻的其中是一個(gè)逐位運(yùn)算的函數(shù),即,如果,那么,否則函數(shù)是逐位奇偶操作符(其中“”是邏輯“與”運(yùn)算,“|”是邏輯“或”運(yùn)算,“”邏輯“異或”運(yùn)算,“”邏輯“取反”運(yùn)算)四輪運(yùn)算是:假設(shè)表示消息的第個(gè)子分組(從0到15),表示循環(huán)左移位表示表示表示表示這四輪(64步)是:第一輪第二輪第三輪第四輪其中常數(shù)可以如下選擇:在第步中,是的整數(shù)部分,的單位是弧度等于的
10、次方所有這些完成之后,將A、B、C、D分別加上a、b、c、d然后用下一分組數(shù)據(jù)繼續(xù)運(yùn)行算法,最后的輸出是A、B、C和D的級(jí)聯(lián)3.運(yùn)算原理簡(jiǎn)舉例例如:計(jì)算解:不妨假設(shè):要加密的信息為abc,其比特串為01100001 01100010 01100011它的長(zhǎng)度是24位,于是添加1個(gè)“1”,423個(gè)“0”,再加上64比特串(24)=00000000 00000018即x=01100001 01100010 01100011 1 00 00000000 00000018,共512比特,只有16分組為,所以有=00000000=00000018首先計(jì)算出A=0000 0001 0010 0011 01
11、00 0101 0110 0111=B=1000 1001 1010 1011 1100 1101 1110 1111=C=1111 1110 1101 1100 1011 1010 1001 1000=D=0111 0110 0101 0100 0011 0010 0001 0000=其次計(jì)算 =(1000 1001 1010 1011 1100 1101 1110 11111111 1110 1101 1100 1011 1010 1001 1000)|(0111 0110 0101 0100 0011 0010 0001 00000111 0110 0101 0100 0011 0010
12、 0001 0000) =(1000 1000 1000 1000 1000 1000 1000 1000)|(0111 0110 0101 0100 0011 0010 0001 0000) =1111 1110 1101 1100 1011 1010 1001 1000轉(zhuǎn)換為二進(jìn)制為1101 0111 0110 1010 1010 0100 0111 1000結(jié)果為 =(1000 1001 1010 1011 1100 1101 1110 1111)+(0000 0001 0010 0011 0100 0101 0110 0111+1111 1110 1101 1100 1011 1010
13、 1001 1000+0000 0001 0001 0000 0000 0000 0001 0000)+1101 0111 0110 1010 1010 0100 0111 1000) =(1000 1001 1010 1011 1100 1101 1110 1111)+(0000 0000 0011 1000 0000 0000 0000 1111+1101 0111 0110 1010 1010 0100 0111 1000) =(1000 1001 1010 1011 1100 1101 1110 1111)+(1101 0111 1010 0010 1010 0100 1000 011
14、1) =(1000 1001 1010 1011 1100 1101 1110 1111)+(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)篇幅4.MD5加密算法的安全性分析關(guān)于加密算法的分析就重來(lái)沒(méi)有停止過(guò),現(xiàn)有的加密算法的密鑰動(dòng)輒就256,為強(qiáng)行破解提供了很大的障礙;隨著計(jì)算機(jī)速度的提高,位數(shù)還在增減,對(duì)密碼的分析就成為唯一的突破 口由上面的MD5加密的原理,我們知道,其加密主要有三步:(1)
15、對(duì)字符串的填充(2)分段求摘要(3)最終摘要的輸出第一步和第三步都不是MD5算法的核心,也不是碰撞的可能發(fā)生地,所以下面的介紹還是分析和討論都是基于第二步進(jìn)行的4.1各步的碰撞的分析不妨?。▁,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)過(guò)分析就可以得到:結(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)
16、,(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)的概率分析就會(huì)產(chǎn)生一定概率的碰撞4.2各
17、圈碰撞的分析從文獻(xiàn)7可以知道,要產(chǎn)生對(duì)第一輪的碰撞,只需要在報(bào)文中修改三位就可以了,設(shè)中的最高位,或者相應(yīng)的位就會(huì)出現(xiàn)一定概率的碰撞5.MD5加密技術(shù)的實(shí)際應(yīng)用舉例MD5加密技術(shù)廣泛應(yīng)用于數(shù)字簽名領(lǐng)域,它的典型應(yīng)用是對(duì)一段信息產(chǎn)生信息摘要,以防止被篡改比如在發(fā)布軟件的時(shí)候,經(jīng)常會(huì)有一個(gè)文件擴(kuò)展名為.md5的文件,在這個(gè)文件常只有一行文本,大致結(jié)構(gòu)如:MD5:a5fdfeb0af54ef8397c4ea4a06e25d8f,這就是該軟件文件的數(shù)字簽名,MD5將整個(gè)文件當(dāng)做一個(gè)大文本信息,通過(guò)其不可逆的字符串變換算法,產(chǎn)生了這個(gè)MD5信息摘要在以后傳播這個(gè)文件的過(guò)程中,只要文件的容發(fā)生任何形式的改
18、變(包括人為的修改或者下載過(guò)程中線路不穩(wěn)定引起的傳輸錯(cuò)誤等,換句話說(shuō),哪怕源文件的一個(gè)字符被改變,MD5值也會(huì)發(fā)生改變),在對(duì)這個(gè)文件重新計(jì)算MD5值時(shí)就會(huì)發(fā)現(xiàn)信息摘要不一樣,由此可以判定得到的文件是否被篡改如果再配合一個(gè)第三方認(rèn)證機(jī)構(gòu),利用MD5加密技術(shù)還可以防止文件作者的“抵賴”MD5還廣泛用于加密信息上如對(duì)于數(shù)據(jù)庫(kù)中登陸密碼一般都是經(jīng)過(guò)MD5加密后存放的當(dāng)?shù)顷懙臅r(shí)候,根據(jù)用戶填報(bào)的密碼生成相應(yīng)的MD5值再與數(shù)據(jù)庫(kù)中的信息對(duì)比,從而判定登陸的合法性,但實(shí)際中如果把用戶的密碼MD5處理后再存儲(chǔ)到數(shù)據(jù)庫(kù)中是不安全的因?yàn)橛脩舻拿艽a往往是比較短的,而且很多用戶的密碼都是使用生日,等比較熟悉的,常用
19、的一些吉利的數(shù)字以方便記憶,如果把常用的密碼先經(jīng)過(guò)MD5處理形成MD5值集群,然后把要破譯的MD5結(jié)果相匹配,就可能找到原文因此,對(duì)于MD5加密信息時(shí),一般需要同時(shí)設(shè)置一個(gè)隨機(jī)附加值來(lái)保證密碼的安全性例如:某用戶的注冊(cè)密碼為“move”,則在將密碼保存至數(shù)據(jù)庫(kù)時(shí)應(yīng)當(dāng)先在密碼原文后附加一個(gè)隨機(jī)附加值,比如附加值為“8dx9087h”,然后將帶有附加值的密碼經(jīng)過(guò)MD5加密,即將“move8dx9087h”做為原密碼進(jìn)行加密,然后存入數(shù)據(jù)庫(kù)中,同時(shí)將隨機(jī)附加碼也存入數(shù)據(jù)庫(kù)中在檢測(cè)用戶登陸密碼時(shí),則將用戶輸入的密碼與數(shù)據(jù)庫(kù)中的附加碼共同進(jìn)行MD5加密后進(jìn)行對(duì)比這樣可以有效地降低通過(guò)密文比對(duì)獲得密碼原碼
20、的可能性6.MD5加密算法的改進(jìn)意見(jiàn)研究的實(shí)質(zhì)是為了對(duì)現(xiàn)有的運(yùn)用提供借鑒,對(duì)未來(lái)的應(yīng)用提供前瞻性的認(rèn)識(shí)研究MD5算法就是為了怎樣使得碰撞更難通過(guò)分析實(shí)現(xiàn)以下是對(duì)Hash算法的改進(jìn)策略:(1)增加Hash運(yùn)算的輪數(shù)輪數(shù)越多,其計(jì)算空間越大,進(jìn)行運(yùn)算的計(jì)算量就會(huì)成百倍成千萬(wàn)倍的增加,這樣在無(wú)形中就會(huì)增加密碼破譯的難度,這樣密碼的安全系數(shù)就會(huì)升高,達(dá)到預(yù)定的安全指數(shù)(2)模運(yùn)算和位運(yùn)算是加密算法的主要計(jì)算過(guò)程可以嘗試使用新的理論去實(shí)現(xiàn)加密思想,而不單單是運(yùn)用類同的模運(yùn)算,可以使用數(shù)論,離散對(duì)數(shù),橢圓曲線等知識(shí),從根本上做到創(chuàng)新(3)Hash算法的其他設(shè)計(jì)方法的研究現(xiàn)在無(wú)論是SHA-1,HAVAL-1
21、28還是RIPEMD都在一定程度上仿照了MD5加密算法,無(wú)論是從消息的填充還是從核心的模運(yùn)算,位運(yùn)算都有驚人的相似之處,所以研究新的加密算法已經(jīng)迫在眉睫,理論創(chuàng)新才是真正的出路7. 附錄25 / 25VB6.0中實(shí)現(xiàn)MD5改進(jìn)后的加密算法 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, iSh
22、iftBits)定義左移函數(shù) If iShiftBits = 0 Then LShift = lValue Exit Function ElseIf iShiftBits = 31 Then If lValue And 1 Then LShift = &H80000000 Else LShift = 0 End If Exit Function ElseIf iShiftBits < 0 Or iShiftBits > 31 Then Err.Raise 6 End If If (lValue And m_l2Power(31 - iShiftBits) Then LShi
23、ft = (lValue And m_lOnBits(31 - (iShiftBits + 1) * m_l2Power(iShiftBits) Or &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 iSh
24、iftBits = 31 Then If lValue And &H80000000 Then RShift = 1 Else RShift = 0 End If Exit Function ElseIf iShiftBits < 0 Or iShiftBits > 31 Then Err.Raise 6 End IfRShift = (lValue And &H7FFFFFFE) m_l2Power(iShiftBits) If (lValue And &H80000000) Then RShift = (RShift Or (&H40000000
25、 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 &H80
26、000000 lY8 = lY And &H80000000 lX4 = lX And &H40000000 lY4 = lY And &H40000000 lResult = (lX And &H3FFFFFFF) + (lY And &H3FFFFFFF) If lX4 And lY4 Then lResult = lResult Xor &H80000000 Xor lX8 Xor lY8 ElseIf lX4 Or lY4 Then If lResult And &H40000000 Then lResult = lResult
27、Xor &HC0000000 Xor lX8 Xor lY8 Else lResult = lResult Xor &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 =
28、 (x And z) Or (y And (Not z) End Function Private Function md5_H(x, y, z) md5_H = (x Xor y Xor z) End Function Private Function md5_I(x, y, z) md5_I = (y Xor (x Or (Not z) End Function Private Sub md5_FF(a, b, c, d, x, s, ac) a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_F(b, c, d), x), ac) a = Rot
29、ateLeft(a, s) a = AddUnsigned(a, b) End Sub Private Sub md5_GG(a, b, c, d, x, s, ac) a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_G(b, c, d), x), ac) a = RotateLeft(a, s) a = AddUnsigned(a, b) End Sub Private Sub md5_HH(a, b, c, d, x, s, ac) a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_H(b, c, d
30、), x), ac) a = RotateLeft(a, s) a = AddUnsigned(a, b) End Sub Private Sub md5_II(a, b, c, d, x, s, ac) a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_I(b, c, d), x), ac) a = RotateLeft(a, s) a = AddUnsigned(a, b) End Sub Private Function ConvertToWordArray(sMessage) Dim lMessageLength Dim lNumberOfW
31、ords Dim lWordArray() Dim lBytePosition Dim lByteCount Dim lWordCount Const MODULUS_BITS = 512 Const CONGRUENT_BITS = 448 lMessageLength = Len(sMessage) lNumberOfWords = (lMessageLength + (MODULUS_BITS - CONGRUENT_BITS) BITS_TO_A_BYTE) (MODULUS_BITS BITS_TO_A_BYTE) + 1) * (MODULUS_BITS BITS_TO_A_WOR
32、D) ReDim lWordArray(lNumberOfWords - 1) lBytePosition = 0 lByteCount = 0 Do Until lByteCount >= lMessageLength lWordCount = lByteCount BYTES_TO_A_WORD lBytePosition = (lByteCount Mod BYTES_TO_A_WORD) * BITS_TO_A_BYTE lWordArray(lWordCount) = lWordArray(lWordCount) Or LShift(Asc(Mid(sMessage, lByt
33、eCount + 1, 1), lBytePosition) lByteCount = lByteCount + 1Loop lWordCount = lByteCount BYTES_TO_A_WORD lBytePosition = (lByteCount Mod BYTES_TO_A_WORD) * BITS_TO_A_BYTE lWordArray(lWordCount) = lWordArray(lWordCount) Or LShift(&H80, lBytePosition) lWordArray(lNumberOfWords - 2) = LShift(lMessage
34、Length, 3) lWordArray(lNumberOfWords - 1) = RShift(lMessageLength, 29) ConvertToWordArray = lWordArray End FunctionPrivate Function WordToHex(lValue) Dim lByte Dim lCount For lCount = 0 To 3 lByte = RShift(lValue, lCount * BITS_TO_A_BYTE) And m_lOnBits(BITS_TO_A_BYTE - 1) WordToHex = WordToHex &
35、 Right("0" & Hex(lByte), 2) Next End Function Public Function MD5(sMessage) m_lOnBits(0) = CLng(1) m_lOnBits(1) = CLng(3) m_lOnBits(2) = CLng(7) m_lOnBits(3) = CLng(15) m_lOnBits(4) = CLng(31) m_lOnBits(5) = CLng(63) m_lOnBits(6) = CLng(127) m_lOnBits(7) = CLng(255) m_lOnBits(8) = CLng
36、(511) m_lOnBits(9) = CLng(1023) m_lOnBits(10) = CLng(2047) m_lOnBits(11) = CLng(4095) m_lOnBits(12) = CLng(8191) m_lOnBits(13) = CLng(16383) m_lOnBits(14) = CLng(32767) m_lOnBits(15) = CLng(65535) m_lOnBits(16) = CLng(131071) m_lOnBits(17) = CLng(262143) m_lOnBits(18) = CLng(524287) m_lOnBits(19) =
37、CLng(1048575) m_lOnBits(20) = CLng(2097151) m_lOnBits(21) = CLng(4194303) m_lOnBits(22) = CLng(8388607) m_lOnBits(23) = CLng(16777215) m_lOnBits(24) = CLng(33554431) m_lOnBits(25) = CLng(67108863) m_lOnBits(26) = CLng(134217727) m_lOnBits(27) = CLng(268435455) m_lOnBits(28) = CLng(536870911) m_lOnBi
38、ts(29) = CLng(1073741823) m_lOnBits(30) = CLng(2147483647) m_l2Power(0) = CLng(1) m_l2Power(1) = CLng(2) m_l2Power(2) = CLng(4) m_l2Power(3) = CLng(8) m_l2Power(4) = CLng(16) m_l2Power(5) = CLng(32) m_l2Power(6) = CLng(64) m_l2Power(7) = CLng(128) m_l2Power(8) = CLng(256) m_l2Power(9) = CLng(512) m_
39、l2Power(10) = CLng(1024) m_l2Power(11) = CLng(2048) m_l2Power(12) = CLng(4096) m_l2Power(13) = CLng(8192) m_l2Power(14) = CLng(16384) m_l2Power(15) = CLng(32768) m_l2Power(16) = CLng(65536) m_l2Power(17) = CLng(131072) m_l2Power(18) = CLng(262144) m_l2Power(19) = CLng(524288) m_l2Power(20) = CLng(10
40、48576) m_l2Power(21) = CLng(2097152) m_l2Power(22) = CLng(4194304) m_l2Power(23) = CLng(8388608) m_l2Power(24) = CLng(16777216) m_l2Power(25) = CLng(33554432) m_l2Power(26) = CLng(67108864) m_l2Power(27) = CLng(134217728) m_l2Power(28) = CLng(268435456) m_l2Power(29) = CLng(536870912) m_l2Power(30)
41、= CLng(1073741824) Dim x,k,AA,BB,CC,DD,a,b,c,d Const S11 = 7 Const S12 = 12 Const S13 = 17 Const S14 = 22 Const S21 = 5 Const S22 = 9 Const S23 = 14 Const S24 = 20 Const S31 = 4 Const S32 = 11 Const S33 = 16 Const S34 = 23 Const S41 = 6 Const S42 = 10 Const S43 = 15 Const S44 = 21 x = ConvertToWordA
42、rray(sMessage) a = &H67452301 b = &HEFCDAB89 c = &H98BADCFE d = &H10325476 For k = 0 To UBound(x) Step 16AA = aBB = bCC = c DD = d md5_FF a, b, c, d, x(k + 0), S11, &HD76AA478 md5_FF d, a, b, c, x(k + 1), S12, &HE8C7B756 md5_FF c, d, a, b, x(k + 2), S13, &H242070DB md5_FF
43、 b, c, d, a, x(k + 3), S14, &HC1BDCEEE md5_FF a, b, c, d, x(k + 4), S11, &HF57C0FAF md5_FF d, a, b, c, x(k + 5), S12, &H4787C62A md5_FF c, d, a, b, x(k + 6), S13, &HA8304613 md5_FF b, c, d, a, x(k + 7), S14, &HFD469501 md5_FF a, b, c, d, x(k + 8), S11, &H698098D8 md5_FF d, a,
44、 b, c, x(k + 9), S12, &H8B44F7AF md5_FF c, d, a, b, x(k + 10), S13, &HFFFF5BB1 md5_FF b, c, d, a, x(k + 11), S14, &H895CD7BE md5_FF a, b, c, d, x(k + 12), S11, &H6B901122 md5_FF d, a, b, c, x(k + 13), S12, &HFD987193 md5_FF c, d, a, b, x(k + 14), S13, &HA679438E md5_FF b, c,
45、d, a, x(k + 15), S14, &H49B40821 md5_GG a, b, c, d, x(k + 1), S21, &HF61E2562 md5_GG d, a, b, c, x(k + 6), S22, &HC040B340 md5_GG c, d, a, b, x(k + 11), S23, &H265E5A51 md5_GG b, c, d, a, x(k + 0), S24, &HE9B6C7AA md5_GG a, b, c, d, x(k + 5), S21, &HD62F105D md5_GG d, a, b, c
46、, x(k + 10), S22, &H2441453 md5_GG c, d, a, b, x(k + 15), S23, &HD8A1E681 md5_GG b, c, d, a, x(k + 4), S24, &HE7D3FBC8 md5_GG a, b, c, d, x(k + 9), S21, &H21E1CDE6 md5_GG d, a, b, c, x(k + 14), S22, &HC33707D6 md5_GG c, d, a, b, x(k + 3), S23, &HF4D50D87 md5_GG b, c, d, a, x(
47、k + 8), S24, &H455A14ED md5_GG a, b, c, d, x(k + 13), S21, &HA9E3E905 md5_GG d, a, b, c, x(k + 2), S22, &HFCEFA3F8 md5_GG c, d, a, b, x(k + 7), S23, &H676F02D9 md5_GG b, c, d, a, x(k + 12), S24, &H8D2A4C8A md5_HH a, b, c, d, x(k + 5), S31, &HFFFA3942 md5_HH d, a, b, c, x(k +
48、8), S32, &H8771F681 md5_HH c, d, a, b, x(k + 11), S33, &H6D9D6122 md5_HH b, c, d, a, x(k + 14), S34, &HFDE5380C md5_HH a, b, c, d, x(k + 1), S31, &HA4BEEA44 md5_HH d, a, b, c, x(k + 4), S32, &H4BDECFA9 md5_HH c, d, a, b, x(k + 7), S33, &HF6BB4B60 md5_HH b, c, d, a, x(k + 10),
49、 S34, &HBEBFBC70 md5_HH a, b, c, d, x(k + 13), S31, &H289B7EC6 md5_HH d, a, b, c, x(k + 0), S32, &HEAA127FA md5_HH c, d, a, b, x(k + 3), S33, &HD4EF3085 md5_HH b, c, d, a, x(k + 6), S34, &H4881D05 md5_HH a, b, c, d, x(k + 9), S31, &HD9D4D039 md5_HH d, a, b, c, x(k + 12), S32,
50、 &HE6DB99E5 md5_HH c, d, a, b, x(k + 15), S33, &H1FA27CF8 md5_HH b, c, d, a, x(k + 2), S34, &HC4AC5665 md5_II a, b, c, d, x(k + 0), S41, &HF4292244 md5_II d, a, b, c, x(k + 7), S42, &H432AFF97 md5_II c, d, a, b, x(k + 14), S43, &HAB9423A7 md5_II b, c, d, a, x(k + 5), S44, &am
51、p;HFC93A039 md5_II a, b, c, d, x(k + 12), S41, &H655B59C3 md5_II d, a, b, c, x(k + 3), S42, &H8F0CCC92 md5_II c, d, a, b, x(k + 10), S43, &HFFEFF47D md5_II b, c, d, a, x(k + 1), S44, &H85845DD1 md5_II a, b, c, d, x(k + 8), S41, &H6FA87E4F md5_II d, a, b, c, x(k + 15), S42, &H
52、FE2CE6E0 md5_II c, d, a, b, x(k + 6), S43, &HA3014314 md5_II b, c, d, a, x(k + 13), S44, &H4E0811A1 md5_II a, b, c, d, x(k + 4), S41, &HF7537E82 md5_II d, a, b, c, x(k + 11), S42, &HBD3AF235 md5_II c, d, a, b, x(k + 2), S43, &H2AD7D2BB md5_II b, c, d, a, x(k + 9), S44, &HEB86D391 a = AddUnsigned(a, AA) b = AddUnsigned(b, BB) c = AddUnsigned(c, CC) d = AddUnsigned(d, DD) Next MD5 = LCase(WordToHex(b) & WordToHex(c)End FunctionPrivate Sub command1_click()old$ = UCase(MD5(Text1.Text)nu$ = ""For i = 1 To Len(old$)a$
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 豬小弟課件教學(xué)課件
- 2024年廣西體育館大院體育用品銷售合同
- 2024年建筑工程分包及勞務(wù)承包協(xié)議
- 2024年度石油天然氣開(kāi)采與銷售合同
- 2024年度船舶修造安裝工程分包協(xié)議
- 2024年度深圳晚輔老師招聘合同
- 2024年布匹交易協(xié)議規(guī)定
- 04年國(guó)際貨物買賣合同
- 2024期房購(gòu)買合同范本
- 2024年度施工現(xiàn)場(chǎng)食品安全管理合同
- 2024年公路建設(shè):泥漿外運(yùn)及環(huán)保處理合同
- 江蘇省蘇州市吳中區(qū)2024-2025學(xué)年八年級(jí)上學(xué)期期中考試歷史卷(含答案)
- 2024-2025學(xué)年上學(xué)期期中教育學(xué)業(yè)質(zhì)量監(jiān)測(cè)九年級(jí)歷史試卷
- 2024年山東省公務(wù)員錄用考試《行測(cè)》試題及答案解析
- 【2024-2025】學(xué)年一上語(yǔ)文期中素養(yǎng)測(cè)評(píng)基礎(chǔ)卷一
- 小兒血液透析的護(hù)理
- 人教版(2024新版)七年級(jí)上冊(cè)數(shù)學(xué)期中模擬檢測(cè)試卷(含答案)
- 2024人工智能技術(shù)在內(nèi)容創(chuàng)作和營(yíng)銷領(lǐng)域的應(yīng)用及影響分析報(bào)告
- 《籃球原地運(yùn)球 行進(jìn)間運(yùn)球》教案(共三篇)
- 2024-2030年中國(guó)裸眼3D行業(yè)市場(chǎng)全景調(diào)研與競(jìng)爭(zhēng)格局分析報(bào)告
- 2025年九省聯(lián)考新高考 政治試卷(含答案解析)
評(píng)論
0/150
提交評(píng)論