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