MD5算法即Message-Digest Algorithm 5(信�-摘要算法5�,是一種用于產(chǎn)生數(shù)字簽名的單項(xiàng)散列算法。它的作用是讓大容量信息在用�(shù)字簽名軟件簽私人密匙前被"壓縮"成一種保密的格式�
算法輸入是一個字節(jié)串,每個字節(jié)�8個bit.
算法的執(zhí)行分為以下幾個步驟:
�,補(bǔ)位:
MD5算法先對輸入的數(shù)�(jù)�(jìn)行補(bǔ)位,使得�(shù)�(jù)的長�(以byte為單�)�64求余的結(jié)果是56�
即數(shù)�(jù)�(kuò)展至LEN=K*64+56個字節(jié),K為整�(shù)�
�(bǔ)位方法:�(bǔ)一�1,然后補(bǔ)0至滿足上述要求。相�(dāng)于補(bǔ)一�0x80的字節(jié),再�(bǔ)�
�0的字節(jié)。這一步里總共�(bǔ)充的字節(jié)�(shù)�0�63��
第二步,附加�(shù)�(jù)長度�
用一�64位的整數(shù)表示�(shù)�(jù)的原始長�(以bit為單�),將這個數(shù)字的8個字節(jié)按低位的在前�
高位在后的順序附加在�(bǔ)位后的數(shù)�(jù)后面。這時,數(shù)�(jù)被填�(bǔ)后的總長度為�
LEN = K*64+56+8=(K+1)*64 Bytes�
※注意那�64位整�(shù)是輸入數(shù)�(jù)的原始長度而不是填充字節(jié)后的長度,我就在這里栽了跟頭.
第三�,初始化MD5參數(shù)�
有四�32位整�(shù)變量 (A,B,C,D) 用來�(jì)算信息摘�,每一個變量被初始化成以下
以十六�(jìn)制數(shù)表示的數(shù)值,低位的字節(jié)在前��
word A: 01 23 45 67
word B: 89 ab cd ef
word C: fe dc ba 98
word D: 76 54 32 10
※注意低位的字節(jié)在前面指的是Little Endian平臺上內(nèi)存中字節(jié)的排列方式,
而在程序中書寫時,要寫成�
A=0x67452301
B=0xefcdab89
C=0x98badcfe
D=0x10325476
第四�,定義四個MD5基本的按位操作函�(shù)�
X,Y,Z�32位整�(shù)�
F(X,Y,Z) = (X and Y) or (not(X) and Z)
G(X,Y,Z) = (X and Z) or (Y and not(Z))
H(X,Y,Z) = X xor Y xor Z
I(X,Y,Z) = Y xor (X or not(Z))
再定義四個分別用于四輪變換的函數(shù)�
�(shè)Mj表示消息的第j個子分組(從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)<<
第五�,對輸入�(shù)�(jù)作變換:
處理�(shù)�(jù),N是總的字節(jié)�(shù),以64個字節(jié)為一�,每組作一次循�(huán),每次循�(huán)�(jìn)行四輪操��
要變換的64個字節(jié)�16�32位的整數(shù)�(shù)組M[0 ...15]表示。而數(shù)組T[1 ... 64]表示一組常�(shù)�
T[i]�4294967296*abs(sin(i))�32位整�(shù)部分,i的單位是弧度,i的取值從1�64�
具體過程如下�
/* �(shè)置主循環(huán)變量 */
For i = 0 to N/16-1 do
/*每循�(huán)一�,把�(shù)�(jù)原文存放�16個元素的�(shù)組X�. */
For j = 0 to 15 do
Set X[j] to M[i*16+j].
end /�(jié)束對J的循�(huán)
/* Save A as AA, B as BB, C as CC, and D as DD.
*/
AA = A
BB = B
CC = C
DD = D
/* �1�*/
/* � [abcd k s i]表示如下操作
a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */
/* Do the following 16 operations. */
[ABCD 0 7 1] [DABC 1 12 2] [CDAB 2 17 3] [BCDA 3 22 4]
[ABCD 4 7 5] [DABC 5 12 6] [CDAB 6 17 7] [BCDA 7 22 8]
[ABCD 8 7 9] [DABC 9 12 10] [CDAB 10 17 11] [BCDA 11 22 12]
[ABCD 12 7 13] [DABC 13 12 14] [CDAB 14 17 15] [BCDA 15 22 16]
/* �2�* */
/* � [abcd k s i]表示如下操作
a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */
/* Do the following 16 operations. */
[ABCD 1 5 17] [DABC 6 9 18] [CDAB 11 14 19] [BCDA 0 20 20]
[ABCD 5 5 21] [DABC 10 9 22] [CDAB 15 14 23] [BCDA 4 20 24]
[ABCD 9 5 25] [DABC 14 9 26] [CDAB 3 14 27] [BCDA 8 20 28]
[ABCD 13 5 29] [DABC 2 9 30] [CDAB 7 14 31] [BCDA 12 20 32]
/* �3�*/
/* � [abcd k s i]表示如下操作
a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */
/* Do the following 16 operations. */
[ABCD 5 4 33] [DABC 8 11 34] [CDAB 11 16 35] [BCDA 14 23 36]
[ABCD 1 4 37] [DABC 4 11 38] [CDAB 7 16 39] [BCDA 10 23 40]
[ABCD 13 4 41] [DABC 0 11 42] [CDAB 3 16 43] [BCDA 6 23 44]
[ABCD 9 4 45] [DABC 12 11 46] [CDAB 15 16 47] [BCDA 2 23 48]
/* �4�*/
/* � [abcd k s i]表示如下操作
a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */
/* Do the following 16 operations. */
[ABCD 0 6 49] [DABC 7 10 50] [CDAB 14 15 51] [BCDA 5 21 52]
[ABCD 12 6 53] [DABC 3 10 54] [CDAB 10 15 55] [BCDA 1 21 56]
[ABCD 8 6 57] [DABC 15 10 58] [CDAB 6 15 59] [BCDA 13 21 60]
[ABCD 4 6 61] [DABC 11 10 62] [CDAB 2 15 63] [BCDA 9 21 64]
/* 然后�(jìn)行如下操� */
A = A + AA
B = B + BB
C = C + CC
D = D + DD
Next i /* �(jié)束對I的循�(huán)*/
第六�,輸出結(jié)��
A,B,C,D連續(xù)存放,共16個字節(jié)�128�。按十六�(jìn)制依次輸出這�16個字節(jié)�
,用程序語言�(shí)�(xiàn)算法�,可以輸入以下幾個信息對程序作一個簡單的測試�
看看程序有沒有錯誤�
MD5 ("") = d41d8cd98f00b204e9800998ecf8427e
MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661
MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72
MD5 ("message digest") = f96b697d7cb7938d525a2f31aaf161d0
MD5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b
MD5 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") =
d174ab98d277d9f5a5611c2c9f419d9f
MD5 ("123456789012345678901234567890123456789012345678901234567890123456789
01234567890") = 57edf4a22be3c955ac49da2e2107b67a
MD5的典型應(yīng)用是對一段信息(Message)產(chǎn)生信息摘要(Message-Digest�,以防止被篡改。比�,在UNIX下有很多軟件在下載的時候都有一個文件名相同,文件擴(kuò)展名�.md5的文件,在這個文件中通常只有一行文�,大致結(jié)�(gòu)如:
MD5 (tanajiya.tar.gz) = 0ca175b9c0f726a831d895e269332461
這就是tanajiya.tar.gz文件的數(shù)字簽�。MD5將整個文件當(dāng)作一個大文本信息� 通過其不可逆的字符串變換算�,產(chǎn)生了這個的MD5信息摘要。如果在以后傳播這個文件的過程�,無論文件的�(nèi)容發(fā)生了任何形式的改變(包括人為修改� 者下載過程中線路不穩(wěn)定引起的傳輸錯誤等),只要你對這個文件重新計(jì)算MD5時就會發(fā)�(xiàn)信息摘要不相�,由此可以確定你得到的只是一個不正確的文件。如� 再有一個第三方的認(rèn)證機(jī)�(gòu),用MD5還可以防止文件作者的"抵賴",這就是所謂的�(shù)字簽名應(yīng)��
MD5也常常在某些軟件下載站點(diǎn)的軟件信息中看到其MD5�,它的作用就在于我們可以在下載該軟件后,對下載回來的文件用專門的軟件(如Windows MD5 Check等)做一次MD5校驗(yàn),以確保我們獲得的文件與該站點(diǎn)提供的文件為同一文件。利用MD5算法來�(jìn)行文件校�(yàn)的方案被大量�(yīng)用到軟件下載�、論壇數(shù)�(jù)庫、系�(tǒng)文件、安全等方面�
MD5還廣泛用于操作系�(tǒng) 的登陸認(rèn)證上,如Unix、各類BSD系統(tǒng) � 錄密碼、數(shù)字簽名等諸多方面。如在UNIX系統(tǒng)中用戶的密碼是以MD5(或其它類似的算法)�(jīng)Hash�(yùn)算后存儲在文件系�(tǒng)中。當(dāng)用戶登錄的時�,系�(tǒng)把用 戶輸入的密碼�(jìn)行MD5 Hash�(yùn)算,然后再去和保存在文件系統(tǒng)中的MD5值�(jìn)行比�,�(jìn)而確定輸入的密碼是否正確。通過這樣的步�,系�(tǒng)在并不知道用戶密碼的明碼的情況下就可 以確定用戶登錄系�(tǒng)的合法�。這可以避免用戶的密碼被具有系�(tǒng)管理員權(quán)限的用戶知道�
WinMD5 v2.05(需�.NET�(yùn)行庫):https://www.blisstonia.com/software/WinMD5/WinMD5v2.05.zip
WinMD5 v1.1(無需.NET支持): https://www.blisstonia.com/software/WinMD5/WinMD5v1.1.zip
HashCalc v2.01:https://www.slavasoft.com/zip/hashcalc.zip
HashTab Windows Shell Extension v1.9:https://beeblebrox.org/hashtab/hashtab_setup.exe
維庫電子�,電子知�,一查百��
已收錄詞�153979�