A5-1和DES兩個加密算法的學習

A5-1加密算法

1、基本原理

A5-1加密算法是一種流密碼,通過密鑰流對明文進行加密,然後用密鑰流進行對密文的解密操作。

這種算法主要用於GSM加密,也就是我們平時打電話的時候,通信數據發送到基站,基站發送到另一個基站,基站發送到接收方。

每次通話的時候,基站會產生一個64位的隨機數,與我們手機sim卡內本身帶的一個密碼利用一種加密算法生成一個密鑰,這個密鑰就是這次通話過程中使用的主密鑰,此密鑰的生命週期爲這一次通話的開始到結束。一旦通話完成,那麼這個密鑰也就沒有用了。


該加密算法把整個通訊的數據劃分爲每一幀來進行加密。每一幀是有228位,其中發送端給接收端的數據114位,接收端反饋給發送端的數據有114位。除了上面提出的基站給出的64的總密鑰,針對每一幀的加密,還有一種叫做會話密鑰,這種會話密鑰每加密一幀都會改變,會話密鑰的生成是由幀號來決定的。每一次的會話密鑰都會產生一個228位的亂數來加密這一幀的數據。加密的方式是異或。幀號一共用22位的二進制數來表示,也就是說一次通話只能傳遞2^22次方的通訊數據,因爲每一次通話只有這麼多幀可以進行加密數據並且傳遞。

A5-1算法基於三個線性移位反饋寄存器實現的。三個LFSR的級數分別是19 22 23。

f1(x) = x^19 + x^18 + x^17 + x^14 + 1

f2(x) = x^22 + x^21 + 1

f3(x) = x^23 + x^22 + x^21 + x^8 + 1

三個反饋多項式如上所示。


2、所用工具

根據上面所講的,我們基本可以確定,如果要實現a5-1的加密算法,我們需要哪些工具:

首先是明文,其次是64位的密鑰,三個LFSR,以及幀號。

算法的輸入應該就是三個LFSR的初始值,算法的輸出就是我們加密明文所需要的亂數。


3、實現步驟

算法總體來說分爲三個部分,初始化,運算,輸出亂數

A5-1加密算法實現的邏輯結構圖如下:


首先是初始化部分:

(1)將三個寄存器內的所有位全都賦值爲0

(2)將三個寄存器做64次的移位操作,每第i次操作,寄存器的反饋內容都先與密鑰中的第i位進行異或,然後把這樣異或的結果作爲寄存器此次的反饋內容。三個LSFR都要並行的做這樣的工作64次。

(2)將三個寄存器做22次的移位操作,沒第i次操作,寄存器的反饋項都先與幀序號的第i位進行異或,將異或的結果作爲寄存器的最終反饋內容,同樣,三個LSFR也都要並行做22次。

上述三步昨晚,A5-1加密算法的初始化操作也就做完了。另外需要注意的是,A5-1加密算法的LSFR是左移操作,並且,密鑰和幀號都是從最低位到最高位編號。

當初始化步驟完成的時候,此時三個LSFR的狀態合稱爲S0狀態。


接下來是計算和輸出部分:

大家可以看到,上面的邏輯結構圖中,有一個叫做鍾控的部分,他有三個輸出三個輸入,三個輸入是分別來三個LSFR的某一個固定位,輸入會輸出0或者1.0表示此次這個LSFR不會工作,也就是不會發生移動等等,輸出的是1的話,那麼這個LSFR此次就會移動一位並且得出反饋的結果。也就是說這個鍾控在控制着三個LSFR的工作與否。

首先根據鍾控的方式三個LSFR連續移動100次,但是不輸出亂數,此時應該只是做一個混亂的操作。因爲LSFR在移動過程中,每一位寄存器內的數值都會不一樣,所以在鍾控決定每個寄存器運行與否的結果時也會不相同。

接下來會三個LSFR會接着進行連續的114次的移動,也是根據鍾控的方式。這一次的移動過程中,三個寄存器將分別把最高位寄存器的值輸出,然後三個值做異或運算,形成第i個亂數。這次114次移動會生成一個114位的亂數,用於對手機到基站這一段的數據加密。

之後再進行一次100次的移動和114次的移動,結果和上面說的相同,最終產生的114位密鑰用於基站到手機這段的通訊數據加密。


關於鍾控:

鍾控將第一個寄存器的第八位,第二個寄存器的第10位,第三個寄存器的第10位。抽取這三個位用於控制三個LSFR的動作與否。他們決定的原則類似少數服從多數,三位一共有8中排列方式,當三位中1的個數多餘0的個數時,那麼這三位是1的對應的寄存器將會移動, 爲0的不會,如果三位數中0的個數多餘1的個數時,那麼三位之中是0的對應的寄存器將會移動。


根據上面的步驟就可以算出當我們把通訊數據切割成每一幀,然後對每一幀進行加密傳輸的時候,所需要的那個加密的亂數是怎麼得來的。至於加密過程很簡單,就是明文和亂數的異或操作。



DES加密算法

如果說A5-1是流密碼的加密算法的話,那麼DES就是分組密碼體制中典型的一個算法。分組密碼的主要思想,就是把明文和密鑰都分成一定長度的許多斷數據,爲了保證每一個明文都僅僅只有一個密鑰,需要做的就是分組的密鑰長度要大於等於分組的明文長度。通過分組加密,每一組使用的密鑰都不相同,這就是基本的分組密碼。


分組密碼的安全性除了收到一些密鑰長度參數的影響之外,最重要的兩個原則就是混亂原則和擴散原則。

混亂原則要求明文和密文在邏輯上的關係越複雜越好。爲了保證混亂原則的實行,我們將盡可能使用非線性的變換。

擴散原則,我理解是這樣的,在設計密碼的時候,通過實行混亂原則,使得我們的密碼會在整個序列的某基礎發生混亂,那麼擴散原則要做的,就是要通過移位的方式,將這種混亂最大化,讓明文和密鑰的變化儘可能多的影響密文的生成。這種思想最典型的體現,就是S-P網絡。


分組密碼中的一個很典型的例子就是DES算法:

DES算法也是分組密碼的一個案例,它屬於分組密碼中的迭代分組密碼,即用簡單的加密措施先構造出一個加密函數來,之後不斷的進行乘積迭代,兩個簡單的方式乘積在一起的話,會形成一個更加複雜的密碼函數,DES正式利用這樣的思想來實現。


DES加密算法的實現需要幾個工具:

1.分組長度2.密鑰長度3.迭代次數4.子密鑰長度

DES默認分組長度爲64bit,密鑰長度也是64bit,迭代次數爲16,子密鑰的長度爲48位

DES加密算法的輸入是一組64bit的明文,輸出是64bit的密文

算法執行過程中有3步:初始變換, 16輪迭代, 初始逆變換

要注意的是,DES的算法中的比特序號是從1開始,並且是從左邊開始。



DES算法中的初始變換:

初始變化實際上就是對明文序列進行順序打亂操作。他會按照一個特定的表格進行對照移動。

初始逆置換是對16次迭代後的結果序列進行移位操作,也是有一個對照表,告訴你移動的規則。


DES算法中的圈函數:

從上面的DES算法的邏輯結構圖中可以看出,他李永樂Feistel模型進行迭代密碼的實現。那麼這個迭代有一個圈函數

Li = Ri-1  Ri = Li-1^f(Ri-1, ki)(i = 1, 2, ...)

在進行完初始置換之後,我們得到一個長度爲2w的序列,也就是64位的明文序列。把他們一分爲二,分爲左半部分和右半部分,在進行第一次迭代的時候,右半部分變爲下一次迭代的左半部分,左半部分與F函數的結果進行按位異或形成下一輪迭代的右半部分。最後在迭代到第16次的時候,不在進行這樣的左右交換操作,直接轉換爲對應的部分。

那麼很顯然,整個算法的核心就在於F函數的內容



F函數:

F函數的輸入有兩部分,一個是這一輪的子密鑰48bit,另外一個是序列的右半部分的32bit。

F(R,K) = P(S(E(Ri)^Ki))

上述表達式告訴我們F函數一共有四個步驟,先是對R進行E盒的變換,E盒又稱爲是擴展變換盒



1、E盒

E盒的作用就是把32位的數據擴展稱爲48位的數據,我覺得是因爲密鑰是48位,所以必須要擴展一下要變換的明文序列,因爲分組密碼的加密原則強調過,分組密碼的加密,密鑰是必須大於等於要加密的明文的。把32位的序列分成8組,每組序列在開頭和結尾處分別添加開頭和結尾元素相鄰的元素,每一組添加2位,一共八組,田間16位,即擴展爲48位,這是一種非線性的擴展。然後接下來就是與這一輪的子密鑰Ki進行按位異或操作。


2、S盒

S盒宏觀上的一個作用,是把剛剛異或生成的48位結果變換成32位。首先把48位的生成結果分成8組,每組6位。每6位分別作爲S盒的輸入,這樣一共有8個S盒並行工作,將6位輸入變爲4位輸出,最終得到32位的結果。

對於每一個S盒來說,有a1~~~a6的二進制比特輸入,有這樣的一個表格存在:



現在S盒一共有6位的輸入,a0a1a2a3a4a5a6

我現在算的是S1盒的輸出,首先計算2a1+a6最後的十進制結果是多少,這個結果代表了行數。

之後計算8a2+4a3+2a4+a5最後的十進制結果代表了列數,拿到行數和列數之後,在表格中找到對應的數字,這裏注意,如果我算出來的是1 3,那麼我在找的時候,也是找表格中對應的標號是1行3列的元素,因爲我們可以看到表格中的標號是從0開始的。

例如,如果計算的s1,得出的結果是1行3列,那麼結果應該是4.查表得到這個結果之後,表格可以保證,得出的結果4位二進制數十完全可以表示的,所以將這個十進制數化爲4位二進制數就完成了S盒的一部分操作,之後每一個S盒都按照這樣的原則操作,之前異或的48位結果就會順利的變成32位。


3、P盒

P盒也是非常簡單,就是根據一個表格進行一個移位操作,表格到時候會具體給出。


經過上述的計算,我們可以順利的得到F函數的計算結果。F函數的計算過程圖如下:



經過上述的計算我們可以準確的得到F函數的具體結果,那麼下輪迭代的右半部分也就是R1就可以由上一層的左半部分和F函數的結果異或得到。不知道爲什麼的,可以翻上去看一下DES實現的邏輯框圖。

DES的算法基本執行流程就是這樣的,那麼還有一個問題可能我們沒有考慮到,我們擁有的是一個64位的初始密鑰,那麼每一次的子密鑰是怎麼生成的呢?



DES子密鑰的生成:

DES的初始密鑰一共有64位,其中密鑰的每一個字節的最後一位都用作奇偶校驗,所以說,實際的有效密鑰長度爲56位。

DES子密鑰的生成邏輯框圖如下:




首先,64位的初始密鑰進來,最先要執行的就是置換選擇操作1.

那麼置換選擇操作具體的內容是什麼呢:

置換選擇操作1有兩個步驟:

(1)將64位中每一個密鑰字節的最後一位丟棄

(2)將剩餘的56位按照表格的規則打亂順序,生成一個亂序的56位序列

之後將輸出的56比特的有效密鑰序列一分爲二,分爲D0和C0兩部分(生成C0D0到此爲止只能算是密鑰生成算法的初始化操作,不能算作一次迭代)。之後從第一次開始的每一次的迭代中,分別要對上一次的Di-1 Ci-1兩部分進行循環左移操作,循環左移的次數和所在的迭代次數有關,比如D0C0--->D1C1是第一次迭代要循環左移1位,D2C2--->D3C2要左移2兩位,具體的移位次數會有個明確的表格告訴大家。

每一次迭代的循環移位操作之後得到的兩部分DiCi,將進行置換選擇2的操作,置換選擇2與1類似,都是打亂順序,丟掉一部分元素,最後形成一個48位的序列,就是上面DES算法中第i次迭代所需要的子密鑰。但是本次迭代生成的Di和Ci不會改變,因爲他們將會用於下一次子密鑰的生成操作。由於DES需要16次的迭代,那麼子密鑰的生成自然也需要16輪的迭代。


也就是說,什麼樣算一次迭代操作呢,從循環位移,一直到置換選擇2,再到最終生成第i次的子密鑰ki算作是一次迭代,之前生成d0c0的部分不算。

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