數(shù)據(jù)加密算法之MD5算法

數(shù)據(jù)的加密重要性大家皆知,很多情況下需要對(duì)數(shù)據(jù)進(jìn)行加密處理,但各種重要數(shù)據(jù)的加密要求不一樣,有些需要時(shí)可逆的,有些是不要求可逆的,可逆的一般稱之為對(duì)稱加密算法,不可逆的一般可以成為非對(duì)稱加密算法。如登錄密碼,一般較好的方式是采用不可逆的加密算法,如MD5、SHA256、哈希數(shù)值等。今天小編就帶大家一起了解一下MD5算法。

MD5的全稱是Message-Digest Algorithm 5,在90年代初由MIT的計(jì)算機(jī)科學(xué)實(shí)驗(yàn)室和RSA Data Security Inc發(fā)明,經(jīng)MD2、MD3和MD4發(fā)展而來。

數(shù)據(jù)加密算法之MD5算法

MD5將任意長(zhǎng)度的“字節(jié)串”變換成一個(gè)128bit的大整數(shù),并且它是一個(gè)不可逆的字符串變換算法,換句話說就是,即使你看到源程序和算法描述,也無法將一個(gè)MD5的值變換回原始的字符串,從數(shù)學(xué)原理上說,是因?yàn)樵嫉淖址袩o窮多個(gè),這有點(diǎn)象不存在反函數(shù)的數(shù)學(xué)函數(shù)。

MD5的典型應(yīng)用是對(duì)一段Message(字節(jié)串)產(chǎn)生fingerprint(指紋),以防止被“篡改”。舉個(gè)例子,你將一段話寫在一個(gè)叫 readme.txt文件中,并對(duì)這個(gè)readme.txt產(chǎn)生一個(gè)MD5的值并記錄在案,然后你可以傳播這個(gè)文件給別人,別人如果修改了文件中的任何內(nèi)容,你對(duì)這個(gè)文件重新計(jì)算MD5時(shí)就會(huì)發(fā)現(xiàn)。如果再有一個(gè)第三方的認(rèn)證機(jī)構(gòu),用MD5還可以防止文件作者的“抵賴”,這就是所謂的數(shù)字簽名應(yīng)用。

MD5還廣泛用于加密和解密技術(shù)上,在很多操作系統(tǒng)中,用戶的密碼是以MD5值(或類似的其它算法)的方式保存的, 用戶Login的時(shí)候,系統(tǒng)是把用戶輸入的密碼計(jì)算成MD5值,然后再去和系統(tǒng)中保存的MD5值進(jìn)行比較,而系統(tǒng)并不“知道”用戶的密碼是什么。

在一些初始化處理后,MD5以512位分組來處理輸入文本,每一分組又劃分為16個(gè)32位子分組。算法的輸出由四個(gè)32位分組組成,將它們級(jí)聯(lián)形成一個(gè)128位散列值。

首先填充消息使其長(zhǎng)度恰好為一個(gè)比512位的倍數(shù)僅小64位的數(shù)。填充方法是附一個(gè)1在消息后面,后接所要求的多個(gè)0,然后在其后附上64位的消息長(zhǎng)度(填充前)。這兩步的作用是使消息長(zhǎng)度恰好是512位的整數(shù)倍(算法的其余部分要求如此),同時(shí)確保不同的消息在填充后不相同。

四個(gè)32位變量初始化為:

A=0x01234567
B=0x89abcdef
C=0xfedcba98
D=0x76543210

它們稱為鏈接變量(chaining variable)

接著進(jìn)行算法的主循環(huán),循環(huán)的次數(shù)是消息中512位消息分組的數(shù)目。

將上面四個(gè)變量復(fù)制到別外的變量中:A到a,B到b,C到c,D到d。

主循環(huán)有四輪(MD4只有三輪),每輪很相擬。第一輪進(jìn)行16次操作。每次操作對(duì)a,b,c和d中的其中三個(gè)作一次非線性函數(shù)運(yùn)算,然后將所得結(jié)果加上第四個(gè)變量,文本的一個(gè)子分組和一個(gè)常數(shù)。再將所得結(jié)果向右環(huán)移一個(gè)不定的數(shù),并加上a,b,c或d中之一。最后用該結(jié)果取代a,b,c或d中之一。

以一下是每次操作中用到的四個(gè)非線性函數(shù)(每輪一個(gè))。

F(X,Y,Z)=(X&Y)|((~X)&Z)
G(X,Y,Z)=(X&Z)|(Y&(~Z))
H(X,Y,Z)=X^Y^Z
I(X,Y,Z)=Y^(X|(~Z))

(&是與,|是或,~是非,^是異或)

這些函數(shù)是這樣設(shè)計(jì)的:如果X、Y和Z的對(duì)應(yīng)位是獨(dú)立和均勻的,那么結(jié)果的每一位也應(yīng)是獨(dú)立和均勻的。
函數(shù)F是按逐位方式操作:如果X,那么Y,否則Z。函數(shù)H是逐位奇偶操作符。
設(shè)Mj表示消息的第j個(gè)子分組(從0到15),<<< s表示循環(huán)左移s位,則四種操作為:

FF(a,b,c,d,Mj,s,ti)表示a=b+((a+(F(b,c,d)+Mj+ti)<<< s)
GG(a,b,c,d,Mj,s,ti)表示a=b+((a+(G(b,c,d)+Mj+ti)<<< s)
HH(a,b,c,d,Mj,s,ti)表示a=b+((a+(H(b,c,d)+Mj+ti)<<< s)
II(a,b,c,d,Mj,s,ti)表示a=b+((a+(I(b,c,d)+Mj+ti)<<< s)

這四輪(64步)是:

第一輪

FF(a,b,c,d,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,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,0xbebfbc70)
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)

第四輪

II(a,b,c,d,M0,6,0xf4292244)
II(d,a,b,c,M7,10,0x432aff97)
II(c,d,a,b,M14,15,0xab9423a7)
II(b,c,d,a,M5,21,0xfc93a039)
II(a,b,c,d,M12,6,0x655b59c3)
II(d,a,b,c,M3,10,0x8f0ccc92)
II(c,d,a,b,M10,15,0xffeff47d)
II(b,c,d,a,M1,21,0x85845dd1)
II(a,b,c,d,M8,6,0x6fa87e4f)
II(d,a,b,c,M15,10,0xfe2ce6e0)
II(c,d,a,b,M6,15,0xa3014314)
II(b,c,d,a,M13,21,0x4e0811a1)
II(a,b,c,d,M4,6,0xf7537e82)
II(d,a,b,c,M11,10,0xbd3af235)
II(c,d,a,b,M2,15,0x2ad7d2bb)
II(b,c,d,a,M9,21,0xeb86d391)

常數(shù)ti可以如下選擇:

在第i步中,ti是4294967296*abs(sin(i))的整數(shù)部分,i的單位是弧度。

(2的32次方)

所有這些完成之后,將A,B,C,D分別加上a,b,c,d。然后用下一分組數(shù)據(jù)繼續(xù)運(yùn)行算法,最后的輸出是A,B,C和D的級(jí)聯(lián)。

MD5的安全性

MD5相對(duì)MD4所作的改進(jìn):

1.增加了第四輪。

2.每一步均有唯一的加法常數(shù)。

3.為減弱第二輪中函數(shù)G的對(duì)稱性從(X&Y)|(X&Z)|(Y&Z)變?yōu)?X&Z)|(Y&(~Z))。

4.第一步加上了上一步的結(jié)果,這將引起更快的雪崩效應(yīng)。

5.改變了第二輪和第三輪中訪問消息子分組的次序,使其更不相似。

6.近似優(yōu)化了每一輪中的循環(huán)左移位移量以實(shí)現(xiàn)更快的雪崩效應(yīng)各輪的位移量互不相同。