現代密碼算法---DES算法

上一期,我介紹了密碼學的基本理論,然後還介紹了最古老的代換密碼凱撒密碼。當然了古典密碼還有很多比如仿射密碼、Hill密碼、Play fair密碼等等,我在這裏就不一一介紹了,畢竟這些古典密碼基本已經沒什麼實用價值了,介紹這些也只是讓大家瞭解一下加密/解密的過程,從現在起開始給大家介紹一下現代密碼算法。

現代加密算法大致分爲量大了兩大類分別是:對稱加密算法和非對稱加密算法。其中對稱加密算法還分爲分組密碼和流密碼。它的示意圖大概是這個樣子的(後面的那些是比較常見的算法,不是全部):

對稱鑰匙加密系統是加密和解密均採用同一把祕密鑰匙,而且通信雙方都必須獲得這把鑰匙,並保持鑰匙的祕密。

非對稱密鑰加密系統採用的加密鑰匙(公鑰)和解密鑰匙(私鑰)是不同的

還有一部分算法是用來對數據做提煉的,爲消息提供完整性服務。有消息認證碼(MAC)和產生消息哈希值的散列函數。這方面技術似乎和現在的區塊鏈結合的挺緊密的,等講到這部分的時候再說吧。

今天就介紹一些分組密碼中的經典DES算法。

說到DES算法,就不得不講Feistel框架了,

Feistel框架

一種近乎完美大密碼體制,同時也是目前大多數分組密碼採用的結構它主要採用了乘積密碼的思想,交替使用代換和置換。

下面是Feistel的基本結構:

Feistel框架的整個加密就是對同一步驟進行多次循環(DES選擇的是16輪循環)。輪數越多加密的效果越好,當然其加密時間也就越長。

現在拿出一輪給大家做一下分析:首先它將輸入分爲兩段,一段爲L;一段爲R。然後通過輪函數F對左半輪(即L)進行代換,最後在置換:交換左右兩段的數據。

在Feistel框架中會把原始密鑰生成爲若干子密鑰,然後子密鑰作爲每一輪F函數的輸入。

寫出來,大概是這個樣子:

LEi+1=REi

REi+1=LEi⊕F(REi+Ki+1)

其中Ki是子密鑰;

下面說DES算法:

DES算法簡介

64比特的明文分組輸入;64比特的密文分組輸出;同時它採用64比特的密鑰(但是實際只使用了56位,其中的第8,16,24,3 2,40,48,54,64這八位用作奇偶校驗);也就是說DES的密鑰共有2的56次方種可能;在DES中Feistel框架進行了16輪操作,在Feistel中64位的數據被分爲R和L各32位,子密鑰是48位。

DES加密

下面用這個圖說明一下DES算法的加密流程吧:

DES解密

加密和解密可以使用相同的算法。加密和解密唯一不同的是祕鑰的次序是相反的。就是說如果每一輪的加密祕鑰分別是K1、K2、K3...K16,那麼解密祕鑰就是K16、K15、K14...K1。爲每一輪產生祕鑰的算法也是循環的。加密是祕鑰循環左移,解密是祕鑰循環右移。解密祕鑰每次移動的位數是:0、1、2、2、2、2、2、2、1、2、2、2、2、2、2、1

DES的解密

當然,就現在的計算機運算速度而言,56位密鑰的加密算法,窮舉攻擊應該很短的時間就能破解了。