DES演算法例項詳解

hearthougan發表於2018-08-29

目錄

譯自J. Orlin Grabbe的名作《DES Algorithm Illustrated》,國外許多大學將該文章作為補充材料,可作為理解DES演算法的最佳入門手冊。反觀許多教材介紹DES時直接照搬一張流程圖,圖中IP等縮寫符號不加解釋,讓人誤解;許多部落格則直接給出蹩腳的原始碼,對內部流程缺乏解讀。事實上,DES在演算法上並不複雜,只是流程繁多而已。此時利用一個簡單的例子,手工推演一下就能輕鬆理解。

DES.png

DES (Data Encryption Standard)演算法是世界上最常用的加密演算法。在很長時間內,許多人心目中“密碼生成”與DES一直是個同義詞。儘管最近有個叫Electronic Frontier Foundation的組織造了臺價值22萬的機器嘗試破解DES加密的資料,DES和它的變種“三重資料加密演算法”仍將在政府和銀行中廣泛應用(譯註:本文年代久遠,在2001年AES成為了DES的替代品)。

DES是怎樣工作的?本文將通過一個簡單的例子來一步步展示DES的加密流程。自DES誕生以來,許多加密演算法(修改資料的方法)都採用了類似DES的手段。一旦理解了DES中的變換,你一定能夠更輕鬆地理解這些現代加密演算法中的門道。

但在此之前,不妨先了解一下DES的發展歷史。

國家標準局催生了DES

1973年5月,在尼克松任期,美國國家標準局下發了紅標頭檔案,徵求加密演算法來保護傳輸過程中的資料。國家標準局等了很久一直沒有人投標,一直到1974年8月6日,尼克松卸任前三天,IBM才拿出了自己家開發的一套代號LUCIFER(金星)的東西。美國安全域性評估後,在1977年7月15日採用了LUCIFER的一個變種作為資料加密標準DES。

DES很快被非數字媒體採用,比如電話線中的訊號加密。在那些年裡,國際香料組織IFF曾用DES來加密那些用電話線傳輸的祕密配方。(“With Data Encryption, Scents Are Safe at IFF,” Computerworld 14, No. 21, 95 (1980)

同時,作為政府之後第二大急需加密的銀行業也將DES作為廣泛應用的標準,美國國家標準協會ANSI制定了整個銀行業的加密規範。1980年採用的ANSI X3.92指定了DES演算法的應用。

一些初步的DES例子

DES處理位元,或者說二進位制數字。我們知道,每四個位元構成一個十六進位制數。DES加密一組64位的資訊,也就是16個16進位制數。為了完成加密,DES同樣使用64位長的密碼。但是,祕鑰中每8位被忽略掉,這樣導致DES中有效的祕鑰長度為56位。但是,在任何情況下,每64位一個塊是DES永恆的組織方式。

比如,如果我們手上的明文是:

  1. 8787878787878787

選取了DES祕鑰:

  1. 0E329232EA6D0D73

我們就能得到密文:

  1. 0000000000000000

如果對上述密文使用相同的DES祕鑰

  1. 0E329232EA6D0D73

來解密的話,我們就能得到原來的明文

  1. 8787878787878787

這個例子簡單明瞭,因為我們的明文就是64位長的,明文當然也可以是多個64位那麼長。但大部分情況下,現實生活中的明文都不是64位(16個16進位制位)的整數倍。

比如,對於這段文字:

  1. Your lips are smoother than vaseline

它是38位元組(76個16進位制位)長的。所以在DES加密前,這段文字必須在尾部補充一些額外的位元組。一旦密文被解密,這些多餘的位元組將被丟棄。當然,具體有多種補充的方法。在這裡,我們簡單地補充0在尾部,使得訊息是8位元組的整數倍。

這段純文字在16進位制下是:

  1. 596F7572206C6970 732061726520736D 6F6F746865722074 68616E2076617365 6C696E650D0A

注意這裡前72個十六進位制數字代表英文,但0D代表回車符,0A代表換行符,代表文字檔案的結束。然後我們在這段十六進位制碼的尾部新增一些0,使其恰好為80個十六進位制位:

  1. 596F7572206C6970 732061726520736D 6F6F746865722074 68616E2076617365 6C696E650D0A0000

如果我們使用相同的祕鑰:

  1. 0E329232EA6D0D73

加密這段資料,我們將得到如下密文:

  1. C0999FDDE378D7ED 727DA00BCA5A84EE 47F269A4D6438190 9DD52F78F5358499 828AC9B453E0E653

這就是可供傳輸或儲存的祕密程式碼了。解密它就可以得到原文“Your lips are smoother than vaseline”。(設想一下如果克林頓的情婦加密過這些曖昧資料的話,克林頓該是有多慶幸。)

DES到底是如何工作的

DES是一個基於組塊的加密演算法,這意味著無論輸入還是輸出都是64位長度的。也就是說DES產生了一種最多264種的變換方法。每個64位的區塊被分為2個32位的部分,左半部分L和右半部分R。(這種分割只在特定的操作中進行。)

比如,取明文M為

  1. = 0123456789ABCDEF

這裡的M是16進位制的,將M寫成二進位制,我們得到一個64位的區塊:

  1. = 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
  2. = 0000 0001 0010 0011 0100 0101 0110 0111
  3. = 1000 1001 1010 1011 1100 1101 1110 1111

M的第一位是0,最後一位是1,我們從左讀到右。

DES使用56位的祕鑰操作這個64位的區塊。祕鑰實際上也是儲存為64位的,但每8位都沒有被用上(也就是第8, 16, 24, 32, 40, 48, 56, 和64位都沒有被用上)。但是,我們仍然在接下來的運算中將祕鑰標記為從1到64位的64個位元。不過,你也許會看到,剛剛提到的這8個在建立子祕鑰的時候會被忽略掉。

舉個例子,取十六進位制祕鑰K為

  1.  K = 133457799BBCDFF1

我們可以得到它的二進位制形式(1為0001,3為0011.依次類推,並且將每八位寫成一組。這樣每組的最後一位都沒有被用上。)

  1. = 00010011 00110100 01010111 01111001 10011011 10111100 11011111 11110001

第一步:建立16個子祕鑰,每個長48位元

這個64位的祕鑰首先根據表格PC-1進行變換。

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

由於上表中第一個元素為57,這將使原祕鑰的第57位變換為新祕鑰K+的第1位。同理,原祕鑰的第49位變換為新祕鑰的第2位……原祕鑰的第4位變換為新祕鑰的最後一位。注意原祕鑰中只有56位會進入新祕鑰,上表也只有56個元素。

比如,對於原祕鑰:

  1. = 00010011 00110100 01010111 01111001 10011011 10111100 11011111 11110001

我們將得到56位的新祕鑰:

  1. K+ = 1111000 0110011 0010101 0101111 0101010 1011001 1001111 0001111

然後,將這個祕鑰拆分為左右兩部分,C0 和 D0,每半邊都有28位。

比如,對於新祕鑰,我們得到:

  1. C0 = 1111000 0110011 0010101 0101111 
  2. D0 = 0101010 1011001 1001111 0001111

對相同定義的C0 和 D0,我們現在建立16個塊Cn 和 Dn, 1<=n<=16。每一對Cn 和 Dn都是由前一對Cn-1 和 Dn-1移位而來。具體說來,對於n = 1, 2, …, 16,在前一輪移位的結果上,使用下表進行一些次數的左移操作。什麼叫左移?左移指的是將除第一位外的所有位往左移一位,將第一位移動至最後一位。

  1.                      Iteration     Number of
  2.                       Number      Left Shifts
  3.  
  4.                           1          1
  5.                           2          1
  6.                           3          2
  7.                           4          2
  8.                           5          2
  9.                           6          2
  10.                           7          2
  11.                           8          2
  12.                           9          1
  13.                          10          2
  14.                          11          2
  15.                          12          2
  16.                          13          2
  17.                          14          2
  18.                          15          2
  19.                          16          1

這意味著,比如說,C3 and D3C2 and D2移位而來的,具體來說,通過2次左移位;C16 and D16 則是由C15 and D15通過1次左移得到的。在所有情況下,一次左移就是將所有位元往左移動一位,使得移位後的位元的位置相較於變換前成為2, 3,…, 28, 1

比如,對於原始子祕鑰C0 and D0,我們得到:

  1. C0 = 1111000011001100101010101111
  2. D0 = 0101010101100110011110001111
  3. C1 = 1110000110011001010101011111
  4. D1 = 1010101011001100111100011110
  5. C2 = 1100001100110010101010111111
  6. D2 = 0101010110011001111000111101
  7. C3 = 0000110011001010101011111111
  8. D3 = 0101011001100111100011110101
  9. C4 = 0011001100101010101111111100
  10. D4 = 0101100110011110001111010101
  11. C5 = 1100110010101010111111110000
  12. D5 = 0110011001111000111101010101
  13. C6 = 0011001010101011111111000011
  14. D6 = 1001100111100011110101010101
  15. C7 = 1100101010101111111100001100
  16. D7 = 0110011110001111010101010110
  17. C8 = 0010101010111111110000110011
  18. D8 = 1001111000111101010101011001
  19. C9 = 0101010101111111100001100110
  20. D9 = 0011110001111010101010110011
  21. C10 = 0101010111111110000110011001
  22. D10 = 1111000111101010101011001100
  23. C11 = 0101011111111000011001100101
  24. D11 = 1100011110101010101100110011
  25. C12 = 0101111111100001100110010101
  26. D12 = 0001111010101010110011001111
  27. C13 = 0111111110000110011001010101
  28. D13 = 0111101010101011001100111100
  29. C14 = 1111111000011001100101010101
  30. D14 = 1110101010101100110011110001
  31. C15 = 1111100001100110010101010111
  32. D15 = 1010101010110011001111000111
  33. C16 = 1111000011001100101010101111
  34. D16 = 0101010101100110011110001111

我們現在就可以得到第n輪的新祕鑰Kn( 1<=n<=16)了。具體做法是,對每對拼合後的子祕鑰CnDn,按表PC-2執行變換:

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

每對子祕鑰有56位,但PC-2僅僅使用其中的48位。

於是,第n輪的新祕鑰Kn 的第1位來自組合子祕鑰CnDn的第14位,第2位來自第17位,依次類推,知道新祕鑰的第48位來自組合祕鑰的第32位。

比如,對於第1輪的組合祕鑰,我們有:

  1. C1D1 = 1110000 1100110 0101010 1011111 1010101 0110011 0011110 0011110

通過PC-2的變換後,得到:

  1. K1 = 000110 110000 001011 101111 111111 000111 000001 110010

同理,對於其他祕鑰得到:

  1. K2 = 011110 011010 111011 011001 110110 111100 100111 100101
  2. K3 = 010101 011111 110010 001010 010000 101100 111110 011001
  3. K4 = 011100 101010 110111 010110 110110 110011 010100 011101
  4. K5 = 011111 001110 110000 000111 111010 110101 001110 101000
  5. K6 = 011000 111010 010100 111110 010100 000111 101100 101111
  6. K7 = 111011 001000 010010 110111 111101 100001 100010 111100
  7. K8 = 111101 111000 101000 111010 110000 010011 101111 111011
  8. K9 = 111000 001101 101111 101011 111011 011110 011110 000001
  9. K10 = 101100 011111 001101 000111 101110 100100 011001 001111
  10. K11 = 001000 010101 111111 010011 110111 101101 001110 000110
  11. K12 = 011101 010111 000111 110101 100101 000110 011111 101001
  12. K13 = 100101 111100 010111 010001 111110 101011 101001 000001
  13. K14 = 010111 110100 001110 110111 111100 101110 011100 111010
  14. K15 = 101111 111001 000110 001101 001111 010011 111100 001010
  15. K16 = 110010 110011 110110 001011 000011 100001 011111 110101

關於子祕鑰的話題就到此為止了,接下來我們看看資訊本身。

第二步:加密資料的每個64位區塊

對於明文資料M,我們計算一個初始變換IP(Initial permutation)。IP是重新變換資料M的每一位產生的。產生過程由下表決定,表格的下標對應新資料的下標,表格的數值x表示新資料的這一位來自舊資料的第x位。

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

參照上表,M的第58位成為IP的第1位,M的第50位成為IP的第2位,M的第7位成為IP的最後一位。

比如,對M的區塊執行初始變換,得到:

  1. = 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
  2. IP = 1100 1100 0000 0000 1100 1100 1111 1111 1111 0000 1010 1010 1111 0000 1010 1010

這裡M的第58位是1,變成了IP的第1位。M的第50位是1,變成了IP的第2位。M的第7位是0,變成了IP的最後一位。

接著講變換IP分為32位的左半邊L0 和32位的右半邊R0 

比如,對於上例,我們得到:

  1. L0 = 1100 1100 0000 0000 1100 1100 1111 1111 
  2. R0 = 1111 0000 1010 1010 1111 0000 1010 1010

我們接著執行16個迭代,對1<=n<=16,使用一個函式f。函式f輸入兩個區塊——一個32位的資料區塊和一個48位的祕鑰區塊Kn ——輸出一個32位的區塊。定義+表示異或XOR。那麼讓n從1迴圈到16,我們計算

Ln = Rn-1 

Rn = Ln-1 + f(Rn-1,Kn)

這樣我們就得到最終區塊,也就是n = 16 的 L16R16。這個過程說白了就是,我們拿前一個迭代的結果的右邊32位作為當前迭代的左邊32位。對於當前迭代的右邊32位,將它和上一個迭代的f函式的輸出執行XOR運算。

比如,對n = 1,我們有:

  1. K1 = 000110 110000 001011 101111 111111 000111 000001 110010 
  2. L1 = R0 = 1111 0000 1010 1010 1111 0000 1010 1010 
  3. R1 = L0 + f(R0,K1)

剩下的就是f函式是如何工作的了。為了計算f,我們首先擴充每個Rn-1,將其從32位擴充到48位。這是通過使用一張表來重複Rn-1中的一些位來實現的。我們稱這個過程為函式E。也就是說函式E(Rn-1)輸入32位輸出48位。

定義E為函式E的輸出,將其寫成8組,每組6位。這些位元是通過選擇輸入的某些位來產生的,具體選擇順序按下表實現:

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

也就是說E(Rn-1開頭的三個位元分別來自Rn-1的第32、1和2位。E(Rn-1) 末尾的2個位元分別來自Rn-1的第32位和第1位。

比如,給定R0 ,我們可以計算出E(R0

  1. R0 = 1111 0000 1010 1010 1111 0000 1010 1010 
  2. E(R0) = 011110 100001 010101 010101 011110 100001 010101 010101

(注意輸入的每4位一個分組被擴充為輸出的每6位一個分組。)

接著在f函式中,我們對輸出E(Rn-1) 和祕鑰Kn執行XOR運算:

Kn + E(Rn-1)

比如,對K1 , E(R0),我們有:

  1. K1 = 000110 110000 001011 101111 111111 000111 000001 110010 
  2. E(R0) = 011110 100001 010101 010101 011110 100001 010101 010101 
  3. K1+E(R0) = 011000 010001 011110 111010 100001 100110 010100 100111.

到這裡我們還沒有完成f函式的運算,我們僅僅使用一張表將Rn-1 從32位擴充為48位,並且對這個結果和祕鑰Kn執行了異或運算。我們現在有了48位的結果,或者說8組6位元資料。我們現在要對每組的6位元執行一些奇怪的操作:我們將它作為一張被稱為“S盒”的表格的地址。每組6位元都將給我們一個位於不同S盒中的地址。在那個地址裡存放著一個4位元的數字。這個4位元的數字將會替換掉原來的6個位元。最終結果就是,8組6位元的資料被轉換為8組4位元(一共32位)的資料。

將上一步的48位的結果寫成如下形式:

Kn + E(Rn-1) =B1B2B3B4B5B6B7B8,

每個Bi 都是一個6位元的分組,我們現在計算

S1(B1)S2(B2)S3(B3)S4(B4)S5(B5)S6(B6)S7(B7)S8(B8)

其中,Si(Bi) 指的是第i個S盒的輸出。

為了計算每個S函式S1, S2,…, S8,取一個6位的區塊作為輸入,輸出一個4位的區塊。決定S1的表格如下:

  1.                              S1
  2.  
  3.                         Column Number
  4. Row
  5. No.    0  1   2  3   4  5   6  7   8  9  10 11  12 13  14 15
  6.  
  7.   0   14  4  13  1   2 15  11  8   3 10   6 12   5  9   0  7
  8.   1    0 15   7  4  14  2  13  1  10  6  12 11   9  5   3  8
  9.   2    4  1  14  8  13  6   2 11  15 12   9  7   3 10   5  0
  10.   3   15 12   8  2   4  9   1  7   5 11   3 14  10  0   6 13

如果S1 是定義在這張表上的函式,B是一個6位的塊,那麼計算S1(B) 的方法是:B的第一位和最後一位組合起來的二進位制數決定一個介於0和3之間的十進位制數(或者二進位制00到11之間)。設這個數為i。B的中間4位二進位制數代表一個介於0到15之間的十進位制數(二進位制0000到1111)。設這個數為j。查表找到第i行第j列的那個數,這是一個介於0和15之間的數,並且它是能由一個唯一的4位區塊表示的。這個區塊就是函式S1 輸入B得到的輸出S1(B)。比如,對輸入B = 011011 ,第一位是0,最後一位是1,決定了行號是01,也就是十進位制的1 。中間4位是1101,也就是十進位制的13,所以列號是13。查表第1行第13列我們得到數字5。這決定了輸出;5是二進位制0101,所以輸出就是0101。也即S1(011011) = 0101

同理,定義這8個函式S1,…,S8的表格如下所示:

  1.                                   S1
  2.  
  3.      14  4  13  1   2 15  11  8   3 10   6 12   5  9   0  7
  4.       0 15   7  4  14  2  13  1  10  6  12 11   9  5   3  8
  5.       4  1  14  8  13  6   2 11  15 12   9  7   3 10   5  0
  6.      15 12   8  2   4  9   1  7   5 11   3 14  10  0   6 13
  7.                                   S2
  8.  
  9.      15  1   8 14   6 11   3  4   9  7   2 13  12  0   5 10
  10.       3 13   4  7  15  2   8 14  12  0   1 10   6  9  11  5
  11.       0 14   7 11  10  4  13  1   5  8  12  6   9  3   2 15
  12.      13  8  10  1   3 15   4  2  11  6   7 12   0  5  14  9
  13.                                   S3
  14.  
  15.      10  0   9 14   6  3  15  5   1 13  12  7  11  4   2  8
  16.      13  7   0  9   3  4   6 10   2  8   5 14  12 11  15  1
  17.      13  6   4  9   8 15   3  0  11  1   2 12   5 10  14  7
  18.       1 10  13  0   6  9   8  7   4 15  14  3  11  5   2 12
  19.                                   S4
  20.  
  21.       7 13  14  3   0  6   9 10   1  2   8  5  11 12   4 15
  22.      13  8  11  5   6 15   0  3   4  7   2 12   1 10  14  9
  23.      10  6   9  0  12 11   7 13  15  1   3 14   5  2   8  4
  24.       3 15   0  6  10  1  13  8   9  4   5 11  12  7   2 14
  25.                                   S5
  26.  
  27.       2 12   4  1   7 10  11  6   8  5   3 15  13  0  14  9
  28.      14 11   2 12   4  7  13  1   5  0  15 10   3  9   8  6
  29.       4  2   1 11  10 13   7  8  15  9  12  5   6  3   0 14
  30.      11  8  12  7   1 14   2 13   6 15   0  9  10  4   5  3
  31.                                  S6
  32.  
  33.      12  1  10 15   9  2   6  8   0 13   3  4  14  7   5 11
  34.      10 15   4  2   7 12   9  5   6  1  13 14   0 11   3  8
  35.       9 14  15  5   2  8  12  3   7  0   4 10   1 13  11  6
  36.       4  3   2 12   9  5  15 10  11 14   1  7   6  0   8 13
  37.                                  S7
  38.  
  39.       4 11   2 14  15  0   8 13   3 12   9  7   5 10   6  1
  40.      13  0  11  7   4  9   1 10  14  3   5 12   2 15   8  6
  41.       1  4  11 13  12  3   7 14  10 15   6  8   0  5   9  2
  42.       6 11  13  8   1  4  10  7   9  5   0 15  14  2   3 12
  43.                                  S8
  44.  
  45.      13  2   8  4   6 15  11  1  10  9   3 14   5  0  12  7
  46.       1 15  13  8  10  3   7  4  12  5   6 11   0 14   9  2
  47.       7 11   4  1   9 12  14  2   0  6  10 13  15  3   5  8
  48.       2  1  14  7   4 10   8 13  15 12   9  0   3  5   6 11

例子:對於第一輪,我們得到這8個S盒的輸出:

K1 + E(R0) = 011000 010001 011110 111010 100001 100110 010100 100111.

S1(B1)S2(B2)S3(B3)S4(B4)S5(B5)S6(B6)S7(B7)S8(B8) = 0101 1100 1000 0010 1011 0101 1001 0111

函式f的最後一步就是對S盒的輸出進行一個變換來產生最終值:

f = P(S1(B1)S2(B2)…S8(B8))

變換P由如下表格定義。P輸入32位資料,通過下標產生32位輸出:

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

比如,對於8個S盒的輸出:

S1(B1)S2(B2)S3(B3)S4(B4)S5(B5)S6(B6)S7(B7)S8(B8) = 0101 1100 1000 0010 1011 0101 1001 0111

我們得到

f = 0010 0011 0100 1010 1010 1001 1011 1011

那麼,

R1 = L0 + f(R0 , K1 )

= 1100 1100 0000 0000 1100 1100 1111 1111 
+ 0010 0011 0100 1010 1010 1001 1011 1011 
= 1110 1111 0100 1010 0110 0101 0100 0100

在下一輪迭代中,我們的L2 = R1,這就是我們剛剛計算的結果。之後我們必須計算R2 =L1 + f(R1, K2),一直完成16個迭代。在第16個迭代之後,我們有了區塊L16 and R16。接著我們逆轉兩個區塊的順序得到一個64位的區塊:

R16L16

然後對其執行一個最終的變換 IP-1 ,其定義如下表所示:

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

也就是說,該變換的的輸出的第1位是輸入的第40位,第2位是輸入的第8位,一直到將輸入的第25位作為輸出的最後一位。

比如,如果我們使用了上述方法得到了第16輪的左右兩個區塊:

  1. L16 = 0100 0011 0100 0010 0011 0010 0011 0100 
  2. R16 = 0000 1010 0100 1100 1101 1001 1001 0101

我們將這兩個區塊調換位置,然後執行最終變換:

  1. R16L16 = 00001010 01001100 11011001 10010101 01000011 01000010 00110010 00110100
  2. IP-1 = 10000101 11101000 00010011 01010100 00001111 00001010 10110100 00000101

寫成16進製得到:

  1. 85E813540F0AB405

這就是明文M = 0123456789ABCDEF的加密形式C = 85E813540F0AB405

解密就是加密的反過程,執行上述步驟,只不過在那16輪迭代中,調轉左右子祕鑰的位置而已。

Reference

DES演算法例項詳解The DES Algorithm Illustrated.pdf

相關文章