對稱加密算法總結 – 流密碼與塊密碼

隨機數

在對稱加密的流密碼算法和塊密碼算法中,都需要生成隨機的密鑰流,明文通過密鑰加密得到密文,所以隨機數生成算法顯得十分重要,它決定加密密鑰,密鑰決定了加密算法的安全性。

隨機數的類型分有三種,僞隨機數生成器,密碼學僞隨機數生成器和真正的隨機數生成器,前兩者生成隨機數通過軟件實現,真正的隨機數生成器通過硬件實現。

1、僞隨機數生成器:軟件實現,隨機性。

2、密碼學僞隨機數生成器:軟件實現,隨機性,不可預測性。

3、真正的隨機數生成器:硬件實現,隨機性,不可預測性,不可重現性。

隨機性很好理解,簡單地說就是每個數字出現的概率是差不多的,出現的次數的平均的。不可預測性也很好理解,就是每次生成的隨機數,它們之間是沒有關聯的,我們無法從前面生成的隨機數中找到規律,從而推導出後面可能生成的隨機數。不可重現性的意思就是隨機數生成器不會生成完全一樣的兩個隨機數,無論經過多長時間。

“內部狀態“(internal state)

上面的三種隨機數生成器,其內部生成原理都是一樣的,它們都需要維護一個“內部狀態“。拿僞隨機數生成器舉例,c語言中的rand()函數用來生成一個隨機數他,它就是一個僞隨機數生成器,通過算法得到隨機數,對於僞隨機數生成器來說,裏面維護的內部狀態稱爲”種子“,使用過rand()函數生成隨機數的同學都知道,假如我們只是單純地int a = rand();那麼每次得到的隨機數a都是一樣的。原因是rand()函數,隨機數生成器,是根據”種子“的值,結合算法公式計算出一個隨機數的,這個”種子“在計算機啓動後就生成了,並且值是固定的,所以根據這個固定的”種子“結合特定的算法公式,每次計算出來的隨機數都是一樣的。爲了得到不同的隨機數,使用rand()函數,每次都要重新”播種“,也就是傳入不同值的”種子“,具體在這裏不詳述,大家可以自行查找隨機數函數的用法,大多都會講到如何重新產生”種子“。這裏我們要知道,僞隨機數生成器是軟件層面,根據內部狀態”種子“結合特定算法公式,得到的隨機數。

對於硬件實現的真正的隨機數生成器,它內部也維護了一個“內部狀態“,之所以它能生成不可預測性,不可重現性的隨機數,很重要是因爲它的內部狀態,稱爲”熵“,數值來自於外部如溫度和時間等。

 

對稱加密

數據加密算法主要有對稱加密和非對稱加密兩種,對稱加密,簡單地說就是使用一個密鑰加一個算法來加密明文,得到不規則的密文,加密和解密的過程是可以互逆的,明文通過密鑰和算法經過計算得到密文,反過來密文通過相同的密鑰和算法,可以計算得到明文,顯然對稱加密中加密和解密都使用的同一個密鑰,密鑰是一串數字,密鑰的長度決定了該加密算法的安全性。

對稱加密算法分兩大類,流密碼算法和塊密碼算法。

 

流密碼算法

流密碼算法,或者叫序列密碼,算法大概的原理是,每次加密都通過密鑰生成一個密鑰流,解密也是使用同一個密鑰流,明文與同樣長度的密鑰流進行異或運算得到密文,密文與同樣的密鑰流進行異或運算得到明文。流密碼算法是以“一次性密碼本“爲雛形演變出來的加密算法,一次性密碼本算法很重要的一個特性就是密鑰使用的”一次性“,來看看一次性密碼本的算法原理。

一次性密碼本

一次性密碼本的操作核心是異或運算,明文和同樣長度的密鑰進行異或運算,得到密文,密文根據加密時使用的的密鑰進行異或運算,解密得到明文。舉個例子,假如我們的明文是:

00100110 11110110 11110110 11100110

使用的加密密鑰是:

10011110 10100110 11010110 11001110

那麼明文與密鑰進行加密異或運算,得到的密文就是:

10111000 01010000 00100000 00101000

之後密文通過同樣的密鑰進行異或運算,即可解密出明文:

10111000 01010000 00100000 00101000

10011110 10100110 11010110 11001110

00100110 11110110 11110110 11100110

 

這就是一次性密碼本的原理,一次性密碼本保證安全性的方法是,每一次加密解密後,下一次加密解密會更換不同的密鑰,也就是每次都更換密鑰。對於同一個明文信息,每一次加密都會使用不同的密鑰,這樣即使別人掌握了其中一個密鑰和密文,他也無法確定這個密文是否是通過這個密鑰加密生成的,無法確定該密文使用這個密鑰解密出的就是原始明文。

     流密碼算法便是以一次性密碼本爲雛形實現的加密算法,由上面一次性密碼本的原理可以看到,安全性關鍵在於每次都要更換密鑰,這個密鑰就是一次性的。流密碼算法是如何實現一次性的密鑰?答案就是使用隨機數生成器。將密鑰作爲“內部狀態“傳入隨機數生成器中,每次由隨機數生成器生成隨機的密鑰流,然後明文和密文都使用相同的密鑰流進行異或運算加密和解密。

 

塊密碼算法

塊密碼算法也叫分組密碼算法,從字面意思就可以知道,它把加密和解密序列分成了一個個分組,最後把每一塊序列合併到一起,形成明文或者密文。根據不同的分組加密方式,每個分組之間可以有聯繫,也可以沒有聯繫,下面來看看塊密碼算法的三種模式。

ECB電碼本模式

ECB電碼本模式,將明文拆分成一個一個等長字節的數據塊,然後依次對每一個數據塊進行密鑰加密得到密文,最後將一個一個的密文分組按順序合成一個序列,得到密文。

     ECB電碼本模式的優點是,每一個數據分組的加密和解密過程都可以互相獨立,只需要密鑰就可以進行,所以使用EBC電碼本模式的加密和解密過程都可以並行處理,大大提高了處理速度。不過,這種分組之間互相獨立,沒有聯繫的加密方式,被證實是不安全的。原因是對於相同的明文,使用相同的密鑰加密得到的密文是一樣的,即使它們被分了組,例如一個明文序列中出現多個字符‘a’,在多個分組中都存在該字符,由於每一個分組使用的都是同一個加密密鑰,所以多個分組中的字符‘a’都會被加密得到相同的密文。這樣很容易被發現規律,當被發現使用的是EBC電碼本模式進行加密後,破解就變得很容易了,所以該加密方式已經被證實是不安全的。

     你可能會想到一個問題,如果明文序列按照某一固定字節長度等分,可是最後一塊分組數據塊發現無法等分,怎麼辦?當遇到某一數據塊無法等分的情況,採取的是數據填充方式,填充標準有PKCS#7,PKCS#5,因爲我沒有去深入瞭解,所以在這裏不詳述,我們只要知道是採用數據填充方式將分組數據塊填充到字節數據與前面的數據塊等長即可。

CBC密文分組連接模式

第二種是CBC密文分組連接模式,由名字可以看出,分組之間有連接,也就是分組數據塊之間存在着聯繫,這樣做可以解決EBC模式的不安全情況,看看CBC密文分組連接模式的具體過程:

  1. 將明文序列分成多個等長的分組數據塊,如果數據塊長度無法等分,那麼進行填充操作。
  2. 依次處理每一個分組數據塊,對第一個分組數據塊進行加密時,利用隨機數生成器生成一個初始化向量IV,數據塊首先與IV進行異或運算,然後與密鑰進行運算,得到第一塊密文。
  3. 第二塊分組數據塊會先和前一個分組密文進行異或運算,再和密鑰(使用的都是同一個密鑰)進行運算得到第二塊密文。也就是說,除了第一塊分組數據塊的初始化向量IV是通過隨機數生成器生成之外,其餘數據塊的IV都是其前一個數據塊的密文。
  4. 最後,將所有分組數據塊密文按順序組合成完整的密文。

     可以看到CBC密文分組連接模式,通過讓每一個分組之間建立聯繫,而不是讓它們互相獨立,解決了EBC電碼本模式的不安全情況。第一個分組數據塊的初始化向量是通過隨機數生成器生成,長度和分組長度一樣。明文完成加密後,將密文,初始化向量和密鑰一起發送給解密人。至於解密,很簡單,把步驟反過來,第一個密文與密鑰運算後,和初始化向量IV進行異或運算,得到第一個明文,下一個密文分組在和密鑰運算後,和前一個明文進行異或運算,得到第二個明文。

CBC模式雖然解決了EBC模式的安全問題,但是分組數據塊之間的聯繫,使得加密和解密必須一個接一個順序進行,無法實現並行操作,降低了處理速度。

CTR計數器模式

最後一種,CTR計數器模式,它同樣在每一個分組數據塊之間建立聯繫,引入的是隨機密鑰流變量,類似於初始化向量。來看看具體過程更好說明它的原理:

  1. 第一步和前面一樣還是進行分組處理,不過不需要對不等長的分組數據塊進行填充處理。
  2. 開始依次處理每一個分組數據塊,首先生成一個隨機密鑰流,把密鑰流與密鑰流進行運算後,得到的值再和明文進行異或運算,得到密文。
  3. 下一個密文分組,也需要先將密鑰流和密鑰流進行運算,這個密鑰流是前一個密鑰流是有聯繫的,可以根據一個密鑰流得到下一個密鑰流,最簡單的方式是遞增。所以第n個分組數據塊的密鑰流是第n-1個分組的密鑰流加一。
  4. 得到密鑰流和密鑰運算後的值,第二個分組數據塊就可以與該值進行異或運算,得到分組密文,然後把密鑰流加一,得到下一個分組數據塊的密鑰流。

使用CTR計數器模式一樣解決了EBC模式的安全問題,因爲分組數據塊之間建立了聯繫,就是那個密鑰流,第一個隨機密鑰流通過隨機數生成器生成,有多少個分組數據塊就有多少個密鑰流,每個密鑰流之間有規律聯繫。至於拿到密文後的解密過程,比CBC模式更簡單明瞭,先把密鑰流和密鑰進行運算處理後,再和密文進行異或運算,即可得到一塊分組明文,最後按順序把所有明文拼湊在一起即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章