3個著名加密算法(MD5、RSA、DES)的解析

MD5的全稱是Message-Digest Algorithm 5,在90年代初由MIT的計算機科學實驗室和RSA Data Security Inc發明,經MD2、MD3和MD4發展而來。
? ? ? ?MD5將任意長度的“字節串”變換成一個128bit的大整數,并且它是一個不可逆的字符串變換算法,換句話說就是,即使你看到源程序和算法描述,也無法將一個MD5的值變換回原始的字符串,從數學原理上說,是因為原始的字符串有無窮多個,這有點象不存在反函數的數學函數。

? ? ? MD5的典型應用是對一段Message(字節串)產生fingerprint(指紋),以防止被“篡改”。舉個例子,你將一段話寫在一個叫 readme.txt文件中,并對這個readme.txt產生一個MD5的值并記錄在案,然后你可以傳播這個文件給別人,別人如果修改了文件中的任何內容,你對這個文件重新計算MD5時就會發現。如果再有一個第三方的認證機構,用MD5還可以防止文件作者的“抵賴”,這就是所謂的數字簽名應用。
??? MD5還廣泛用于加密和解密技術上,在很多操作系統中,用戶的密碼是以MD5值(或類似的其它算法)的方式保存的, 用戶Login的時候,系統是把用戶輸入的密碼計算成MD5值,然后再去和系統中保存的MD5值進行比較,而系統并不“知道”用戶的密碼是什么。

? ? ? ?RSA是第一個既能用于數據加密也能用于數字簽名的算法。它易于理解和操作,也很流行。算法的名字以發明者的名字命名:Ron?Rivest,?Adi?Shamir?和Leonard?Adleman。但RSA的安全性一直未能得到理論上的證明。它經歷了各種攻擊,至今未被完全攻破。?

DES算法?
美國國家標準局1973年開始研究除國防部外的其它部門的計算機系統的數據加密標準,于1973年5月15日和1974年8月27日先后兩次向公眾發出了征求加密算法的公告。?1977年1月,美國政府頒布:采納IBM公司設計的方案作為非機密數據的正式數據加密標準(DES?Data?Encryption?Standard)。?

1.加密算法之MD5算法

在一些初始化處理后,MD5以512位分組來處理輸入文本,每一分組又劃分為16個32位子分組。算法的輸出由四個32位分組組成,將它們級聯形成一個128位散列值。?
首先填充消息使其長度恰好為一個比512位的倍數僅小64位的數。填充方法是附一個1在消息后面,后接所要求的多個0,然后在其后附上64位的消息長度(填充前)。這兩步的作用是使消息長度恰好是512位的整數倍(算法的其余部分要求如此),同時確保不同的消息在填充后不相同。?
四個32位變量初始化為:?
A=0x01234567?
B=0x89abcdef?
C=0xfedcba98?
D=0x76543210?
它們稱為鏈接變量(chaining?variable)?
接著進行算法的主循環,循環的次數是消息中512位消息分組的數目。?
將上面四個變量復制到別外的變量中:A到a,B到b,C到c,D到d。?
主循環有四輪(MD4只有三輪),每輪很相擬。第一輪進行16次操作。每次操作對a,b,c和d中的其中三個作一次非線性函數運算,然后將所得結果加上第四個變量,文本的一個子分組和一個常數。再將所得結果向右環移一個不定的數,并加上a,b,c或d中之一。最后用該結果取代a,b,c或d中之一。?
以一下是每次操作中用到的四個非線性函數(每輪一個)。?
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))?
(&是與,|是或,~是非,^是異或)?
這些函數是這樣設計的:如果X、Y和Z的對應位是獨立和均勻的,那么結果的每一位也應是獨立和均勻的。?
函數F是按逐位方式操作:如果X,那么Y,否則Z。函數H是逐位奇偶操作符。?
設Mj表示消息的第j個子分組(從0到15),<<<?s表示循環左移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)?
常數ti可以如下選擇:?
在第i步中,ti是4294967296*abs(sin(i))的整數部分,i的單位是弧度。?
(2的32次方)?
所有這些完成之后,將A,B,C,D分別加上a,b,c,d。然后用下一分組數據繼續運行算法,最后的輸出是A,B,C和D的級聯。?
MD5的安全性?

MD5相對MD4所作的改進:?
1.增加了第四輪.?
2.每一步均有唯一的加法常數.?
3.為減弱第二輪中函數G的對稱性從(X&Y)|(X&Z)|(Y&Z)變為(X&Z)|(Y&(~Z))?
4.第一步加上了上一步的結果,這將引起更快的雪崩效應.?
5.改變了第二輪和第三輪中訪問消息子分組的次序,使其更不相似.?
6.近似優化了每一輪中的循環左移位移量以實現更快的雪崩效應.各輪的位移量互不相同.

2.加密算法之RSA算法

  它是第一個既能用于數據加密也能用于數字簽名的算法。它易于理解和操作,也很流行。算法的名字以發明者的名字命名:Ron?Rivest,?Adi?Shamir?和Leonard?Adleman。但RSA的安全性一直未能得到理論上的證明。它經歷了各種攻擊,至今未被完全攻破。?

  一、RSA算法?:?

  首先,?找出三個數,?p,?q,?r,?
  ?其中?p,?q?是兩個相異的質數,?r?是與?(p-1)(q-1)?互質的數......?
  ?p,?q,?r?這三個數便是?private?key?

  接著,?找出?m,?使得?rm?==?1?mod?(p-1)(q-1).....?
  ?這個?m?一定存在,?因為?r?與?(p-1)(q-1)?互質,?用輾轉相除法就可以得到了.....?
  ?再來,?計算?n?=?pq.......?
  ?m,?n?這兩個數便是?public?key?

  編碼過程是,?若資料為?a,?將其看成是一個大整數,?假設?a?<?n....?
  ?如果?a?>=?n?的話,?就將?a?表成?s?進位?(s?<=?n,?通常取?s?=?2^t),?
  ?則每一位數均小於?n,?然後分段編碼......?
  ?接下來,?計算?b?==?a^m?mod?n,?(0?<=?b?<?n),?
  ?b?就是編碼後的資料......?

  解碼的過程是,?計算?c?==?b^r?mod?pq?(0?<=?c?<?pq),?
  ?於是乎,?解碼完畢......?等會會證明?c?和?a?其實是相等的?

  如果第三者進行竊聽時,?他會得到幾個數:?m,?n(=pq),?b......?
  ?他如果要解碼的話,?必須想辦法得到?r......?
  ?所以,?他必須先對?n?作質因數分解.........?
  ?要防止他分解,?最有效的方法是找兩個非常的大質數?p,?q,?
  ?使第三者作因數分解時發生困難.........?

  <定理>?
  ?若?p,?q?是相異質數,?rm?==?1?mod?(p-1)(q-1),?
  ?a?是任意一個正整數,?b?==?a^m?mod?pq,?c?==?b^r?mod?pq,?
  ?則?c?==?a?mod?pq?

  證明的過程,?會用到費馬小定理,?敘述如下:?
  ?m?是任一質數,?n?是任一整數,?則?n^m?==?n?mod?m?
  ?(換另一句話說,?如果?n?和?m?互質,?則?n^(m-1)?==?1?mod?m)?
  ?運用一些基本的群論的知識,?就可以很容易地證出費馬小定理的........?

  <證明>?
  ?因為?rm?==?1?mod?(p-1)(q-1),?所以?rm?=?k(p-1)(q-1)?+?1,?其中?k?是整數?
  ?因為在?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-1)(q-1)+1)?mod?pq?

  1.?如果?a?不是?p?的倍數,?也不是?q?的倍數時,?
  ?則?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?

  2.?如果?a?是?p?的倍數,?但不是?q?的倍數時,?
  ?則?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?

  3.?如果?a?是?q?的倍數,?但不是?p?的倍數時,?證明同上?

  4.?如果?a?同時是?p?和?q?的倍數時,?
  ?則?pq?|?a?
  ?=>?c?==?a^(k(p-1)(q-1)+1)?==?0?mod?pq?
  ?=>?pq?|?c?-?a?
  ?=>?c?==?a?mod?pq?
  ?Q.E.D.?

  這個定理說明?a?經過編碼為?b?再經過解碼為?c?時,?a?==?c?mod?n?(n?=?pq)....?
  ?但我們在做編碼解碼時,?限制?0?<=?a?<?n,?0?<=?c?<?n,?
  ?所以這就是說?a?等於?c,?所以這個過程確實能做到編碼解碼的功能.....?

  二、RSA?的安全性?

  RSA的安全性依賴于大數分解,但是否等同于大數分解一直未能得到理論上的證明,因為沒有證明破解?RSA就一定需要作大數分解。假設存在一種無須分解大數的算法,那它肯定可以修改成為大數分解算法。目前,?RSA?的一些變種算法已被證明等價于大數分解。不管怎樣,分解n是最顯然的攻擊方法。現在,人們已能分解多個十進制位的大素數。因此,模數n?必須選大一些,因具體適用情況而定。?

  三、RSA的速度?

  由于進行的都是大數計算,使得RSA最快的情況也比DES慢上倍,無論是軟件還是硬件實現。速度一直是RSA的缺陷。一般來說只用于少量數據加密。?

  四、RSA的選擇密文攻擊?

  RSA在選擇密文攻擊面前很脆弱。一般攻擊者是將某一信息作一下偽裝(?Blind),讓擁有私鑰的實體簽署。然后,經過計算就可得到它所想要的信息。實際上,攻擊利用的都是同一個弱點,即存在這樣一個事實:乘冪保留了輸入的乘法結構:?

  (?XM?)^d?=?X^d?*M^d?mod?n?

  前面已經提到,這個固有的問題來自于公鑰密碼系統的最有用的特征--每個人都能使用公鑰。但從算法上無法解決這一問題,主要措施有兩條:一條是采用好的公鑰協議,保證工作過程中實體不對其他實體任意產生的信息解密,不對自己一無所知的信息簽名;另一條是決不對陌生人送來的隨機文檔簽名,簽名時首先使用One-Way?HashFunction?對文檔作HASH處理,或同時使用不同的簽名算法。在中提到了幾種不同類型的攻擊方法。?

  五、RSA的公共模數攻擊?

  若系統中共有一個模數,只是不同的人擁有不同的e和d,系統將是危險的。最普遍的情況是同一信息用不同的公鑰加密,這些公鑰共模而且互質,那末該信息無需私鑰就可得到恢復。設P為信息明文,兩個加密密鑰為e1和e2,公共模數是n,則:?

  C1?=?P^e1?mod?n?

  C2?=?P^e2?mod?n?

  密碼分析者知道n、e1、e2、C1和C2,就能得到P。?

  因為e1和e2互質,故用Euclidean算法能找到r和s,滿足:?

  r?*?e1?+?s?*?e2?=?1?

  假設r為負數,需再用Euclidean算法計算C1^(-1),則?

  (?C1^(-1)?)^(-r)?*?C2^s?=?P?mod?n?

  另外,還有其它幾種利用公共模數攻擊的方法。總之,如果知道給定模數的一對e和d,一是有利于攻擊者分解模數,一是有利于攻擊者計算出其它成對的e’和d’,而無需分解模數。解決辦法只有一個,那就是不要共享模數n。?

  RSA的小指數攻擊。?有一種提高?RSA速度的建議是使公鑰e取較小的值,這樣會使加密變得易于實現,速度有?
所提高。但這樣作是不安全的,對付辦法就是e和d都取較大的值。?

  RSA算法是第一個能同時用于加密和數字簽名的算法,也易于理解和操作。RSA是被研究得最廣泛的公鑰算法,從提出到現在已近二十年,經歷了各種攻擊的考驗,逐漸為人們接受,普遍認為是目前最優秀的公鑰方案之一。RSA的安全性依賴于大數的因子分解,但并沒有從理論上證明破譯RSA的難度與大數分解難度等價。即RSA的重大缺陷是無法從理論上把握它的保密性能如何,而且密碼學界多數人士傾向于因子分解不是NPC問題。?RSA的缺點主要有:A)產生密鑰很麻煩,受到素數產生技術的限制,因而難以做到一次一密。B)分組長度太大,為保證安全性,n?至少也要?600?bits?以上,使運算代價很高,尤其是速度較慢,較對稱密碼算法慢幾個數量級;且隨著大數分解技術的發展,這個長度還在增加,不利于數據格式的標準化。目前,SET(?Secure?Electronic?Transaction?)協議中要求CA采用比特長的密鑰,其他實體使用比特的密鑰。

3.加密算法之DES算法

一、DES算法?

  美國國家標準局1973年開始研究除國防部外的其它部門的計算機系統的數據加密標準,于1973年5月15日和1974年8月27日先后兩次向公眾發出了征求加密算法的公告。加密算法要達到的目的(通常稱為DES?密碼算法要求)主要為以下四點:?☆提供高質量的數據保護,防止數據未經授權的泄露和未被察覺的修改;?

☆具有相當高的復雜性,使得破譯的開銷超過可能獲得的利益,同時又要便于理解和掌握;?

☆DES密碼體制的安全性應該不依賴于算法的保密,其安全性僅以加密密鑰的保密為基礎;?

☆實現經濟,運行有效,并且適用于多種完全不同的應用。?

1977年1月,美國政府頒布:采納IBM公司設計的方案作為非機密數據的正式數據加密標準(DES?Data?Encryption?Standard)。?

  目前在國內,隨著三金工程尤其是金卡工程的啟動,DES算法在POS、ATM、磁卡及智能卡(IC卡)、加油站、高速公路收費站等領域被廣泛應用,以此來實現關鍵數據的保密,如信用卡持卡人的PIN的加密傳輸,IC卡與POS間的雙向認證、金融交易數據包的MAC校驗等,均用到DES算法。?
  DES算法的入口參數有三個:Key、Data、Mode。其中Key為8個字節共64位,是DES算法的工作密鑰;Data也為8個字節64位,是要被加密或被解密的數據;Mode為DES的工作方式,有兩種:加密或解密。?
  DES算法是這樣工作的:如Mode為加密,則用Key?去把數據Data進行加密,?生成Data的密碼形式(64位)作為DES的輸出結果;如Mode為解密,則用Key去把密碼形式的數據Data解密,還原為Data的明碼形式(64位)作為DES的輸出結果。在通信網絡的兩端,雙方約定一致的Key,在通信的源點用Key對核心數據進行DES加密,然后以密碼形式在公共通信網(如電話網)中傳輸到通信網絡的終點,數據到達目的地后,用同樣的Key對密碼數據進行解密,便再現了明碼形式的核心數據。這樣,便保證了核心數據(如PIN、MAC等)在公共通信網中傳輸的安全性和可靠性。?
  通過定期在通信網絡的源端和目的端同時改用新的Key,便能更進一步提高數據的保密性,這正是現在金融交易網絡的流行做法。?
  DES算法詳述?
  DES算法把64位的明文輸入塊變為64位的密文輸出塊,它所使用的密鑰也是64位,整個算法的主流程圖如下:?
其功能是把輸入的64位數據塊按位重新組合,并把輸出分為L0、R0兩部分,每部分各長32位,其置換規則見下表:?
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,則經過初始置換后的結果為:L0=D58D50...D8;R0=D57D49...D7。?
  經過16次迭代運算后。得到L16、R16,將此作為輸入,進行逆置換,即得到密文輸出。逆置換正好是初始置的逆運算,例如,第1位經過初始置換后,處于第40位,而通過逆置換,又將第40位換回到第1位,其逆置換規則如下表所示:?
  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為選擇函數,其功能是把6bit數據變為4bit數據。下面給出選擇函數Si(i=1,2......的功能表:?
選擇函數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行數據,命名為0,1、2、3行;每行有16列,命名為0、1、2、3,......,14、15列。?
  現設輸入為:?D=D1D2D3D4D5D6?
令:列=D2D3D4D5?
  行=D1D6?
  然后在S1表中查得對應的數,以4位二進制表示,此即為選擇函數S1的輸出。下面給出子密鑰Ki(48bit)的生成算法?
  從子密鑰Ki的生成算法描述圖中我們可以看到:初始Key值為64位,但DES算法規定,其中第8、16、......64位是奇偶校驗位,不參與DES運算。故Key?實際可用位數便只有56位。即:經過縮小選擇換位表1的變換后,Key?的位數由64?位變成了56位,此56位分為C0、D0兩部分,各28位,然后分別進行第1次循環左移,得到C1、D1,將C1(28位)、D1(28位)合并得到56位,再經過縮小選擇換位2,從而便得到了密鑰K0(48位)。依此類推,便可得到K1、K2、......、K15,不過需要注意的是,16次循環左移對應的左移位數要依據下述規則進行:?
循環左移位數?
1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1?
  以上介紹了DES算法的加密過程。DES算法的解密過程是一樣的,區別僅僅在于第一次迭代時用子密鑰K15,第二次K14、......,最后一次用K0,算法本身并沒有任何變化。?

二、DES算法理論圖解?

DES的算法是對稱的,既可用于加密又可用于解密。下圖是它的算法粗框圖。其具體運算過程有如下七步。?
<缺:找到補上>?

三、DES算法的應用誤區 ?

  DES算法具有極高安全性,到目前為止,除了用窮舉搜索法對DES算法進行攻擊外,還沒有發現更有效的辦法。而56位長的密鑰的窮舉空間為256,這意味著如果一臺計算機的速度是每一秒種檢測一百萬個密鑰,則它搜索完全部密鑰就需要將近2285年的時間,可見,這是難以實現的,當然,隨著科學技術的發展,當出現超高速計算機后,我們可考慮把DES密鑰的長度再增長一些,以此來達到更高的保密程度。?
  由上述DES算法介紹我們可以看到:DES算法中只用到64位密鑰中的其中56位,而第8、16、24、......64位8個位并未參與DES運算,這一點,向我們提出了一個應用上的要求,即DES的安全性是基于除了8,16,24,......64位外的其余56位的組合變化256才得以保證的。因此,在實際應用中,我們應避開使用第8,16,24,......64位作為有效數據位,而使用其它的56位作為有效數據位,才能保證DES算法安全可靠地發揮作用。如果不了解這一點,把密鑰Key的8,16,24,.....?.64位作為有效數據使用,將不能保證DES加密數據的安全性,對運用DES來達到保密作用的系統產生數據被破譯的危險,這正是DES算法在應用上的誤區,留下了被人攻擊、被人破譯的極大隱患。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/451560.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/451560.shtml
英文地址,請注明出處:http://en.pswp.cn/news/451560.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

想念我的大大的石

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 // ------- 甘愿用我的一生去追尋 ... 想念我的大石頭&#xff1a; 想念會默默陪著我&#xff0c;一直從烈日咫尺坐到黃昏浸透蔓蔓云層…

Java 中的悲觀鎖、樂觀鎖、自旋鎖、適應性自旋鎖、偏向鎖、輕量級鎖、重量級鎖、公平鎖、非公平鎖、可重入鎖、共享鎖等

參考文獻&#xff1a; 不可不說的Java“鎖”事 java并發進階 感謝美團技術團隊&#xff01; 感謝JavaGuide&#xff01;

Git 的origin和master解析

首先要明確一點&#xff0c;對git的操作是圍繞3個大的步驟來展開的&#xff08;其實幾乎所有的SCM都是這樣&#xff09; 1. 從git取數據&#xff08;git clone&#xff09; 2. 改動代碼 3. 將改動傳回git&#xff08;git push&#xff09; 這3個步驟又涉及到兩個re…

end to end testing

概念 https://www.softwaretestinghelp.com/what-is-end-to-end-testing/ What is “End to End Testing”? Term “End to End testing” is defined as a testing method which determines whether the performance of an application is as per the requirement or not. It…

windows下安裝mysql 開機啟動

1 下載地址 http://dev.mysql.com/downloads/installer/ 2 下載版本 mysql community server 5.7.x 這個版本是一個傻瓜版本&#xff0c;設置root密碼之后就可以啟動服務了&#xff0c;不用自己配置&#xff0c;還有workbench可用。轉載于:https://www.cnblogs.com/hustdc/p/91…

Linux目錄架構詳解

Linux和Windows操作系統的顯著區別之一就是目錄架構的不同。Linux操作系統的目錄架構遵循文件系統層級結構標準。不知你是否使用ls命令瀏覽過Linux的根目錄“/”&#xff0c;親愛的讀者&#xff0c;您都了解這些目錄的含義嗎&#xff1f; ls -l / 遍歷文件系統&#xff08;點擊…

越陽光明媚....

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 窗外陽光明媚&#xff0c;而心卻如此哀傷... 很喜歡陽光明媚&#xff0c;很喜歡春暖花開&#xff0c; 窗外有幾片莊稼地&#xff1a;滿…

Linux的學習:

查看端口&#xff1a; netstat -anop | grep 80 netstat -ntlp 先看看不帶n的 再看看帶n的 我們發現在local address 即主機地址這一欄中&#xff0c;如果沒有帶n選項&#xff0c;會將套接字所對應的域名解析出來&#xff0c;如果加上n選項&#xff0c;那么就不會顯示&#xff…

基于TCP協議的Socket通信

參考文章&#xff1a; Socket學習網絡基礎準備 基于TCP協議的Socket通信(1) 基于TCP協議的Socket通信(2) 感謝菜鳥分享&#xff01;

git pull命令

git pull命令作用&#xff1a;從另一個存儲庫或本地分支關聯的遠端分支獲取最新代碼&#xff0c;并與本地代碼資源整合。git pull命令執行過程&#xff1a;取回遠程主機某個分支的更新&#xff0c;再與本地的指定分支合并&#xff08;可能存在需手動解決的沖突&#xff09;。 …

RPM的用法

RPM 有五種基本的操作方式(不包括創建軟件包): 安裝, 卸載, 升級, 查詢,和驗證。 下面我們就來逐一的講解吧。 一、 安裝RPM包 RPM 軟件包通常具有類似foo-1.0-1.i386.rpm 的文件名。其中包括 軟件包的名稱(foo)&#xff0c;版本號(1.0)&#xff0c;發行號(1)&#xff0c; 和 硬…

Unix 多進程編程

一.多進程程序的特點由于UNIX系統是分時多用戶系統, CPU按時間片分配給各個用戶使用, 而在實質上應該說CPU按時間片分配給各個進程使用, 每個進程都有自己的運行環境以使得在CPU做進程切換時不會"忘記"該進程已計算了一半的"半成品". 以DOS的概念來說, 進程…

Redis單線程模型是什么?

參考文章&#xff1a; redis 單線程的理解 謝謝作者分享&#xff01;

寂靜的時候

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 每每聽到熟悉的旋律&#xff0c;終又會驟然就無法抑制排山倒海般的憂傷... 就這樣想往若已經年邁到只能坐在夕陽余暉里遙望遠方該多好.…

@staticmethod和@classmethod的作用與區別

一般來說&#xff0c;要使用某個類的方法&#xff0c;需要先實例化一個對象再調用方法。 而使用staticmethod或classmethod&#xff0c;就可以不需要實例化&#xff0c;直接類名.方法名()來調用。 這有利于組織代碼&#xff0c;把某些應該屬于某個類的函數給放到那個類里去&…

前端開發注意事項(HTML與CSS進階)

HTML 與 CSS 進階 Img 標簽 alt 屬性 一定要添加 用于圖片描述 給機器看的&#xff0c;如果圖片加載失敗&#xff0c;會顯示 alt <img src"" alt""/> 為 img 添加 圖片注釋 建議做法為 figure(圖形) 和 figcaption [caption(字幕)]<figure>…

如果你懂我…

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 想往的世界&#xff0c;有風如深秋的柳絮… 翻飛在遙遠的寂靜里… 若冷落…若別離… 若守候…若赤誠… 若我…

[NOI2005]維護數列 惡心到毀天滅地的splay

傳送門 debug到死2333. 雖然說是splay維護序列模板&#xff0c;作為蒟蒻的我還是GG %%%考場A的dalao Orz Orz. 其實不開long long也行&#xff0c;inf開成0x3f3f3f3f也可&#xff08;flag,歡迎推翻&#xff09; 就當存個板子吧. #include<bits/stdc.h> #include<cs…

Python的from import和import的區別

對于from...import...&#xff0c;其意義具體是from Module import Function或Class等&#xff0c;這個只是從模塊中導入一個或幾個函數或類的做法。另外一個常見的是import Module&#xff0c;就是把整個模塊中得東西都導入&#xff0c;所以你后面的程序就都可以使用了。另外還…

靜態代理、動態代理、AOP

參考文章&#xff1a; Java中的代理模式——靜態代理以及分析靜態代理的缺點 Java中動態代理的兩種方式JDK動態代理和cglib動態代理以及區別 Spring中的AOP以及切入點表達式和各種通知