1. 程式人生 > >《圖解密碼技術》[02] 對稱密碼

《圖解密碼技術》[02] 對稱密碼

執行 多點 eight 加解密 [0 加密 logs 全部 ges


所謂對稱密碼,是指在加密和解密時使用的都是同一密鑰,比如之前提到的愷撒密碼。而非對稱密碼,也稱之為公鑰密碼,是指在加密和解密時使用不同密鑰的方式。
本章會主要介紹幾種對稱密碼,如DES、三重DES、AES等,在這之前,要先了解一下什麽是比特序列運算。

1、比特序列運算

在這之前,我們先來看一個異或運算(不同取1,相同取0),假如有二進制數01001100為A,10101010為B,則兩者異或結果為C:
  1. A 0100 1100
  2. B 1010 1010
  3. C 1110 0110

將異或的結果C和B再進行異或運算,結果又會變回A:
  1. C 1110 0110
  2. B 1010 1010
  3. A 0100 1100

上面的計算,就和加解密的步驟非常相似:
  • A是明文,B是密鑰,C是密文
  • 發送者將A通過密鑰B加密得到C,接收者將收到的C通過密鑰B解密得到A

而我們知道,計算機的操作對象並不是文字,而是由0和1排列組成的比特序列所以加密的過程,實際上就是將表示明文的比特序列,轉換為表示密文的比特序列
由於同一個比特序列進行兩次異或運算後會回到最初的狀態,不妨來一個由很多點組成的圖像“字母D”,如下圖,白點作為0,黑點作為1:技術分享
由此看到,這裏使用的蒙版就是一個比特序列,使用異或運算將原來的圖像進行了掩蓋。 當然,這裏只是為了形象地表示,實際上在計算機中,圖片雖然也是0和1的序列,但並不是按如上使用0和1進行類似像素描點來展示的。但不論如何我們已經知道,數據可以通過一個隨機的比特序列進行異或運算,達到加密的目的。


2、DES

Data Encryption Standard 是1977年美國聯邦信息處理標準中采用的一種對稱密碼,但是隨著計算機的進步,DES已經能夠在數小時能被暴力破解,所以我們現在也不應該再使用DES了。
DES是一種將64比特的明文加密成64比特的密文的對稱密碼算法
,這裏的64比特的單位成為分組。DES的密鑰長度為56比特,另外還有7比特用於設置錯誤檢查。由於其基本結構是由Horst Feistel設計,因此也稱為Feistel網絡

2.1 Feistel網絡的加密

Feistel網絡中,加密的各個步驟稱之為“輪”,整個加密過程就是進行若幹次輪循環。
技術分享 Feistel網絡中,每一輪都需要使用不同的密鑰,因為它只是一個局部密鑰,所以稱為子密鑰。加密算法如上圖,明文被分為左側和右側兩部分,輪函數根據右側數據和子密鑰,計算出一串比特序列,用該序列和左側數據進行異或運算,作為加密後的左側數據。
但這樣一來右側根本就沒有加密,所以在下一輪需要將左右側數據對調,再換一個子密鑰繼續進行加密,說白了,就是把之前沒加密的右側數據也加密。每輪處理32比特,最後一輪結束後不需要對調。
如下圖加密96比特明文,即進行三輪加密:技術分享

2.2 Feistel網絡的解密

不論輪函數具體是什麽,根據異或運算的特性,Feistel網絡的解密,只需要把每輪加密的結果使用相同的子密鑰重新運算一次,即可還原為明文,如下圖:技術分享

2.3 Feistel網絡的性質

  • 無論使用任何輪函數都可以正確解密
  • 加密和解密可以用完全相同的結構來實現,只是循環次數不同

2.4 三重DES

三重DES就是將DES重復三次得到的一種密碼算法,通常縮寫為3DES。它的加密機制如下圖所示:技術分享 由於DES密鑰長度為56比特,所以三重DES的密鑰長度則為56*3=168比特。
從上圖我們可以看出,3DES並不是進行三次加密,而是進行了加密、解密、加密。這裏加入解密是為了兼容原來的DES,將三重加密都使用相同密鑰,那麽在加密和解密後得到的還是明文,再進行第三次加密,即和原來的DES效果相同。因此,以前DES加密的秘聞,也可以通過3DES解密。
  • 如果所有密鑰都相同,則結果和普通的DES等價
  • 如果密鑰1、3相同,2不同,則稱為DES-EDE2
  • 密鑰完全不同,則稱為DES-EDE3

3DES的解密過程和加密過程正好相反,是以密鑰3、2、1的順序執行 “解密、加密、解密” 的操作。
盡管3DES目前還被銀行等機構使用,但是其處理速度不高,且安全性方面也逐漸顯現了一些問題。


3、AES

DES的安全性逐漸出現了一些問題,自然就出現了取代它的 Advanced Encryption Standard,這種加密算法是從眾多候選算法中評選出的名為Rijndael的對稱密碼算法,確定其成為AES。Rijndael沒有使用Feistel網絡,而是使用了SPN結構。
DES的分組是64比特,而Rijndael的分組則是128比特,也就是16字節,它的算法首先需要逐個字節地進行SubBytes處理,所謂SubBytes,即以每個字節的值(0~255中任意值)為索引,從一張擁有256個值得替換表中找出對應值的處理,也就是說,把一個1字節的值替換為另一個1字節的值,這類似於簡單替換密碼,不過是256個字母的版本。
SubBytes之後要進行ShiftRows處理,即將SubBytes的輸出以字節為單位進行打亂,這種打亂是有規律的。ShiftRows之後進行MixColumns處理,即對一個4字節的值進行比特運算,將其變為另一個4字節值。
最後,將MixColumns的輸出與輪密鑰進行異或運算(Rijndael算法也是和Feistel一樣是采取輪的),即進行AddRoundKey,到這裏,Rijndael的一輪就結束了。實際上,在Rijndael中需要重復進行10~14輪計算。這種算法和之前的Feistel相比,因為輸入的所有比特都會被加密,而不是每輪只加密一半,所以優勢在於加密所需要的輪數更少。
小結一下加密過程就是:
  • SubBytes:16個字節,每個字節進行替換表替換
  • ShiftRows:平移行(有規律平移,如下圖,第一個字節移動到對應MixColumns的第一個字節,第二個字節對應第二個MixColumns的第二個字節,第三個對應第三個MixColumns的第三個,以此類推)
  • MixColumns:對每4字節進行比特運算,變成另外的4字節值
  • AddRoundKey:與輪密鑰進行異或運算

技術分享 解密過程則分別存在反向運算InvSubBytes、InvShiftRows、InvMixColumns,這是因為Rijndale不像Feistel網絡一樣可以使用同種結構實現加密和解密。技術分享 在書中提到,Rijndael還沒有出現針對性的有效攻擊,但因其背後有著嚴謹的數學結構,從明文到密文的計算過程可以全部用公式表達,意味著能夠通過數學方法進行破譯,這為新的攻擊方式產生了可能。
盡管作者提到DES已能在數小時內破譯,但可能涉於篇幅對於DES也沒有案例進行破譯講解。所以DES和AES這部分的知識點大概也就這樣理解吧,了解就行。核心還是在於對稱密碼的特點,即加密和解密使用相同的密鑰,這裏的兩個算法都涉及以異或運算作為基礎。

《圖解密碼技術》[02] 對稱密碼