MD5的全稱是Message-Digest Algorithm 5,在90年代初由MIT的計(jì)算機(jī)科學(xué)實(shí)驗(yàn)室和RSA Data Security Inc發(fā)明,經(jīng)MD2、MD3和MD4發(fā)展而來(lái)。
MD5將任意長(zhǎng)度的“字節(jié)串”變換成1個(gè)128bit的大整數(shù),并且它是1個(gè)不可逆的字符串變換算法,換句話說(shuō)就是,即便你看到源程序和算法描寫(xiě),也沒(méi)法將1個(gè)MD5的值變換回原始的字符串,從數(shù)學(xué)原理上說(shuō),是由于原始的字符串有沒(méi)有窮多個(gè),這有點(diǎn)象不存在反函數(shù)的數(shù)學(xué)函數(shù)。
MD5的典型利用是對(duì)1段Message(字節(jié)串)產(chǎn)生fingerprint(指紋),以避免被“篡改”。舉個(gè)例子,你將1段話寫(xiě)在1個(gè)叫 readme.txt文件中,并對(duì)這個(gè)readme.txt產(chǎn)生1個(gè)MD5的值并記錄在案,然后你可以傳播這個(gè)文件給他人,他人如果修改了文件中的任何內(nèi)容,你對(duì)這個(gè)文件重新計(jì)算MD5時(shí)就會(huì)發(fā)現(xiàn)。如果再有1個(gè)第3方的認(rèn)證機(jī)構(gòu),用MD5還可以避免文件作者的“抵賴”,這就是所謂的數(shù)字簽名利用。
MD5還廣泛用于加密和解密技術(shù)上,在很多操作系統(tǒng)中,用戶的密碼是以MD5值(或類似的其它算法)的方式保存的, 用戶Login的時(shí)候,系統(tǒng)是把用戶輸入的密碼計(jì)算成MD5值,然后再去和系統(tǒng)中保存的MD5值進(jìn)行比較,而系統(tǒng)其實(shí)不“知道”用戶的密碼是甚么。
RSA是第1個(gè)既能用于數(shù)據(jù)加密也能用于數(shù)字簽名的算法。它易于理解和操作,也很流行。算法的名字以發(fā)明者的名字命名:Ron Rivest, Adi Shamir 和Leonard Adleman。但RSA的安全性1直未能得到理論上的證明。它經(jīng)歷了各種攻擊,至今未被完全攻破。
美國(guó)國(guó)家標(biāo)準(zhǔn)局1973年開(kāi)始研究除國(guó)防部外的其它部門(mén)的計(jì)算機(jī)系統(tǒng)的數(shù)據(jù)加密標(biāo)準(zhǔn),于1973年5月15日和1974年8月27日前后兩次向公眾發(fā)出了征求加密算法的公告。 1977年1月,美國(guó)政府頒布:采用IBM公司設(shè)計(jì)的方案作為非機(jī)密數(shù)據(jù)的正式數(shù)據(jù)加密標(biāo)準(zhǔn)(DES?Data Encryption Standard)。
在1些初始化處理后,MD5以512位分組來(lái)處理輸入文本,每分組又劃分為16個(gè)32位子分組。算法的輸出由4個(gè)32位分組組成,將它們級(jí)聯(lián)構(gòu)成1個(gè)128位散列值。
首先填充消息使其長(zhǎng)度恰好為1個(gè)比512位的倍數(shù)僅小64位的數(shù)。填充方法是附1個(gè)1在消息后面,后接所要求的多個(gè)0,然后在其后附上64位的消息長(zhǎng)度(填充前)。這兩步的作用是使消息長(zhǎng)度恰好是512位的整數(shù)倍(算法的其余部份要求如此),同時(shí)確保不同的消息在填充后不相同。
4個(gè)32位變量初始化為:
A=0x01234567
B=0x89abcdef
C=0xfedcba98
D=0x76543210
它們稱為鏈接變量(chaining variable)
接著進(jìn)行算法的主循環(huán),循環(huán)的次數(shù)是消息中512位消息分組的數(shù)目。
將上面4個(gè)變量復(fù)制到別外的變量中:A到a,B到b,C到c,D到d。
主循環(huán)有4輪(MD4只有3輪),每輪很相擬。第1輪進(jìn)行16次操作。每次操作對(duì)a,b,c和d中的其中3個(gè)作1次非線性函數(shù)運(yùn)算,然后將所得結(jié)果加上第4個(gè)變量,文本的1個(gè)子分組和1個(gè)常數(shù)。再將所得結(jié)果向右環(huán)移1個(gè)不定的數(shù),并加上a,b,c或d中之1。最后用該結(jié)果取代a,b,c或d中之1。
以1下是每次操作中用到的4個(gè)非線性函數(shù)(每輪1個(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位,則4種操作為:
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)
這4輪(64步)是:
第1輪
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)
第2輪
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)
第3輪
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)
第4輪
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。然后用下1分組數(shù)據(jù)繼續(xù)運(yùn)行算法,最后的輸出是A,B,C和D的級(jí)聯(lián)。
MD5的安全性
MD5相對(duì)MD4所作的改進(jìn):
1.增加了第4輪.
2.每步均有唯1的加法常數(shù).
3.為減弱第2輪中函數(shù)G的對(duì)稱性從(X&Y)|(X&Z)|(Y&Z)變成(X&Z)|(Y&(~Z))
4.第1步加上了上1步的結(jié)果,這將引發(fā)更快的雪崩效應(yīng).
5.改變了第2輪和第3輪中訪問(wèn)消息子分組的次序,使其更不類似.
6.近似優(yōu)化了每輪中的循環(huán)左移位移量以實(shí)現(xiàn)更快的雪崩效應(yīng).各輪的位移量互不相同.
它是第1個(gè)既能用于數(shù)據(jù)加密也能用于數(shù)字簽名的算法。它易于理解和操作,也很流行。算法的名字以發(fā)明者的名字命名:Ron Rivest, Adi Shamir 和Leonard Adleman。但RSA的安全性1直未能得到理論上的證明。它經(jīng)歷了各種攻擊,至今未被完全攻破。
1、RSA算法 :
首先, 找出3個(gè)數(shù), p, q, r,
其中 p, q 是兩個(gè)相異的質(zhì)數(shù), r 是與 (p⑴)(q⑴) 互質(zhì)的數(shù)……
p, q, r 這3個(gè)數(shù)便是 private key
接著, 找出 m, 使得 rm == 1 mod (p⑴)(q⑴)…..
這個(gè) m 1定存在, 由于 r 與 (p⑴)(q⑴) 互質(zhì), 用展轉(zhuǎn)相除法就能夠得到了…..
再來(lái), 計(jì)算 n = pq…….
m, n 這兩個(gè)數(shù)便是 public key
編碼進(jìn)程是, 若資料為 a, 將其看成是1個(gè)大整數(shù), 假定 a < n….
如果 a >= n 的話, 就將 a 表成 s 進(jìn)位 (s <= n, 通常取 s = 2^t),
則每位數(shù)均小於 n, 然後分段編碼……
接下來(lái), 計(jì)算 b == a^m mod n, (0 <= b < n),
b 就是編碼後的資料……
解碼的進(jìn)程是, 計(jì)算 c == b^r mod pq (0 <= c < pq),
於是乎, 解碼終了…… 等會(huì)會(huì)證明 c 和 a 實(shí)際上是相等的
如果第3者進(jìn)行竊聽(tīng)時(shí), 他會(huì)得到幾個(gè)數(shù): m, n(=pq), b……
他如果要解碼的話, 必須想辦法得到 r……
所以, 他必須先對(duì) n 作質(zhì)因數(shù)分解………
要避免他分解, 最有效的方法是找兩個(gè)非常的大質(zhì)數(shù) p, q,
使第3者作因數(shù)分解時(shí)產(chǎn)生困難………
<定理>
若 p, q 是相異質(zhì)數(shù), rm == 1 mod (p⑴)(q⑴),
a 是任意1個(gè)正整數(shù), b == a^m mod pq, c == b^r mod pq,
則 c == a mod pq
證明的進(jìn)程, 會(huì)用到費(fèi)馬小定理, 敘述以下:
m 是任1質(zhì)數(shù), n 是任1整數(shù), 則 n^m == n mod m
(換另外一句話說(shuō), 如果 n 和 m 互質(zhì), 則 n^(m⑴) == 1 mod m)
應(yīng)用1些基本的群論的知識(shí), 就能夠很容易地證出費(fèi)馬小定理的……..
<證明>
由于 rm == 1 mod (p⑴)(q⑴), 所以 rm = k(p⑴)(q⑴) + 1, 其中 k 是整數(shù)
由于在 modulo 中是 preserve 乘法的
(x == y mod z and u == v mod z => xu == yv mod z),
所以, c == b^r == (a^m)^r == a^(rm) == a^(k(p⑴)(q⑴)+1) mod pq
如果 a 不是 p 的倍數(shù), 也不是 q 的倍數(shù)時(shí),
則 a^(p⑴) == 1 mod p (費(fèi)馬小定理) => a^(k(p⑴)(q⑴)) == 1 mod p
a^(q⑴) == 1 mod q (費(fèi)馬小定理) => a^(k(p⑴)(q⑴)) == 1 mod q
所以 p, q 均能整除 a^(k(p⑴)(q⑴)) - 1 => pq | a^(k(p⑴)(q⑴)) - 1
即 a^(k(p⑴)(q⑴)) == 1 mod pq
=> c == a^(k(p⑴)(q⑴)+1) == a mod pq
如果 a 是 p 的倍數(shù), 但不是 q 的倍數(shù)時(shí),
則 a^(q⑴) == 1 mod q (費(fèi)馬小定理)
=> a^(k(p⑴)(q⑴)) == 1 mod q
=> c == a^(k(p⑴)(q⑴)+1) == a mod q
=> q | c - a
因 p | a
=> c == a^(k(p⑴)(q⑴)+1) == 0 mod p
=> p | c - a
所以, pq | c - a => c == a mod pq
如果 a 是 q 的倍數(shù), 但不是 p 的倍數(shù)時(shí), 證明同上
如果 a 同時(shí)是 p 和 q 的倍數(shù)時(shí),
則 pq | a
=> c == a^(k(p⑴)(q⑴)+1) == 0 mod pq
=> pq | c - a
=> c == a mod pq
Q.E.D.
這個(gè)定理說(shuō)明 a 經(jīng)過(guò)編碼為 b 再經(jīng)過(guò)解碼為 c 時(shí), a == c mod n (n = pq)….
但我們?cè)谧鼍幋a解碼時(shí), 限制 0 <= a < n, 0 <= c < n,
所以這就是說(shuō) a 等於 c, 所以這個(gè)進(jìn)程確切能做到編碼解碼的功能…..
2、RSA 的安全性
RSA的安全性依賴于大數(shù)分解,但是不是同等于大數(shù)分解1直未能得到理論上的證明,由于沒(méi)有證明破解 RSA就1定需要作大數(shù)分解。假定存在1種不必分解大數(shù)的算法,那它肯定可以修改成為大數(shù)分解算法。目前, RSA 的1些變種算法已被證明等價(jià)于大數(shù)分解。不管怎樣,分解n是最明顯的攻擊方法。現(xiàn)在,人們已能分解多個(gè)10進(jìn)制位的大素?cái)?shù)。因此,模數(shù)n 必須選大1些,因具體適用情況而定。
3、RSA的速度
由于進(jìn)行的都是大數(shù)計(jì)算,使得RSA最快的情況也比DES慢上倍,不管是軟件還是硬件實(shí)現(xiàn)。速度1直是RSA的缺點(diǎn)。1般來(lái)講只用于少許數(shù)據(jù)加密。
4、RSA的選擇密文攻擊
RSA在選擇密文攻擊眼前很脆弱。1般攻擊者是將某1信息作1下假裝( Blind),讓具有私鑰的實(shí)體簽署。然后,經(jīng)過(guò)計(jì)算便可得到它所想要的信息。實(shí)際上,攻擊利用的都是同1個(gè)弱點(diǎn),即存在這樣1個(gè)事實(shí):乘冪保存了輸入的乘法結(jié)構(gòu):
( XM )^d = X^d *M^d mod n
前面已提到,這個(gè)固有的問(wèn)題來(lái)自于公鑰密碼系統(tǒng)的最有用的特點(diǎn)–每一個(gè)人都能使用公鑰。但從算法上沒(méi)法解決這1問(wèn)題,主要措施有兩條:1條是采取好的公鑰協(xié)議,保證工作進(jìn)程中實(shí)體不對(duì)其他實(shí)體任意產(chǎn)生的信息解密,不對(duì)自己1無(wú)所知的信息簽名;另外一條是決不對(duì)陌生人送來(lái)的隨機(jī)文檔簽名,簽名時(shí)首先使用One-Way HashFunction 對(duì)文檔作HASH處理,或同時(shí)使用不同的簽名算法。在中提到了幾種不同類型的攻擊方法。
5、RSA的公共模數(shù)攻擊
若系統(tǒng)中共有1個(gè)模數(shù),只是不同的人具有不同的e和d,系統(tǒng)將是危險(xiǎn)的。最普遍的情況是同1信息用不同的公鑰加密,這些公鑰共模而且互質(zhì),那么該信息無(wú)需私鑰便可得到恢復(fù)。設(shè)P為信息明文,兩個(gè)加密密鑰為e1和e2,公共模數(shù)是n,則:
C1 = P^e1 mod n
C2 = P^e2 mod n
密碼分析者知道n、e1、e2、C1和C2,就可以得到P。
由于e1和e2互質(zhì),故用Euclidean算法能找到r和s,滿足:
r * e1 + s * e2 = 1
假定r為負(fù)數(shù),需再用Euclidean算法計(jì)算C1^(⑴),則
( C1^(⑴) )^(-r) * C2^s = P mod n
另外,還有其它幾種利用公共模數(shù)攻擊的方法。總之,如果知道給定模數(shù)的1對(duì)e和d,1是有益于攻擊者分解模數(shù),1是有益于攻擊者計(jì)算出其它成對(duì)的e’和d’,而無(wú)需分解模數(shù)。解決辦法只有1個(gè),那就是不要同享模數(shù)n。
RSA的小指數(shù)攻擊。 有1種提高 RSA速度的建議是使公鑰e取較小的值,這樣會(huì)使加密變得易于實(shí)現(xiàn),速度有
所提高。但這樣作是不安全的,對(duì)付辦法就是e和d都取較大的值。
RSA算法是第1個(gè)能同時(shí)用于加密和數(shù)字簽名的算法,也易于理解和操作。RSA是被研究得最廣泛的公鑰算法,從提出到現(xiàn)在已近210年,經(jīng)歷了各種攻擊的考驗(yàn),逐步為人們接受,普遍認(rèn)為是目前最優(yōu)秀的公鑰方案之1。RSA的安全性依賴于大數(shù)的因子分解,但并沒(méi)有從理論上證明破譯RSA的難度與大數(shù)分解難度等價(jià)。即RSA的重大缺點(diǎn)是沒(méi)法從理論上掌控它的保密性能如何,而且密碼學(xué)界多數(shù)人士偏向于因子分解不是NPC問(wèn)題。 RSA的缺點(diǎn)主要有:A)產(chǎn)生密鑰很麻煩,遭到素?cái)?shù)產(chǎn)生技術(shù)的限制,因此難以做到1次1密。B)分組長(zhǎng)度太大,為保證安全性,n 最少也要 600 bits 以上,使運(yùn)算代價(jià)很高,特別是速度較慢,較對(duì)稱密碼算法慢幾個(gè)數(shù)量級(jí);且隨著大數(shù)分解技術(shù)的發(fā)展,這個(gè)長(zhǎng)度還在增加,不利于數(shù)據(jù)格式的標(biāo)準(zhǔn)化。目前,SET( Secure Electronic Transaction )協(xié)議中要求CA采取比特長(zhǎng)的密鑰,其他實(shí)體使用比特的密鑰。
1、DES算法
美國(guó)國(guó)家標(biāo)準(zhǔn)局1973年開(kāi)始研究除國(guó)防部外的其它部門(mén)的計(jì)算機(jī)系統(tǒng)的數(shù)據(jù)加密標(biāo)準(zhǔn),于1973年5月15日和1974年8月27日前后兩次向公眾發(fā)出了征求加密算法的公告。加密算法要到達(dá)的目的(通常稱為DES 密碼算法要求)主要為以下4點(diǎn): ☆提供高質(zhì)量的數(shù)據(jù)保護(hù),避免數(shù)據(jù)未經(jīng)授權(quán)的泄漏和未被發(fā)覺(jué)的修改;
☆具有相當(dāng)高的復(fù)雜性,使得破譯的開(kāi)消超過(guò)可能取得的利益,同時(shí)又要便于理解和掌握;
☆DES密碼體制的安全性應(yīng)當(dāng)不依賴于算法的保密,其安全性僅以加密密鑰的保密為基礎(chǔ);
☆實(shí)現(xiàn)經(jīng)濟(jì),運(yùn)行有效,并且適用于多種完全不同的利用。
1977年1月,美國(guó)政府頒布:采用IBM公司設(shè)計(jì)的方案作為非機(jī)密數(shù)據(jù)的正式數(shù)據(jù)加密標(biāo)準(zhǔn)(DES?Data Encryption Standard)。
目前在國(guó)內(nèi),隨著3金工程特別是金卡工程的啟動(dòng),DES算法在POS、ATM、磁卡及智能卡(IC卡)、加油站、高速公路收費(fèi)站等領(lǐng)域被廣泛利用,以此來(lái)實(shí)現(xiàn)關(guān)鍵數(shù)據(jù)的保密,如信譽(yù)卡持卡人的PIN的加密傳輸,IC卡與POS間的雙向認(rèn)證、金融交易數(shù)據(jù)包的MAC校驗(yàn)等,均用到DES算法。
DES算法的入口參數(shù)有3個(gè):Key、Data、Mode。其中Key為8個(gè)字節(jié)共64位,是DES算法的工作密鑰;Data也為8個(gè)字節(jié)64位,是要被加密或被解密的數(shù)據(jù);Mode為DES的工作方式,有兩種:加密或解密。
DES算法是這樣工作的:如Mode為加密,則用Key 去把數(shù)據(jù)Data進(jìn)行加密, 生成Data的密碼情勢(shì)(64位)作為DES的輸出結(jié)果;如Mode為解密,則用Key去把密碼情勢(shì)的數(shù)據(jù)Data解密,還原為Data的明碼情勢(shì)(64位)作為DES的輸出結(jié)果。在通訊網(wǎng)絡(luò)的兩端,雙方約定1致的Key,在通訊的源點(diǎn)用Key對(duì)核心數(shù)據(jù)進(jìn)行DES加密,然后以密碼情勢(shì)在公共通訊網(wǎng)(如電話網(wǎng))中傳輸?shù)酵ㄓ嵕W(wǎng)絡(luò)的終點(diǎn),數(shù)據(jù)到達(dá)目的地后,用一樣的Key對(duì)密碼數(shù)據(jù)進(jìn)行解密,便再現(xiàn)了明碼情勢(shì)的核心數(shù)據(jù)。這樣,便保證了核心數(shù)據(jù)(如PIN、MAC等)在公共通訊網(wǎng)中傳輸?shù)陌踩院涂煽啃浴?
通過(guò)定期在通訊網(wǎng)絡(luò)的源端和目的端同時(shí)改用新的Key,便能更進(jìn)1步提高數(shù)據(jù)的保密性,這正是現(xiàn)在金融交易網(wǎng)絡(luò)的流行做法。
DES算法詳述
DES算法把64位的明文輸入塊變成64位的密文輸出塊,它所使用的密鑰也是64位,全部算法的主流程圖以下:
其功能是把輸入的64位數(shù)據(jù)塊按位重新組合,并把輸出分為L(zhǎng)0、R0兩部份,每部份各長(zhǎng)32位,其置換規(guī)則見(jiàn)下表:
58,50,12,34,26,18,10,2,60,52,44,36,28,20,12,4,
62,54,46,38,30,22,14,6,64,56,48,40,32,24,16,8,
57,49,41,33,25,17, 9,1,59,51,43,35,27,19,11,3,
61,53,45,37,29,21,13,5,63,55,47,39,31,23,15,7,
行將輸入的第58位換到第1位,第50位換到第2位,…,依此類推,最后1位是原來(lái)的第7位。L0、R0則是換位輸出后的兩部份,L0是輸出的左32位,R0 是右32位,例:設(shè)置換前的輸入值為D1D2D3……D64,則經(jīng)過(guò)初始置換后的結(jié)果為:L0=D58D50…D8;R0=D57D49…D7。
經(jīng)過(guò)16次迭代運(yùn)算后。得到L16、R16,將此作為輸入,進(jìn)行逆置換,即得到密文輸出。逆置換正好是初始置的逆運(yùn)算,例如,第1位經(jīng)過(guò)初始置換后,處于第40位,而通過(guò)逆置換,又將第40位換回到第1位,其逆置換規(guī)則以下表所示:
40,8,48,16,56,24,64,32,39,7,47,15,55,23,63,31,
38,6,46,14,54,22,62,30,37,5,45,13,53,21,61,29,
36,4,44,12,52,20,60,28,35,3,43,11,51,19,59,27,
34,2,42,10,50,18,58 26,33,1,41, 9,49,17,57,25,
放大換位表
32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9, 8, 9, 10,11,
12,13,12,13,14,15,16,17,16,17,18,19,20,21,20,21,
22,23,24,25,24,25,26,27,28,29,28,29,30,31,32, 1,
單純換位表
16,7,20,21,29,12,28,17, 1,15,23,26, 5,18,31,10,
2,8,24,14,32,27, 3, 9,19,13,30, 6,22,11, 4,25,
在f(Ri,Ki)算法描寫(xiě)圖中,S1,S2…S8為選擇函數(shù),其功能是把6bit數(shù)據(jù)變成4bit數(shù)據(jù)。下面給出選擇函數(shù)Si(i=1,2……的功能表:
選擇函數(shù)Si
S1:
14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7,
0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8,
4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0,
15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13,
S2:
15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10,
3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5,
0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15,
13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9,
S3:
10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8,
13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1,
13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7,
1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12,
S4:
7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15,
13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9,
10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4,
3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14,
S5:
2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9,
14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6,
4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14,
11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3,
S6:
12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11,
10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8,
9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6,
4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13,
S7:
4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1,
13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6,
1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2,
6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12,
S8:
13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7,
1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2,
7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8,
2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11,
在此以S1為例說(shuō)明其功能,我們可以看到:在S1中,共有4行數(shù)據(jù),命名為0,1、2、3行;每行有16列,命名為0、1、2、3,……,14、15列。
現(xiàn)設(shè)輸入為: D=D1D2D3D4D5D6
令:列=D2D3D4D5
行=D1D6
然后在S1表中查得對(duì)應(yīng)的數(shù),以4位2進(jìn)制表示,此即為選擇函數(shù)S1的輸出。下面給出子密鑰Ki(48bit)的生成算法
從子密鑰Ki的生成算法描寫(xiě)圖中我們可以看到:初始Key值為64位,但DES算法規(guī)定,其中第8、16、……64位是奇偶校驗(yàn)位,不參與DES運(yùn)算。故Key 實(shí)際可用位數(shù)便只有56位。即:經(jīng)過(guò)縮小選擇換位表1的變換后,Key 的位數(shù)由64 位變成了56位,此56位分為C0、D0兩部份,各28位,然后分別進(jìn)行第1次循環(huán)左移,得到C1、D1,將C1(28位)、D1(28位)合并得到56位,再經(jīng)過(guò)縮小選擇換位2,從而便得到了密鑰K0(48位)。依此類推,即可得到K1、K2、……、K15,不過(guò)需要注意的是,16次循環(huán)左移對(duì)應(yīng)的左移位數(shù)要根據(jù)下述規(guī)則進(jìn)行:
循環(huán)左移位數(shù)
1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1
以上介紹了DES算法的加密進(jìn)程。DES算法的解密進(jìn)程是1樣的,區(qū)分僅僅在于第1次迭代時(shí)用子密鑰K15,第2次K14、……,最后1次用K0,算法本身并沒(méi)有任何變化。
2、DES算法理論圖解
DES的算法是對(duì)稱的,既可用于加密又可用于解密。下圖是它的算法粗框圖。其具體運(yùn)算進(jìn)程有以下7步。
<缺:找到補(bǔ)上>
3、DES算法的利用誤區(qū)
DES算法具有極高安全性,到目前為止,除用窮舉搜索法對(duì)DES算法進(jìn)行攻擊外,還沒(méi)有發(fā)現(xiàn)更有效的辦法。而56位長(zhǎng)的密鑰的窮舉空間為256,這意味著如果1臺(tái)計(jì)算機(jī)的速度是每秒種檢測(cè)1百萬(wàn)個(gè)密鑰,則它搜索完全部密鑰就需要將近2285年的時(shí)間,可見(jiàn),這是難以實(shí)現(xiàn)的,固然,隨著科學(xué)技術(shù)的發(fā)展,當(dāng)出現(xiàn)超高速計(jì)算機(jī)后,我們可斟酌把DES密鑰的長(zhǎng)度再增長(zhǎng)1些,以此來(lái)到達(dá)更高的保密程度。
由上述DES算法介紹我們可以看到:DES算法中只用到64位密鑰中的其中56位,而第8、16、24、……64位8個(gè)位并未參與DES運(yùn)算,這1點(diǎn),向我們提出了1個(gè)利用上的要求,即DES的安全性是基于除8,16,24,……64位外的其余56位的組合變化256才得以保證的。因此,在實(shí)際利用中,我們應(yīng)避開(kāi)使用第8,16,24,……64位作為有效數(shù)據(jù)位,而使用其它的56位作為有效數(shù)據(jù)位,才能保證DES算法安全可靠地發(fā)揮作用。如果不了解這1點(diǎn),把密鑰Key的8,16,24,….. .64位作為有效數(shù)據(jù)使用,將不能保證DES加密數(shù)據(jù)的安全性,對(duì)應(yīng)用DES來(lái)到達(dá)保密作用的系統(tǒng)產(chǎn)生數(shù)據(jù)被破譯的危險(xiǎn),這正是DES算法在利用上的誤區(qū),留下了被人攻擊、被人破譯的極大隱患。
上一篇 Java數(shù)據(jù)結(jié)構(gòu)和算法——棧
下一篇 跟Google學(xué)寫(xiě)代碼:Interacting with Other Apps【Capture Photo from phone】