DES加密算法詳細原理以及Java代碼實現


本周的密碼學實驗要求使用任意編程語言來實現des加密算法,於是我在查閱了相關資料后有了以下成果。

  首先,DES算法作為經典的分塊密碼(block cipher),其主要的實現過程由兩部分組成,分別是密鑰的生成以及明文的處理。

加密的大致流程如圖示

 

 

加密的大致流程如圖所示

作為分塊密碼,密鑰的輸入以及明文的輸入均為64位2進制數。

  

 

 

  

 

下面首先來說密鑰的生成過程。

密鑰處理部分如圖所示

 

 

   密鑰的輸入為64位,例如00010011 00110100 01010111 01111001 10011011 10111100 11011111 11110001,然后經過pc-1盒置換,會去除每一個8的倍數位(奇偶校驗位)並打亂次序,將密鑰變為56位。pc-1的置換表如下(框中的數字代表的是原密鑰的位置,而不是數據

 1 57,49,41,33,25,17,9,1,
 2 58,50,42,34,26,18,10,2,
 3 59,51,43,35,27,19,11,3,
 4 60,52,44,36,63,55,47,39,
 5 31,23,15,7,62,54,46,38,
 6 30,22,14,6,61,53,45,37,
 7 29,21,13,5,28,20,12,4                                                    

  也就是說,經過pc-1盒的置換原來第57位的1將會到第1位,原來49位的數據會到第2位,以此類推。在DES密鑰加密的過程中,這種置換方式經常出現。

  在經過了pc-1盒的置換后,原來56位的密鑰會被均分為兩組成為c0,d0。然后l0和d0會經過循環左移(left shift)的處理。

  例如一串密鑰為1010101,在經過一位的循環左移后會變成0101011,即循環左移幾位,最左邊的幾位數據會緊接在后面,達到一種左移的效果。左移后的密鑰塊分別稱為c1,d1。這時候,將c1以及d1組合起來,經過pc-2的置換(類似於pc-1)。

1 14,17,11,24,1,5,
2 3,28,15,6,21,10,
3 23,19,12,4,26,8,
4 16,7,27,20,13,2,
5 41,52,31,37,47,55,
6 30,40,51,45,33,48,
7 44,49,39,56,34,53,
8 46,42,50,36,29,32

  經過了pc-2盒的置換后,原本56位的密鑰會變為48位。這個時候,第一個能夠用於加密的子密鑰k1就生成好了。在des算法密鑰生成的過程中,一個主密鑰會經過16輪的循環左移和pc-2置換,生成16個子密鑰。循環左移的位數和輪次的關系如下表

 

   后續子密鑰的生成過程就是重復上面的過程,c1和d1再進行循環左移得到c2和d2,再經過pc-2盒置換得到k2,c2和d2再經過左移得到c3和d3經過pc-2盒得到k3.....經過這樣的操作16輪,得到16個子密鑰。密鑰的生成過程大致如上,接下來來闡述明文的處理過程。

  明文的處理流程大致如圖所示。

  首先,64位明文的輸入需要經過初始置換,並把輸出塊分為L0,R0兩部分,每部分32位。(有點類似於密鑰初始化時的pc-1)置換規則如下:

1 58,50,42,34,26,18,10,2,
2 60,52,44,36,28,20,12,4,
3 62,54,46,38,30,22,14,6,
4 64,56,48,40,32,24,16,8,
5 57,49,41,33,25,17, 9,1,
6 59,51,43,35,27,19,11,3,
7 61,53,45,37,29,21,13,5,
8 63,55,47,39,31,23,15,7

  這個過程與pc-1階段類似,置換后的第1位是原來的第58位,第2位是原來的第50位,以此類推。L0是置換后數據的前32位,R0是置換后的后32位。

  經過了初始置換之后,R0會進依次進入E-box,S-box,P-box三個置換盒,進行下一步的處理。

E-box的處理過程如圖示

  E-box本質上是將原來32位的數據變為了48位,原理是將原來的32位輸入以四位為一個單元分開,然后這個單元的第1位會復制到上一個單元的最后一位,這個單元的最后一位會變為下一個單元的第1位。看圖可知,1234分塊的第一位復制到了最后一塊成為了第48位,第32位復制到了第1位成為了新數據組的第1位,具體過程如果還不明晰的話可以仔細看圖解決。

  在經過了E-box后,新的R0變為了48位,剛好與生成的密鑰位數一致。這個時候,需要使用k1和新R0執行一次異或(相同記為0,不同記為1)操作,在異或操作結束后新的數據塊會進入S-Box進行替代。

 

 

 

  S-box會將48位的輸入按照次序分為8組,分別進入8個子盒進行替代,每個盒的輸入是6位,輸出是4位。8個子盒原理如下:

S-box1

1 14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7,
2 0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8,
3 4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0,
4 15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13

S-box2

1 15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10,
2 3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5,
3 0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15,
4 13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9

S-box3

1 10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8,
2 13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1,
3 13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7,
4 1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12

S-box4

1 7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15,
2 13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9,
3 10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4,
4 3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14

S-box5

1 2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9,
2 14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6,
3 4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14,
4 11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3

S-box6

1 12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11,
2 10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8,
3 9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6,
4 4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13

S-box7

1 4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1,
2 13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6,
3 1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2,
4 6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12

S-box8

1 13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7,
2 1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2,
3 7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8,
4 2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11

  S-box的計算規則:

  以S-box8為例,如果該盒輸入為六位011100。取第一位和最后一位組成二進制數00,轉化為十進制為0,對應該盒第1行。中間四位組成1110,十進制化為14,對應該盒第15列(考試的時候這個地方錯了,,,1551)尋找該盒第1行第15列的元素,是12,轉化為2進制是1100,這也就是該盒的輸出。

  在經過了S-box置換后,數據塊還需一步處理,P-box

  P-box很簡單,類似於pc-1,就是簡單的置換,32位的輸入置換為32位的輸出。置換表如下:

1 16,7,20,21,29,12,28,17,1,15,23,26,5,18,31,10,
2 2,8,24,14,32,27,3,9,19,13,30,6,22,11,4,25

  在經過了這些處理后,原來32位的R0變為了新的32位數據塊,這個時候,使用這32位數據塊和原來的L0進行異或,變為新的32位R1,這時候,原來的R0成為新的L1。R1再經過E-box擴展,和k2(第二個子密鑰)異或,S-box替代,P-box置換的過程。再與L1進行異或,直到使用完所有的16個子密鑰(也是16輪)。

  明文經過了這16輪變換之后已經面目全非,這個時候把L和R組合成為64位經過最后的置換,即成為密文。最終置換如下:

1 40,8,48,16,56,24,64,32,39,7,47,15,55,23,63,31,
2 38,6,46,14,54,22,62,30,37,5,45,13,53,21,61,29,
3 36,4,44,12,52,20,60,28,35,3,43,11,51,19,59,27,
4 34,2,42,10,50,18,58 26,33,1,41, 9,49,17,57,25

  下面附上從別的老哥那抄來的介紹:

DES的特點:

  優點:

  效率高,算法簡單,系統開銷小(真的簡單嗎,,,,)

  適合加密大量數據

  明文長度和密文長度相等

  缺點:

  需要以安全方式進行秘鑰交換

  秘鑰管理復雜

最后是JAVA實現的代碼,我已上傳至我的GitHub,地址為:https://github.com/jason-ralston/DES_cipher各位自行前去食用。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM