DES原理及代碼實現
- 2020 年 4 月 20 日
- 筆記
一、DES基礎知識
DES技術特點
DES是一種用56位密鑰來加密64位數據的方法
DES採取了分組加密算法:明文和密文為64位分組長度
DES採取了對稱算法:加密和解密除密鑰編排不同外,使用同一算法
DES的安全性不依賴於算法的保密,安全性僅以加密密鑰的保密為基礎; 密鑰可為任意的56位數,具有複雜性,使得破譯的開銷超過可能獲得的利益
採用代換和置換的組合,共16輪
只使用了標準的算術和邏輯運算,易於實現
DES算法的組成
初始置換函數IP
子密鑰Ki及獲取
密碼函數F
逆置換函IP-1
DES的輸入與輸出
DES的明文分組長度為64位(比特)
初始置換函數IP接受長度為64位的明文輸入
逆置換函數IP-1輸出64位的密文
DES的16個子密鑰
在子密鑰的獲取過程中,通過密鑰置換Pc-1獲取從Kl到K16共16個子密鑰,這16個子密鑰分別順序應用於密碼函數的16次完全相同的迭代運算中
DES解密原理
DES的解密算法與加密算法完全相同,只需要將密鑰的應用次序與加密時相反應用即可
解密過程是初始置換函數IP接受長度為64比特的密文輸入,將16個子密鑰按照K16到K1的順序應用與函數F的16輪迭代運算中,然後將迭代的結果經由逆置換函數IP-1得到64位的明文輸出
DES算法流程圖
DES流程圖
二、加密過程詳解
1.入口參數
Key、Data、Mode
Key ===> 7個位元組共56位,是DES算法的工作密鑰
Data ===> 8個位元組64位,是要被加密或被解密的數據
Mode ===> DES的工作方式,有兩種:加密或解密
2.初始置換
64位明文分組首先經過一個初始置換函數IP進行置換運算,產生一個64位的輸出X0
該輸出X0被分成兩個分別為32位的左半部分L0和右半部分R0,
L0,R0用於F函數的16輪迭代運算迭代的初始輸入
初始置換表
注意:這裡的數字表示的是原數據的位置,不是數據值
初始置換表
58 50 42 34 26 18 10 2
60 52 44 36 28 20 12 4
62 54 46 38 30 22 14 6
64 56 48 40 32 24 16 8
57 49 41 33 25 17 9 1
59 51 43 35 27 19 11 3
61 53 45 37 29 21 13 5
63 55 47 39 31 23 15 7
即將輸入的64位明文的第1位置換到第40位,第2位置換到第8位,第3位置換到第48位。以此類推,最後一位是原來的第7位。置換規則是規定的
經初始置換表置換後,得出的結果為X0,接着X0再分為左半部分L0、右半部分R0
注意:這裡的數字表示的是原數據的位置,不是數據值
這裡很多人會疑問,為什麼是左右啊?這分明是上下啊!
這裡的左右是針對明文(並非明文二進制碼),當你把明文化為二進制碼排列成8*8矩陣時,就成為了視覺上的上下,其實對於明文本身來說這是左右
L0
58 50 42 34 26 18 10 2
60 52 44 36 28 20 12 4
62 54 46 38 30 22 14 6
64 56 48 40 32 24 16 8
R0
57 49 41 33 25 17 9 1
59 51 43 35 27 19 11 3
61 53 45 37 29 21 13 5
63 55 47 39 31 23 15 7
3.獲取子密鑰
子密鑰的獲取主要通過置換和移位運算來實現
DES加密算法的密鑰長度為56位,由用戶提供,但用戶輸入的密鑰是64位的,按8行8列從左到右從上到下地排列,其中,每行的第8位用於奇偶校驗
(1)對輸入的秘鑰去除每個位元組的最後一位後,進行如下代換
PC-1表
PC-1表 57 49 41 33 25 17 9
1 58 50 42 34 26 18
10 2 59 51 43 35 27
19 11 3 60 52 44 36
63 55 47 39 31 23 15
7 62 54 46 38 30 22
14 6 61 53 45 37 29
21 13 5 28 20 12 4
從表中我們也可以發現第8、16、24、32、40、48、56、64共8個校驗位被去掉
(2)將置換後的二進制碼繼續分為前28位C0、後28位D0
C0
57 49 41 33 25 17 9
1 58 50 42 34 26 18
10 2 59 51 43 35 27
19 11 3 60 52 44 36
D0
63 55 47 39 31 23 15
7 62 54 46 38 30 22
14 6 61 53 45 37 29
21 13 5 28 20 12 4
(3)C0、D0兩部分經過循環左移(每輪按下表進行移位),每次循環左移都需要將兩部分合併成56位
通過密鑰置換Pc-1獲取從Kl到K16共16個子密鑰,這16個子密鑰分別順序應用於密碼函數的16次完全相同的迭代運算中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
1 1 2 2 2 2 2 2 1 2 2 2 2 2 2 1
我們以第一次循環左移為例:
原數據:
C0
57 49 41 33 25 17 9
1 58 50 42 34 26 18
10 2 59 51 43 35 27
19 11 3 60 52 44 36
D0
63 55 47 39 31 23 15
7 62 54 46 38 30 22
14 6 61 53 45 37 29
21 13 5 28 20 12 4
左移後數據:
C0
49 41 33 25 17 9 1
58 50 42 34 26 18 10
2 59 51 43 35 27 19
11 3 60 52 44 36 57
D0
55 47 .39 31 23 15 7
62 54 46 38 30 22 14
6 61 53 45 37 29 21
13 5 28 20 12 4 63
合併後數據:
49 41 33 25 17 9 1
58 50 42 34 26 18 10
2 59 51 43 35 27 19
11 3 60 52 44 36 57
55 47 .39 31 23 15 7
62 54 46 38 30 22 14
6 61 53 45 37 29 21
13 5 28 20 12 4 63
(4)合併後的數據經過壓縮置換Pc-2後得到對應輪次的48位子密鑰
PC-2置換為壓縮置換即置換後的輸出數據的位數要比置換前輸入的位數要少,即某些位的數據在置換的過程中被去掉了
由下表可知,在壓縮置換過程中,原來的8行7列共56位數據被壓縮成8行6列的48位數據
在壓縮置換過程中,第9、18、22、25、35、38、43、54共8位數據被丟掉
去掉指定位數據後,繼續按下表進行置換
14 17 11 24 1 5
3 28 15 6 21 10
23 19 12 4 26 8
16 7 27 20 13 2
41 52 31 37 47 55
30 40 51 45 33 48
44 49 39 56 34 53
46 42 50 36 29 32
(5)根據同樣的算法生成一共用於16次迭代的16個子密鑰,算法本身是將子密鑰的生成包括在每次迭代過程中的。但是筆者為了更好讓大家理解,將它排除在迭代過程中(因為子密鑰的生成與Li和Ri是無關的,只與用戶輸入秘鑰有關)。因此這樣並不會影響DES加密結果
=============================迭代入口=================================
5.S盒替換
(1)將Ri進行E擴展置換成為48位
注意:
第一次迭代是唯一一次與其他十五次迭代輸入方式不同的迭代,其R0為原明文右半部分二進制碼;其餘十五次Ri(i != 0)均為P盒置換輸出作為Ri
先將數據的右半部分通過擴展置換E從32位擴展為48位。之所以稱為擴展置換。是因為置換後的數據比置換前的數據的位數要多。擴展置換(E)通過將原32位數據中的某些位重複出現達到擴展的目的
擴展表如下:
E擴展置換表
32 01 02 03 04 05
04 05 05 06 08 09
08 09 10 11 12 13
12 13 14 15 16 17
16 17 18 19 20 21
20 21 22 23 24 25
24 25 26 27 28 29
28 29 30 31 32 01
(2)將4步驟生成的本輪子密鑰(48位)與E擴展後的48位E_Ri進行異或運算,輸出48位二進制數據
(3)將(2)的結果作為輸入塊進行S盒代替運算,功能是把48位數據變為32位數據
該運算由8個不同的代替盒(S盒)完成。每個S-盒有6位輸入,4位輸出
所以48位的輸入塊被分成8個6位的分組,每一個分組對應一個S-盒代替操作;經過S-盒代替,形成8個4位分組結果
注意:每一個S-盒的輸入數據是6位,輸出數據是4位,但是每個S-盒自身是64位
以下是8個S盒:
S_1 = [
[14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7],
[0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8],
[4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0],
[15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13]
]
S_2 = [
[15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10],
[3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5],
[0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15],
[13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9]
]
S_3 = [
[10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8],
[13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1],
[13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7],
[1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12]
]
S_4 = [
[7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15],
[13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9],
[10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4],
[3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14]
]
S_5 = [
[2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9],
[14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6],
[4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14],
[11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3]
]
S_6 = [
[12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11],
[10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8],
[9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6],
[4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13]
]
S_7 = [
[4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1],
[13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6],
[1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2],
[6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12]
]
S_8 = [
[13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7],
[1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2],
[7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8],
[2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11]
]
下面我們來示例S8盒的運算過程:
S8盒
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 13 2 8 4 6 15 11 1 10 9 3 14 5 0 12 7
1 1 15 13 8 10 3 7 4 12 5 6 11 0 14 9 2
2 7 11 4 1 9 12 14 2 0 6 10 13 15 3 5 8
3 2 1 14 7 4 10 8 13 15 12 9 0 3 5 6 11
①我們知道上步的計算結果是一位48位的數據,然後將48位分為8行6列
②第一行對應S1盒,第二行對應S2盒,以此類推,第八行對應S8盒
③假設第八行數據為 101101
④取第一位和最後一位轉為10進制作為行號;在此例中即 11 ===> 3行
⑤取中間的4位轉為10進制作為列號;在此例中即 0110 ===> 6例
⑥根據行號和列號找到S8盒中對應的數據(注意,盒中的行列號下標從0開始)即(2,5)===> 12
⑦將得到的數據轉為二進制作為輸出的第8行;即 12 ===> 1100
(4)經過(3)的運算,S盒最終生成32位輸出。該32位輸出作為新的Ri,同時作為下一步P盒置換的輸入
6.P盒置換
S盒32位的輸出作為P盒的輸入,P盒置換將每一位輸入位映射到輸出位。任何一位都不能被映射兩次,也不能被略去。P置換使得一個S盒的輸出對下一輪多個S盒產生影響,形成雪崩效應:明文或密鑰的一點小的變動都引起密文的較大變化
P盒置換表如下:
16 7 20 21
29 12 28 17
1 15 23 26
5 18 31 10
2 8 24 14
32 27 3 9
19 13 30 6
22 11 4 25
(1)將P盒置換的結果與最初的64位分組的左半部分(即Li)異或。將異或的結果作為新的Li
(2)本輪P盒置換結束後,判斷是否繼續進行下一輪的迭代,如果是,左右兩部分交換,即Li ===> Ri,Ri ===> Li;交換後開始下一輪迭代;如果否(即不進行下一路迭代),則從下方迭代出口出去,繼續進行下一步操作
注意:
如果16輪迭代已經完成,則可以從下面的迭代出口出去,否則繼續回到上邊的迭代入口完成未完成的迭代
===================================迭代出口=================================
7.IP-1盒置換(IP盒逆置換)
在完成完全相同的16輪運算後(即從上面的迭代出口出來時),以其左邊32位作為R16 ,以其右邊32位作為L16 。將得到的兩部分數據合在一起,再經過一個逆置換函數IP-1即可得到64位的密文
(1)逆置換是初始置換的逆運算
從初始置換規則中可以看到,原始數據的第1位置換到了第
40位,第2位置換到了第8位。則逆置換就是將第40位置換到第1位,第8位置換到第2位。以此類推
(2)IP-1逆置換表
注意:
這裡的數字表示的是原數據的位置,不是數據值
40 8 48 16 56 24 64 32
39 7 47 15 55 23 63 31
38 6 46 14 54 22 62 30
37 5 45 13 53 21 61 29
36 4 44 12 52 20 60 28
35 3 43 11 51 19 59 27
34 2 42 10 50 18 58 26
33 1 41 9 49 17 57 25
三、代碼實現
代碼聲明:
本程序使用Python3實現,如果您想測試使用,可以直接安裝python3,然後運行即可,內部方法全部自定義,無需導入任何庫
理論上代碼不需要這麼龐大,但是為了讓讀者可以更清楚地認識到DES加密過程中的每一個細節,特意將任何階段的情況都編寫了相對美觀的輸出功能
筆者水平有限,望大神可以指出不對或不合理之處
本博文、代碼可以無授權轉發
代碼段可以自行使用,但不可以將此代碼單獨寫入任何論壇,博文中(轉發除外)
# 遍歷二維數組 def show_array(message, list_obj): print("========================================", message, "========================================") for list_temp in list_obj: print(list_temp) def show_array_no_format(list_obj): for temp_list in list_obj: for data in temp_list: print(data, " ", end='') print() # 根據ASCII得到8位字母的64位二進制代碼 def is_ascii(str_obj): result_temp = '' result = [] temp_list = [] for temp in str_obj: if ord(temp) < 0 or ord(temp) >= 128: return False, None else: temp_data = bin(int(str(ord(temp)), 10)) temp_data = temp_data[2:] if len(temp_data) < 8: temp_data = temp_data.rjust(8, '0') result_temp = result_temp + temp_data for index in range(1, len(result_temp) + 1): temp_list.append(int(result_temp[index - 1])) if index % 8 == 0: result.append(temp_list) temp_list = [] return True, result # 根據單小標得到雙下標 def get_x_y(position, row): position = position - 1 x = int(position / row) y = position % row return [x, y] # 初始置換 def init_replace(plain_text): result_data = [] temp_data = [] for index in range(1, 65): source_position = IP_Table[get_x_y(index, 8)[0]][get_x_y(index, 8)[1]] temp_data.append(plain_text[get_x_y(source_position, 8)[0]][get_x_y(source_position, 8)[1]]) if index % 8 == 0: result_data.append(temp_data) temp_data = [] return result_data # 將置換後的明文分為左右兩部分 # 這裡很多人會疑問,為什麼是左右啊?這分明是上下啊! # 這裡的左右是針對明文(並非明文二進制碼),當你把明文化為二進制碼排列成8*8矩陣時,就成為了視覺上的上下,其實對於明文本身來說這是左右 def get_left_right(replace_plaintext): left = [] right = [] sign = 0 for index in replace_plaintext: sign = sign + 1 if sign <= 4: left.append(index) else: right.append(index) return left, right # 去除密鑰二進制碼的最後一列 def update_secret(source_secret): result = [] for temp_list in source_secret: temp_list.pop() result.append(temp_list) return result # 通過PC-1表置換秘鑰二進制碼 def pc1_secret(updates_secret): result = [] temp_data = [] for index in range(1, 57): source_position = PC_1_Table[get_x_y(index, 7)[0]][get_x_y(index, 7)[1]] temp_data.append(updates_secret[get_x_y(source_position, 8)[0]][get_x_y(source_position, 8)[1]]) if index % 7 == 0: result.append(temp_data) temp_data = [] return result def left_shift(source_left, source_right, rounds): bits = 2 obj_left = [] obj_right = [] list_sum = [] result = [] temp_list = [] result_left = [] result_right = [] if rounds not in range(1, 17): return False, None, None else: if rounds in [1, 2, 9, 16]: bits = 1 else: bits = 2 for index in range(1, len(source_left) * len(source_left[0]) + 1): obj_left.append(source_left[get_x_y(index, 7)[0]][get_x_y(index, 7)[1]]) for index in range(1, len(source_right) * len(source_right[0]) + 1): obj_right.append(source_right[get_x_y(index, 7)[0]][get_x_y(index, 7)[1]]) for i in range(bits): obj_left.insert(len(obj_left), obj_left[0]) obj_left.remove(obj_left[0]) for i in range(bits): obj_right.insert(len(obj_right), obj_right[0]) obj_right.remove(obj_right[0]) list_sum.extend(obj_left) list_sum.extend(obj_right) for index in range(1, len(list_sum) + 1): temp_list.append(list_sum[index - 1]) if index % 7 == 0: result.append(temp_list) temp_list = [] for index in range(1, len(obj_left) + 1): temp_list.append(obj_left[index - 1]) if index % 7 == 0: result_left.append(temp_list) temp_list = [] for index in range(1, len(obj_right) + 1): temp_list.append(obj_right[index - 1]) if index % 7 == 0: result_right.append(temp_list) temp_list = [] return result, result_left, result_right # 通過PC-2表置換秘鑰二進制碼 def pc2_secret(updates_secret): result = [] temp_data = [] for index in range(1, 49): source_position = PC_2_Table[get_x_y(index, 6)[0]][get_x_y(index, 6)[1]] temp_data.append(updates_secret[get_x_y(source_position, 7)[0]][get_x_y(source_position, 7)[1]]) if index % 6 == 0: result.append(temp_data) temp_data = [] return result # 經16次循環左移得到16個子密鑰 def get_sub_key(lc, rd): left_c = lc right_c = rd result = [] for times in range(1, 17): print("||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||") print("||||||||||||||||||||||||||||||||||||||第", times, "次子密鑰開始生成||||||||||||||||||||||||||||||||||||||") left_secret_data, left_c, right_c = left_shift(left_c, right_c, times) show_array("C0、D0經循環左移合併後的二進制秘鑰", left_secret_data) pc2_secret_data = pc2_secret(left_secret_data) show_array("經PC-2壓縮置換後的二進制秘鑰===>子密鑰", pc2_secret_data) print("||||||||||||||||||||||||||||||||||||||第", times, "次子密鑰生成完成||||||||||||||||||||||||||||||||||||||") print("||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||") result.append(pc2_secret_data) return result # 將 M * N 的二重列錶轉換為 X * Y 的二重列表;其中 M * N = X * Y def conversion_list(source_list, m, n, x, y): if m * n != x * y: return False, None all_list = [] result = [] temp = [] for temp_list in source_list: for temp_data in temp_list: all_list.append(temp_data) for index in range(1, x * y + 1): temp.append(all_list[index - 1]) if index % y == 0: result.append(temp) temp = [] return result # 通過E擴展置換表將明文數據的右半部分即R0擴展為48位 def e_extend(source_right): source_right_format = conversion_list(source_right, 4, 8, 8, 4) result = [] temp_list = [] for index in range(1, 48 + 1): source_position = E_EXTEND_TABLE[get_x_y(index, 6)[0]][get_x_y(index, 6)[1]] temp_list.append(source_right_format[get_x_y(source_position, 4)[0]][get_x_y(source_position, 4)[1]]) if index % 6 == 0: result.append(temp_list) temp_list = [] return result # 將經E擴展後的48位二進制碼與16個48位子密鑰進行異或運算,整個過程稱為f函數運算 def f_xor(right_extend_data, sub_key, times): result = [] result_temp = [] temp_list = [] print("第", times, "次迭代運算(F函數)原子密鑰(上)及經E擴展的48位R0二進制碼(中)及二者異或後的結果(下)") show_array_no_format(sub_key) show_array_no_format(right_extend_data) for index in range(1, len(right_extend_data) * len(right_extend_data[0]) + 1): data = sub_key[get_x_y(index, 6)[0]][get_x_y(index, 6)[1]] ^ right_extend_data[get_x_y(index, 6)[0]][get_x_y(index, 6)[1]] result_temp.append(data) for data in result_temp: print(data, " ", end='') print() for index in range(1, len(result_temp) + 1): temp_list.append(result_temp[index - 1]) if index % 6 == 0: result.append(temp_list) temp_list = [] return result # 將擴展後的子密鑰與擴展後的明文二進制碼的右半部分進行S盒替換 def s_replace(sub_keys_extend): result = [] sub_key_temp = [] temp_list = [] for index in range(1, len(sub_keys_extend) + 1): line_str = str(sub_keys_extend[index - 1][0]) + str(sub_keys_extend[index - 1][5]) row_str = str(sub_keys_extend[index - 1][1]) + str(sub_keys_extend[index - 1][2]) + str(sub_keys_extend[index - 1][3]) + str( sub_keys_extend[index - 1][4]) line = int(line_str, 2) row = int(row_str, 2) source_data = S[index - 1][line][row] temp_data = bin(source_data) temp_data = temp_data[2:] data = temp_data.rjust(4, '0') for temp in data: temp_list.append(int(temp)) result.append(temp_list) temp_list = [] return result def p_replace(source_s_result, left_data, times): result = [] result_temp = [] temp_list = [] show_array(str("第" + str(times) + "次迭代運算(F函數)中P盒置換前作為輸入的S盒32位二進制秘鑰是"), source_s_result) for index in range(1, len(source_s_result) * len(source_s_result[0]) + 1): source_position = P[get_x_y(index, 4)[0]][get_x_y(index, 4)[1]] result_temp.append(source_s_result[get_x_y(source_position, 4)[0]][get_x_y(source_position, 4)[1]]) print("第", times, "次迭代運算(F函數)中P盒置換後作為輸入的S盒32位二進制秘鑰被替換成如下二進制數據") for index in range(1, len(result_temp) + 1): print(result_temp[index - 1], " ", end='') if index % 4 == 0: print() left_format = conversion_list(left_data, 4, 8, 8, 4) show_array(str("第" + str(times) + "次迭代運算(F函數)中P盒置換前作為輸入的S盒32位二進制秘鑰是P盒置換前作為輸入的明文左部分32位二進制數據是"), left_format) for index in range(1, len(source_s_result) * len(source_s_result[0]) + 1): data = result_temp[index - 1] ^ left_format[get_x_y(index, 4)[0]][get_x_y(index, 4)[1]] temp_list.append(data) if index % 4 == 0: result.append(temp_list) temp_list = [] return result def sixteen_iteration(left0, right0, sub_keys): left_data = left0 right_data = right0 temp_data = [] result = [] result_temp = [] for index in range(1, len(sub_keys) + 1): e_extend_right = e_extend(right_data) f_xor_result = f_xor(e_extend_right, sub_keys[index - 1], index) right_data = s_replace(f_xor_result) left_data = p_replace(right_data, left_data, index) temp_data = left_data left_data = right_data right_data = temp_data for temp_list in left_data: result_temp.append(temp_list) for temp_list in right_data: result_temp.append(temp_list) temp_list = [] for index in range(1, len(result_temp) * len(result_temp[0]) + 1): temp_list.append(result_temp[get_x_y(index, 4)[0]][get_x_y(index, 4)[1]]) if index % 8 == 0: result.append(temp_list) temp_list = [] return result def ip_1_replace(sixteen_iteration_result): result = [] temp_str = "" result_list = [] temp_list = [] for index in range(1, len(sixteen_iteration_result) * len(sixteen_iteration_result[0]) + 1): source_position = IP_1_TABLE[get_x_y(index, 8)[0]][get_x_y(index, 8)[1]] temp_str += str(sixteen_iteration_result[get_x_y(source_position, 8)[0]][get_x_y(source_position, 8)[1]]) temp_list.append(sixteen_iteration_result[get_x_y(source_position, 8)[0]][get_x_y(source_position, 8)[1]]) if index % 8 == 0: result.append(temp_str) result_list.append(temp_list) temp_str = "" temp_list = [] return result, result_list def get_ascii_by_bin(bin_list): result = "" for bin_data in bin_list: num = int(bin_data, 2) result += chr(num) return result if __name__ == "__main__": # IP置換矩陣 IP_Table = [ [58, 50, 42, 34, 26, 18, 10, 2], [60, 52, 44, 36, 28, 20, 12, 4], [62, 54, 46, 38, 30, 22, 14, 6], [64, 56, 48, 40, 32, 24, 16, 8], [57, 49, 41, 33, 25, 17, 9, 1], [59, 51, 43, 35, 27, 19, 11, 3], [61, 53, 45, 37, 29, 21, 13, 5], [63, 55, 47, 39, 31, 23, 15, 7] ] IP_1_TABLE = [ [40, 8, 48, 16, 56, 24, 64, 32], [39, 7, 47, 15, 55, 23, 63, 31], [38, 6, 46, 14, 54, 22, 62, 30], [37, 5, 45, 13, 53, 21, 61, 29], [36, 4, 44, 12, 52, 20, 60, 28], [35, 3, 43, 11, 51, 19, 59, 27], [34, 2, 42, 10, 50, 18, 58, 26], [33, 1, 41, 9, 49, 17, 57, 25] ] # PC-1表 PC_1_Table = [ [57, 49, 41, 33, 25, 17, 9], [1, 58, 50, 42, 34, 26, 18], [10, 2, 59, 51, 43, 35, 27], [19, 11, 3, 60, 52, 44, 36], [63, 55, 47, 39, 31, 23, 15], [7, 62, 54, 46, 38, 30, 22], [14, 6, 61, 53, 45, 37, 29], [21, 13, 5, 28, 20, 12, 4] ] # PC-2表 PC_2_Table = [ [14, 17, 11, 24, 1, 5], [3, 28, 15, 6, 21, 10], [23, 19, 12, 4, 26, 8], [16, 7, 27, 20, 13, 2], [41, 52, 31, 37, 47, 55], [30, 40, 51, 45, 33, 48], [44, 49, 39, 56, 34, 53], [46, 42, 50, 36, 29, 32] ] # 擴展置換E表 E_EXTEND_TABLE = [ [32, 1, 2, 3, 4, 5], [4, 5, 6, 7, 8, 9], [8, 9, 10, 11, 12, 13], [12, 13, 14, 15, 16, 17], [16, 17, 18, 19, 20, 21], [20, 21, 22, 23, 24, 25], [24, 25, 26, 27, 28, 29], [28, 29, 30, 31, 32, 1] ] # 以下是8個S盒功能表 S_1 = [ [14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7], [0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8], [4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0], [15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13] ] S_2 = [ [15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10], [3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5], [0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15], [13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9] ] S_3 = [ [10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8], [13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1], [13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7], [1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12] ] S_4 = [ [7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15], [13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9], [10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4], [3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14] ] S_5 = [ [2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9], [14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6], [4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14], [11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3] ] S_6 = [ [12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11], [10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8], [9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6], [4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13] ] S_7 = [ [4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1], [13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6], [1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2], [6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12] ] S_8 = [ [13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7], [1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2], [7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8], [2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11] ] S = [S_1, S_2, S_3, S_4, S_5, S_6, S_7, S_8] P = [ [16, 7, 20, 21], [29, 12, 28, 17], [1, 15, 23, 26], [5, 18, 31, 10], [2, 8, 24, 14], [32, 27, 3, 9], [19, 13, 30, 6], [22, 11, 4, 25] ] plaintext_state, bin_plaintext = is_ascii("computer") show_array("明文二進制碼", bin_plaintext) init_replace_plaintext = init_replace(bin_plaintext) show_array("初始置換", init_replace_plaintext) left_plaintext, right_plaintext = get_left_right(init_replace_plaintext) show_array("左半部分 L0", left_plaintext) show_array("右半部分 R0", right_plaintext) secret_state, bin_secret = is_ascii("networks") show_array("密鑰二進制碼", bin_secret) pc1_secret_text = update_secret(bin_secret) show_array("去除秘鑰最後一列的二進制秘鑰", pc1_secret_text) secret_text = pc1_secret(bin_secret) show_array("經PC-1置換後的二進制秘鑰", secret_text) left_secret, right_secret = get_left_right(secret_text) show_array("左半部分 C0", left_secret) show_array("右半部分 D0", right_secret) all_sub_keys = get_sub_key(left_secret, right_secret) show_array("生成的十六個子密鑰如下:", all_sub_keys) iteration_result = sixteen_iteration(left_plaintext, right_plaintext, all_sub_keys) show_array("明文和密碼經十六輪F函數迭代後最終結果", iteration_result) ascii_secret_result, bin_secret_result = ip_1_replace(iteration_result) show_array("明文經過秘鑰通過DES加密算法最終生成以下密文", bin_secret_result) print("\n 密文轉為ASCII碼為", get_ascii_by_bin(ascii_secret_result))
四、程序執行效果
J:\Project\Python\des\venv\Scripts\python.exe J:/Project/Python/des/src/des.py ======================================== 明文二進制碼 ======================================== [0, 1, 1, 0, 0, 0, 1, 1] [0, 1, 1, 0, 1, 1, 1, 1] [0, 1, 1, 0, 1, 1, 0, 1] [0, 1, 1, 1, 0, 0, 0, 0] [0, 1, 1, 1, 0, 1, 0, 1] [0, 1, 1, 1, 0, 1, 0, 0] [0, 1, 1, 0, 0, 1, 0, 1] [0, 1, 1, 1, 0, 0, 1, 0] ======================================== 初始置換 ======================================== [1, 1, 1, 1, 1, 1, 1, 1] [1, 0, 1, 1, 1, 0, 0, 0] [0, 1, 1, 1, 0, 1, 1, 0] [0, 1, 0, 1, 0, 1, 1, 1] [0, 0, 0, 0, 0, 0, 0, 0] [1, 1, 1, 1, 1, 1, 1, 1] [0, 0, 0, 0, 0, 1, 1, 0] [1, 0, 0, 0, 0, 0, 1, 1] ======================================== 左半部分 L0 ======================================== [1, 1, 1, 1, 1, 1, 1, 1] [1, 0, 1, 1, 1, 0, 0, 0] [0, 1, 1, 1, 0, 1, 1, 0] [0, 1, 0, 1, 0, 1, 1, 1] ======================================== 右半部分 R0 ======================================== [0, 0, 0, 0, 0, 0, 0, 0] [1, 1, 1, 1, 1, 1, 1, 1] [0, 0, 0, 0, 0, 1, 1, 0] [1, 0, 0, 0, 0, 0, 1, 1] ======================================== 密鑰二進制碼 ======================================== [0, 1, 1, 0, 1, 1, 1, 0] [0, 1, 1, 0, 0, 1, 0, 1] [0, 1, 1, 1, 0, 1, 0, 0] [0, 1, 1, 1, 0, 1, 1, 1] [0, 1, 1, 0, 1, 1, 1, 1] [0, 1, 1, 1, 0, 0, 1, 0] [0, 1, 1, 0, 1, 0, 1, 1] [0, 1, 1, 1, 0, 0, 1, 1] ======================================== 去除秘鑰最後一列的二進制秘鑰 ======================================== [0, 1, 1, 0, 1, 1, 1] [0, 1, 1, 0, 0, 1, 0] [0, 1, 1, 1, 0, 1, 0] [0, 1, 1, 1, 0, 1, 1] [0, 1, 1, 0, 1, 1, 1] [0, 1, 1, 1, 0, 0, 1] [0, 1, 1, 0, 1, 0, 1] [0, 1, 1, 1, 0, 0, 1] ======================================== 經PC-1置換後的二進制秘鑰 ======================================== [0, 0, 0, 0, 0, 0, 0] [0, 1, 1, 1, 1, 1, 1] [1, 1, 1, 1, 1, 1, 1] [1, 1, 1, 1, 0, 1, 0] [1, 1, 1, 1, 1, 0, 0] [1, 0, 0, 0, 1, 1, 1] [1, 1, 0, 1, 0, 1, 0] [0, 0, 1, 1, 1, 0, 0] ======================================== 左半部分 C0 ======================================== [0, 0, 0, 0, 0, 0, 0] [0, 1, 1, 1, 1, 1, 1] [1, 1, 1, 1, 1, 1, 1] [1, 1, 1, 1, 0, 1, 0] ======================================== 右半部分 D0 ======================================== [1, 1, 1, 1, 1, 0, 0] [1, 0, 0, 0, 1, 1, 1] [1, 1, 0, 1, 0, 1, 0] [0, 0, 1, 1, 1, 0, 0] |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ||||||||||||||||||||||||||||||||||||||第 1 次子密鑰開始生成|||||||||||||||||||||||||||||||||||||| ======================================== C0、D0經循環左移合併後的二進制秘鑰 ======================================== [0, 0, 0, 0, 0, 0, 0] [1, 1, 1, 1, 1, 1, 1] [1, 1, 1, 1, 1, 1, 1] [1, 1, 1, 0, 1, 0, 0] [1, 1, 1, 1, 0, 0, 1] [0, 0, 0, 1, 1, 1, 1] [1, 0, 1, 0, 1, 0, 0] [0, 1, 1, 1, 0, 0, 1] ======================================== 經PC-2壓縮置換後的二進制秘鑰===>子密鑰 ======================================== [1, 1, 1, 1, 0, 0] [0, 0, 1, 0, 1, 1] [1, 1, 1, 0, 1, 1] [1, 0, 0, 1, 1, 0] [1, 1, 1, 0, 1, 0] [1, 1, 1, 1, 0, 0] [0, 0, 1, 1, 0, 1] [0, 1, 0, 0, 1, 1] ||||||||||||||||||||||||||||||||||||||第 1 次子密鑰生成完成|||||||||||||||||||||||||||||||||||||| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ||||||||||||||||||||||||||||||||||||||第 2 次子密鑰開始生成|||||||||||||||||||||||||||||||||||||| ======================================== C0、D0經循環左移合併後的二進制秘鑰 ======================================== [0, 0, 0, 0, 0, 0, 1] [1, 1, 1, 1, 1, 1, 1] [1, 1, 1, 1, 1, 1, 1] [1, 1, 0, 1, 0, 0, 0] [1, 1, 1, 0, 0, 1, 0] [0, 0, 1, 1, 1, 1, 1] [0, 1, 0, 1, 0, 0, 0] [1, 1, 1, 0, 0, 1, 1] ======================================== 經PC-2壓縮置換後的二進制秘鑰===>子密鑰 ======================================== [1, 1, 1, 0, 0, 0] [0, 0, 1, 0, 1, 1] [1, 1, 1, 0, 0, 1] [1, 1, 0, 1, 1, 0] [1, 1, 1, 0, 0, 1] [1, 1, 1, 0, 0, 0] [1, 0, 1, 1, 1, 0] [1, 1, 1, 0, 1, 0] ||||||||||||||||||||||||||||||||||||||第 2 次子密鑰生成完成|||||||||||||||||||||||||||||||||||||| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ||||||||||||||||||||||||||||||||||||||第 3 次子密鑰開始生成|||||||||||||||||||||||||||||||||||||| ======================================== C0、D0經循環左移合併後的二進制秘鑰 ======================================== [0, 0, 0, 0, 1, 1, 1] [1, 1, 1, 1, 1, 1, 1] [1, 1, 1, 1, 1, 1, 1] [0, 1, 0, 0, 0, 0, 0] [1, 0, 0, 1, 0, 0, 0] [1, 1, 1, 1, 1, 0, 1] [0, 1, 0, 0, 0, 1, 1] [1, 0, 0, 1, 1, 1, 1] ======================================== 經PC-2壓縮置換後的二進制秘鑰===>子密鑰 ======================================== [1, 1, 1, 0, 0, 1] [0, 0, 1, 1, 1, 1] [1, 1, 1, 0, 0, 1] [1, 1, 0, 1, 1, 0] [0, 0, 0, 1, 0, 1] [0, 1, 0, 0, 0, 1] [1, 1, 1, 1, 0, 1] [0, 1, 1, 1, 1, 1] ||||||||||||||||||||||||||||||||||||||第 3 次子密鑰生成完成|||||||||||||||||||||||||||||||||||||| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ||||||||||||||||||||||||||||||||||||||第 4 次子密鑰開始生成|||||||||||||||||||||||||||||||||||||| ======================================== C0、D0經循環左移合併後的二進制秘鑰 ======================================== [0, 0, 1, 1, 1, 1, 1] [1, 1, 1, 1, 1, 1, 1] [1, 1, 1, 1, 1, 0, 1] [0, 0, 0, 0, 0, 0, 0] [0, 1, 0, 0, 0, 1, 1] [1, 1, 1, 0, 1, 0, 1] [0, 0, 0, 1, 1, 1, 0] [0, 1, 1, 1, 1, 1, 0] ======================================== 經PC-2壓縮置換後的二進制秘鑰===>子密鑰 ======================================== [1, 1, 1, 0, 0, 1] [1, 0, 1, 1, 1, 1] [0, 1, 1, 1, 0, 1] [1, 1, 0, 0, 1, 0] [0, 1, 0, 1, 1, 1] [1, 1, 1, 0, 0, 1] [0, 0, 0, 0, 1, 1] [1, 1, 0, 1, 0, 0] ||||||||||||||||||||||||||||||||||||||第 4 次子密鑰生成完成|||||||||||||||||||||||||||||||||||||| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ||||||||||||||||||||||||||||||||||||||第 5 次子密鑰開始生成|||||||||||||||||||||||||||||||||||||| ======================================== C0、D0經循環左移合併後的二進制秘鑰 ======================================== [1, 1, 1, 1, 1, 1, 1] [1, 1, 1, 1, 1, 1, 1] [1, 1, 1, 0, 1, 0, 0] [0, 0, 0, 0, 0, 0, 0] [0, 0, 0, 1, 1, 1, 1] [1, 0, 1, 0, 1, 0, 0] [0, 1, 1, 1, 0, 0, 1] [1, 1, 1, 1, 0, 0, 1] ======================================== 經PC-2壓縮置換後的二進制秘鑰===>子密鑰 ======================================== [1, 1, 1, 0, 1, 1] [1, 0, 1, 1, 0, 1] [0, 1, 1, 1, 0, 1] [1, 1, 0, 0, 1, 1] [0, 1, 0, 0, 0, 0] [0, 1, 1, 1, 1, 0] [1, 1, 0, 1, 1, 1] [1, 0, 1, 1, 0, 1] ||||||||||||||||||||||||||||||||||||||第 5 次子密鑰生成完成|||||||||||||||||||||||||||||||||||||| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ||||||||||||||||||||||||||||||||||||||第 6 次子密鑰開始生成|||||||||||||||||||||||||||||||||||||| ======================================== C0、D0經循環左移合併後的二進制秘鑰 ======================================== [1, 1, 1, 1, 1, 1, 1] [1, 1, 1, 1, 1, 1, 1] [1, 0, 1, 0, 0, 0, 0] [0, 0, 0, 0, 0, 1, 1] [0, 1, 1, 1, 1, 1, 0] [1, 0, 1, 0, 0, 0, 1] [1, 1, 0, 0, 1, 1, 1] [1, 1, 0, 0, 1, 0, 0] ======================================== 經PC-2壓縮置換後的二進制秘鑰===>子密鑰 ======================================== [1, 1, 1, 0, 1, 1] [1, 1, 1, 1, 0, 1] [0, 0, 1, 1, 0, 1] [0, 1, 1, 0, 1, 1] [0, 0, 1, 0, 1, 0] [1, 0, 1, 0, 1, 1] [1, 1, 0, 0, 1, 0] [0, 1, 1, 1, 0, 1] ||||||||||||||||||||||||||||||||||||||第 6 次子密鑰生成完成|||||||||||||||||||||||||||||||||||||| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ||||||||||||||||||||||||||||||||||||||第 7 次子密鑰開始生成|||||||||||||||||||||||||||||||||||||| ======================================== C0、D0經循環左移合併後的二進制秘鑰 ======================================== [1, 1, 1, 1, 1, 1, 1] [1, 1, 1, 1, 1, 1, 0] [1, 0, 0, 0, 0, 0, 0] [0, 0, 0, 1, 1, 1, 1] [1, 1, 1, 1, 0, 1, 0] [1, 0, 0, 0, 1, 1, 1] [0, 0, 1, 1, 1, 1, 1] [0, 0, 1, 0, 0, 0, 1] ======================================== 經PC-2壓縮置換後的二進制秘鑰===>子密鑰 ======================================== [0, 0, 1, 0, 1, 1] [1, 1, 1, 1, 0, 1] [0, 0, 1, 1, 1, 1] [0, 1, 1, 0, 1, 1] [1, 1, 1, 0, 1, 0] [1, 1, 0, 1, 0, 1] [0, 1, 0, 1, 1, 0] [1, 1, 0, 1, 1, 1] ||||||||||||||||||||||||||||||||||||||第 7 次子密鑰生成完成|||||||||||||||||||||||||||||||||||||| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ||||||||||||||||||||||||||||||||||||||第 8 次子密鑰開始生成|||||||||||||||||||||||||||||||||||||| ======================================== C0、D0經循環左移合併後的二進制秘鑰 ======================================== [1, 1, 1, 1, 1, 1, 1] [1, 1, 1, 1, 0, 1, 0] [0, 0, 0, 0, 0, 0, 0] [0, 1, 1, 1, 1, 1, 1] [1, 1, 0, 1, 0, 1, 0] [0, 0, 1, 1, 1, 0, 0] [1, 1, 1, 1, 1, 0, 0] [1, 0, 0, 0, 1, 1, 1] ======================================== 經PC-2壓縮置換後的二進制秘鑰===>子密鑰 ======================================== [0, 0, 1, 1, 1, 1] [1, 1, 0, 1, 0, 1] [1, 0, 0, 1, 1, 1] [0, 1, 1, 0, 1, 1] [0, 0, 0, 0, 1, 1] [1, 1, 0, 1, 0, 0] [1, 0, 1, 1, 1, 0] [1, 0, 1, 0, 1, 1] ||||||||||||||||||||||||||||||||||||||第 8 次子密鑰生成完成|||||||||||||||||||||||||||||||||||||| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ||||||||||||||||||||||||||||||||||||||第 9 次子密鑰開始生成|||||||||||||||||||||||||||||||||||||| ======================================== C0、D0經循環左移合併後的二進制秘鑰 ======================================== [1, 1, 1, 1, 1, 1, 1] [1, 1, 1, 0, 1, 0, 0] [0, 0, 0, 0, 0, 0, 0] [1, 1, 1, 1, 1, 1, 1] [1, 0, 1, 0, 1, 0, 0] [0, 1, 1, 1, 0, 0, 1] [1, 1, 1, 1, 0, 0, 1] [0, 0, 0, 1, 1, 1, 1] ======================================== 經PC-2壓縮置換後的二進制秘鑰===>子密鑰 ======================================== [0, 0, 0, 1, 1, 1] [1, 1, 0, 1, 0, 1] [1, 0, 1, 1, 1, 1] [0, 1, 1, 0, 0, 1] [0, 0, 1, 1, 0, 1] [0, 0, 0, 1, 1, 0] [1, 1, 1, 1, 0, 1] [1, 1, 0, 0, 1, 0] ||||||||||||||||||||||||||||||||||||||第 9 次子密鑰生成完成|||||||||||||||||||||||||||||||||||||| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ||||||||||||||||||||||||||||||||||||||第 10 次子密鑰開始生成|||||||||||||||||||||||||||||||||||||| ======================================== C0、D0經循環左移合併後的二進制秘鑰 ======================================== [1, 1, 1, 1, 1, 1, 1] [1, 0, 1, 0, 0, 0, 0] [0, 0, 0, 0, 0, 1, 1] [1, 1, 1, 1, 1, 1, 1] [1, 0, 1, 0, 0, 0, 1] [1, 1, 0, 0, 1, 1, 1] [1, 1, 0, 0, 1, 0, 0] [0, 1, 1, 1, 1, 1, 0] ======================================== 經PC-2壓縮置換後的二進制秘鑰===>子密鑰 ======================================== [0, 0, 0, 1, 1, 1] [1, 1, 0, 1, 1, 1] [1, 0, 0, 1, 1, 1] [0, 1, 1, 1, 0, 1] [1, 1, 1, 1, 1, 1] [0, 1, 1, 0, 0, 0] [1, 0, 0, 0, 0, 1] [0, 1, 0, 1, 1, 0] ||||||||||||||||||||||||||||||||||||||第 10 次子密鑰生成完成|||||||||||||||||||||||||||||||||||||| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ||||||||||||||||||||||||||||||||||||||第 11 次子密鑰開始生成|||||||||||||||||||||||||||||||||||||| ======================================== C0、D0經循環左移合併後的二進制秘鑰 ======================================== [1, 1, 1, 1, 1, 1, 0] [1, 0, 0, 0, 0, 0, 0] [0, 0, 0, 1, 1, 1, 1] [1, 1, 1, 1, 1, 1, 1] [1, 0, 0, 0, 1, 1, 1] [0, 0, 1, 1, 1, 1, 1] [0, 0, 1, 0, 0, 0, 1] [1, 1, 1, 1, 0, 1, 0] ======================================== 經PC-2壓縮置換後的二進制秘鑰===>子密鑰 ======================================== [0, 0, 0, 1, 1, 1] [1, 1, 0, 1, 1, 0] [1, 1, 0, 1, 1, 1] [0, 0, 1, 1, 0, 1] [1, 1, 0, 0, 0, 1] [0, 1, 1, 1, 1, 0] [0, 1, 1, 0, 1, 1] [0, 1, 1, 0, 1, 0] ||||||||||||||||||||||||||||||||||||||第 11 次子密鑰生成完成|||||||||||||||||||||||||||||||||||||| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ||||||||||||||||||||||||||||||||||||||第 12 次子密鑰開始生成|||||||||||||||||||||||||||||||||||||| ======================================== C0、D0經循環左移合併後的二進制秘鑰 ======================================== [1, 1, 1, 1, 0, 1, 0] [0, 0, 0, 0, 0, 0, 0] [0, 1, 1, 1, 1, 1, 1] [1, 1, 1, 1, 1, 1, 1] [0, 0, 1, 1, 1, 0, 0] [1, 1, 1, 1, 1, 0, 0] [1, 0, 0, 0, 1, 1, 1] [1, 1, 0, 1, 0, 1, 0] ======================================== 經PC-2壓縮置換後的二進制秘鑰===>子密鑰 ======================================== [0, 1, 0, 1, 1, 0] [1, 1, 0, 1, 1, 0] [1, 1, 0, 1, 1, 0] [1, 0, 1, 1, 0, 1] [0, 0, 1, 1, 1, 1] [0, 1, 1, 0, 1, 1] [0, 1, 1, 0, 0, 1] [0, 0, 1, 1, 0, 1] ||||||||||||||||||||||||||||||||||||||第 12 次子密鑰生成完成|||||||||||||||||||||||||||||||||||||| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ||||||||||||||||||||||||||||||||||||||第 13 次子密鑰開始生成|||||||||||||||||||||||||||||||||||||| ======================================== C0、D0經循環左移合併後的二進制秘鑰 ======================================== [1, 1, 0, 1, 0, 0, 0] [0, 0, 0, 0, 0, 0, 1] [1, 1, 1, 1, 1, 1, 1] [1, 1, 1, 1, 1, 1, 1] [1, 1, 1, 0, 0, 1, 1] [1, 1, 1, 0, 0, 1, 0] [0, 0, 1, 1, 1, 1, 1] [0, 1, 0, 1, 0, 0, 0] ======================================== 經PC-2壓縮置換後的二進制秘鑰===>子密鑰 ======================================== [1, 1, 0, 1, 1, 0] [0, 1, 1, 0, 1, 0] [1, 1, 0, 1, 1, 0] [1, 0, 1, 1, 0, 1] [1, 0, 1, 1, 1, 0] [1, 0, 1, 1, 0, 1] [0, 1, 0, 0, 1, 1] [1, 0, 0, 1, 1, 0] ||||||||||||||||||||||||||||||||||||||第 13 次子密鑰生成完成|||||||||||||||||||||||||||||||||||||| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ||||||||||||||||||||||||||||||||||||||第 14 次子密鑰開始生成|||||||||||||||||||||||||||||||||||||| ======================================== C0、D0經循環左移合併後的二進制秘鑰 ======================================== [0, 1, 0, 0, 0, 0, 0] [0, 0, 0, 0, 1, 1, 1] [1, 1, 1, 1, 1, 1, 1] [1, 1, 1, 1, 1, 1, 1] [1, 0, 0, 1, 1, 1, 1] [1, 0, 0, 1, 0, 0, 0] [1, 1, 1, 1, 1, 0, 1] [0, 1, 0, 0, 0, 1, 1] ======================================== 經PC-2壓縮置換後的二進制秘鑰===>子密鑰 ======================================== [1, 1, 0, 1, 0, 0] [0, 1, 1, 0, 1, 0] [1, 1, 1, 0, 1, 0] [1, 0, 1, 1, 1, 1] [0, 0, 0, 0, 1, 1] [0, 0, 1, 1, 1, 0] [1, 1, 1, 1, 1, 0] [1, 0, 0, 1, 1, 1] ||||||||||||||||||||||||||||||||||||||第 14 次子密鑰生成完成|||||||||||||||||||||||||||||||||||||| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ||||||||||||||||||||||||||||||||||||||第 15 次子密鑰開始生成|||||||||||||||||||||||||||||||||||||| ======================================== C0、D0經循環左移合併後的二進制秘鑰 ======================================== [0, 0, 0, 0, 0, 0, 0] [0, 0, 1, 1, 1, 1, 1] [1, 1, 1, 1, 1, 1, 1] [1, 1, 1, 1, 1, 0, 1] [0, 1, 1, 1, 1, 1, 0] [0, 1, 0, 0, 0, 1, 1] [1, 1, 1, 0, 1, 0, 1] [0, 0, 0, 1, 1, 1, 0] ======================================== 經PC-2壓縮置換後的二進制秘鑰===>子密鑰 ======================================== [1, 1, 1, 1, 0, 0] [0, 1, 1, 0, 1, 1] [1, 1, 1, 0, 1, 0] [1, 0, 0, 1, 1, 0] [1, 0, 1, 1, 1, 1] [1, 0, 0, 1, 1, 0] [1, 1, 0, 0, 1, 1] [0, 1, 0, 0, 0, 1] ||||||||||||||||||||||||||||||||||||||第 15 次子密鑰生成完成|||||||||||||||||||||||||||||||||||||| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ||||||||||||||||||||||||||||||||||||||第 16 次子密鑰開始生成|||||||||||||||||||||||||||||||||||||| ======================================== C0、D0經循環左移合併後的二進制秘鑰 ======================================== [0, 0, 0, 0, 0, 0, 0] [0, 1, 1, 1, 1, 1, 1] [1, 1, 1, 1, 1, 1, 1] [1, 1, 1, 1, 0, 1, 0] [1, 1, 1, 1, 1, 0, 0] [1, 0, 0, 0, 1, 1, 1] [1, 1, 0, 1, 0, 1, 0] [0, 0, 1, 1, 1, 0, 0] ======================================== 經PC-2壓縮置換後的二進制秘鑰===>子密鑰 ======================================== [1, 1, 1, 1, 0, 0] [0, 0, 1, 0, 1, 1] [1, 1, 1, 0, 0, 0] [1, 0, 1, 1, 1, 0] [1, 1, 1, 0, 0, 0] [1, 1, 0, 0, 1, 1] [1, 0, 0, 0, 0, 1] [1, 1, 0, 1, 1, 1] ||||||||||||||||||||||||||||||||||||||第 16 次子密鑰生成完成|||||||||||||||||||||||||||||||||||||| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ======================================== 生成的十六個子密鑰如下: ======================================== [[1, 1, 1, 1, 0, 0], [0, 0, 1, 0, 1, 1], [1, 1, 1, 0, 1, 1], [1, 0, 0, 1, 1, 0], [1, 1, 1, 0, 1, 0], [1, 1, 1, 1, 0, 0], [0, 0, 1, 1, 0, 1], [0, 1, 0, 0, 1, 1]] [[1, 1, 1, 0, 0, 0], [0, 0, 1, 0, 1, 1], [1, 1, 1, 0, 0, 1], [1, 1, 0, 1, 1, 0], [1, 1, 1, 0, 0, 1], [1, 1, 1, 0, 0, 0], [1, 0, 1, 1, 1, 0], [1, 1, 1, 0, 1, 0]] [[1, 1, 1, 0, 0, 1], [0, 0, 1, 1, 1, 1], [1, 1, 1, 0, 0, 1], [1, 1, 0, 1, 1, 0], [0, 0, 0, 1, 0, 1], [0, 1, 0, 0, 0, 1], [1, 1, 1, 1, 0, 1], [0, 1, 1, 1, 1, 1]] [[1, 1, 1, 0, 0, 1], [1, 0, 1, 1, 1, 1], [0, 1, 1, 1, 0, 1], [1, 1, 0, 0, 1, 0], [0, 1, 0, 1, 1, 1], [1, 1, 1, 0, 0, 1], [0, 0, 0, 0, 1, 1], [1, 1, 0, 1, 0, 0]] [[1, 1, 1, 0, 1, 1], [1, 0, 1, 1, 0, 1], [0, 1, 1, 1, 0, 1], [1, 1, 0, 0, 1, 1], [0, 1, 0, 0, 0, 0], [0, 1, 1, 1, 1, 0], [1, 1, 0, 1, 1, 1], [1, 0, 1, 1, 0, 1]] [[1, 1, 1, 0, 1, 1], [1, 1, 1, 1, 0, 1], [0, 0, 1, 1, 0, 1], [0, 1, 1, 0, 1, 1], [0, 0, 1, 0, 1, 0], [1, 0, 1, 0, 1, 1], [1, 1, 0, 0, 1, 0], [0, 1, 1, 1, 0, 1]] [[0, 0, 1, 0, 1, 1], [1, 1, 1, 1, 0, 1], [0, 0, 1, 1, 1, 1], [0, 1, 1, 0, 1, 1], [1, 1, 1, 0, 1, 0], [1, 1, 0, 1, 0, 1], [0, 1, 0, 1, 1, 0], [1, 1, 0, 1, 1, 1]] [[0, 0, 1, 1, 1, 1], [1, 1, 0, 1, 0, 1], [1, 0, 0, 1, 1, 1], [0, 1, 1, 0, 1, 1], [0, 0, 0, 0, 1, 1], [1, 1, 0, 1, 0, 0], [1, 0, 1, 1, 1, 0], [1, 0, 1, 0, 1, 1]] [[0, 0, 0, 1, 1, 1], [1, 1, 0, 1, 0, 1], [1, 0, 1, 1, 1, 1], [0, 1, 1, 0, 0, 1], [0, 0, 1, 1, 0, 1], [0, 0, 0, 1, 1, 0], [1, 1, 1, 1, 0, 1], [1, 1, 0, 0, 1, 0]] [[0, 0, 0, 1, 1, 1], [1, 1, 0, 1, 1, 1], [1, 0, 0, 1, 1, 1], [0, 1, 1, 1, 0, 1], [1, 1, 1, 1, 1, 1], [0, 1, 1, 0, 0, 0], [1, 0, 0, 0, 0, 1], [0, 1, 0, 1, 1, 0]] [[0, 0, 0, 1, 1, 1], [1, 1, 0, 1, 1, 0], [1, 1, 0, 1, 1, 1], [0, 0, 1, 1, 0, 1], [1, 1, 0, 0, 0, 1], [0, 1, 1, 1, 1, 0], [0, 1, 1, 0, 1, 1], [0, 1, 1, 0, 1, 0]] [[0, 1, 0, 1, 1, 0], [1, 1, 0, 1, 1, 0], [1, 1, 0, 1, 1, 0], [1, 0, 1, 1, 0, 1], [0, 0, 1, 1, 1, 1], [0, 1, 1, 0, 1, 1], [0, 1, 1, 0, 0, 1], [0, 0, 1, 1, 0, 1]] [[1, 1, 0, 1, 1, 0], [0, 1, 1, 0, 1, 0], [1, 1, 0, 1, 1, 0], [1, 0, 1, 1, 0, 1], [1, 0, 1, 1, 1, 0], [1, 0, 1, 1, 0, 1], [0, 1, 0, 0, 1, 1], [1, 0, 0, 1, 1, 0]] [[1, 1, 0, 1, 0, 0], [0, 1, 1, 0, 1, 0], [1, 1, 1, 0, 1, 0], [1, 0, 1, 1, 1, 1], [0, 0, 0, 0, 1, 1], [0, 0, 1, 1, 1, 0], [1, 1, 1, 1, 1, 0], [1, 0, 0, 1, 1, 1]] [[1, 1, 1, 1, 0, 0], [0, 1, 1, 0, 1, 1], [1, 1, 1, 0, 1, 0], [1, 0, 0, 1, 1, 0], [1, 0, 1, 1, 1, 1], [1, 0, 0, 1, 1, 0], [1, 1, 0, 0, 1, 1], [0, 1, 0, 0, 0, 1]] [[1, 1, 1, 1, 0, 0], [0, 0, 1, 0, 1, 1], [1, 1, 1, 0, 0, 0], [1, 0, 1, 1, 1, 0], [1, 1, 1, 0, 0, 0], [1, 1, 0, 0, 1, 1], [1, 0, 0, 0, 0, 1], [1, 1, 0, 1, 1, 1]] 第 1 次迭代運算(F函數)原子密鑰(上)及經E擴展的48位R0二進制碼(中)及二者異或後的結果(下) 1 1 1 1 0 0 0 0 1 0 1 1 1 1 1 0 1 1 1 0 0 1 1 0 1 1 1 0 1 0 1 1 1 1 0 0 0 0 1 1 0 1 0 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 1 1 1 1 0 1 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0 1 1 0 0 1 1 1 0 0 0 0 1 0 1 0 1 0 0 1 0 0 0 1 1 0 0 0 0 1 1 0 1 0 1 1 0 0 0 1 0 1 1 1 0 1 0 1 0 1 0 1 ======================================== 第1次迭代運算(F函數)中P盒置換前作為輸入的S盒32位二進制秘鑰是 ======================================== [0, 0, 0, 0] [1, 0, 1, 1] [0, 1, 0, 0] [1, 0, 1, 1] [0, 0, 0, 0] [1, 0, 1, 1] [1, 0, 0, 0] [0, 1, 1, 0] 第 1 次迭代運算(F函數)中P盒置換後作為輸入的S盒32位二進制秘鑰被替換成如下二進制數據 1 1 0 1 0 0 0 0 0 1 1 0 1 0 1 1 0 1 1 0 0 0 0 0 0 1 1 0 0 0 0 1 ======================================== 第1次迭代運算(F函數)中P盒置換前作為輸入的S盒32位二進制秘鑰是P盒置換前作為輸入的明文左部分32位二進制數據是 ======================================== [1, 1, 1, 1] [1, 1, 1, 1] [1, 0, 1, 1] [1, 0, 0, 0] [0, 1, 1, 1] [0, 1, 1, 0] [0, 1, 0, 1] [0, 1, 1, 1] 第 2 次迭代運算(F函數)原子密鑰(上)及經E擴展的48位R0二進制碼(中)及二者異或後的結果(下) 1 1 1 0 0 0 0 0 1 0 1 1 1 1 1 0 0 1 1 1 0 1 1 0 1 1 1 0 0 1 1 1 1 0 0 0 1 0 1 1 1 0 1 1 1 0 1 0 0 0 0 1 0 1 0 1 1 1 1 1 1 1 1 0 1 0 1 0 0 1 1 0 1 0 0 0 1 0 1 0 1 1 0 0 0 0 0 1 1 0 1 0 1 1 0 0 1 1 1 1 0 1 0 1 0 1 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 0 0 0 1 0 1 1 0 ======================================== 第2次迭代運算(F函數)中P盒置換前作為輸入的S盒32位二進制秘鑰是 ======================================== [0, 1, 1, 0] [0, 0, 1, 0] [0, 1, 1, 1] [0, 0, 0, 1] [1, 0, 0, 1] [0, 0, 1, 1] [1, 1, 0, 0] [1, 1, 1, 0] 第 2 次迭代運算(F函數)中P盒置換後作為輸入的S盒32位二進制秘鑰被替換成如下二進制數據 1 1 1 0 1 1 0 1 0 0 1 1 0 0 1 1 1 0 1 0 0 0 1 0 0 0 1 0 0 1 0 1 ======================================== 第2次迭代運算(F函數)中P盒置換前作為輸入的S盒32位二進制秘鑰是P盒置換前作為輸入的明文左部分32位二進制數據是 ======================================== [0, 0, 0, 0] [1, 0, 1, 1] [0, 1, 0, 0] [1, 0, 1, 1] [0, 0, 0, 0] [1, 0, 1, 1] [1, 0, 0, 0] [0, 1, 1, 0] 第 3 次迭代運算(F函數)原子密鑰(上)及經E擴展的48位R0二進制碼(中)及二者異或後的結果(下) 1 1 1 0 0 1 0 0 1 1 1 1 1 1 1 0 0 1 1 1 0 1 1 0 0 0 0 1 0 1 0 1 0 0 0 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 1 0 0 0 0 1 1 0 0 0 0 1 1 1 1 1 1 0 0 0 1 0 1 0 1 0 1 0 1 0 0 1 1 1 1 0 1 0 0 0 0 0 1 1 1 0 0 0 1 0 1 0 0 0 0 1 1 1 1 0 1 1 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 1 1 0 0 0 ======================================== 第3次迭代運算(F函數)中P盒置換前作為輸入的S盒32位二進制秘鑰是 ======================================== [0, 1, 1, 1] [1, 1, 0, 1] [1, 1, 0, 0] [0, 1, 0, 1] [1, 0, 0, 0] [0, 0, 0, 1] [0, 1, 0, 0] [0, 1, 0, 1] 第 3 次迭代運算(F函數)中P盒置換後作為輸入的S盒32位二進制秘鑰被替換成如下二進制數據 1 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 1 1 1 1 1 0 1 1 0 0 1 1 0 0 1 0 ======================================== 第3次迭代運算(F函數)中P盒置換前作為輸入的S盒32位二進制秘鑰是P盒置換前作為輸入的明文左部分32位二進制數據是 ======================================== [0, 1, 1, 0] [0, 0, 1, 0] [0, 1, 1, 1] [0, 0, 0, 1] [1, 0, 0, 1] [0, 0, 1, 1] [1, 1, 0, 0] [1, 1, 1, 0] 第 4 次迭代運算(F函數)原子密鑰(上)及經E擴展的48位R0二進制碼(中)及二者異或後的結果(下) 1 1 1 0 0 1 1 0 1 1 1 1 0 1 1 1 0 1 1 1 0 0 1 0 0 1 0 1 1 1 1 1 1 0 0 1 0 0 0 0 1 1 1 1 0 1 0 0 0 1 1 1 0 0 0 0 0 1 1 0 1 0 1 1 0 1 0 1 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 1 0 1 1 1 1 1 1 1 1 0 0 1 1 0 0 1 0 1 1 0 1 0 0 1 1 1 0 0 0 0 1 0 0 0 1 0 0 1 1 0 1 0 1 0 1 0 0 0 0 1 1 1 0 0 0 0 1 1 0 1 ======================================== 第4次迭代運算(F函數)中P盒置換前作為輸入的S盒32位二進制秘鑰是 ======================================== [1, 0, 0, 0] [0, 0, 1, 1] [1, 0, 1, 1] [0, 1, 1, 0] [0, 0, 0, 0] [0, 0, 1, 0] [0, 1, 1, 0] [0, 1, 1, 1] 第 4 次迭代運算(F函數)中P盒置換後作為輸入的S盒32位二進制秘鑰被替換成如下二進制數據 0 1 0 0 0 1 0 0 1 1 1 1 0 0 1 0 0 1 0 1 1 1 0 1 0 0 1 0 0 1 0 0 ======================================== 第4次迭代運算(F函數)中P盒置換前作為輸入的S盒32位二進制秘鑰是P盒置換前作為輸入的明文左部分32位二進制數據是 ======================================== [0, 1, 1, 1] [1, 1, 0, 1] [1, 1, 0, 0] [0, 1, 0, 1] [1, 0, 0, 0] [0, 0, 0, 1] [0, 1, 0, 0] [0, 1, 0, 1] 第 5 次迭代運算(F函數)原子密鑰(上)及經E擴展的48位R0二進制碼(中)及二者異或後的結果(下) 1 1 1 0 1 1 1 0 1 1 0 1 0 1 1 1 0 1 1 1 0 0 1 1 0 1 0 0 0 0 0 1 1 1 1 0 1 1 0 1 1 1 1 0 1 1 0 1 1 0 0 1 1 1 1 1 0 0 1 0 1 0 0 1 1 0 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 1 1 1 0 0 0 1 1 1 1 1 1 1 1 0 1 1 0 1 1 1 0 0 1 0 1 0 1 1 1 0 0 1 1 0 1 1 1 0 1 1 1 0 1 1 1 1 ======================================== 第5次迭代運算(F函數)中P盒置換前作為輸入的S盒32位二進制秘鑰是 ======================================== [0, 0, 0, 0] [0, 1, 0, 1] [0, 1, 0, 1] [0, 1, 0, 0] [1, 1, 1, 0] [0, 1, 0, 1] [0, 0, 1, 0] [1, 1, 0, 1] 第 5 次迭代運算(F函數)中P盒置換後作為輸入的S盒32位二進制秘鑰被替換成如下二進制數據 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 1 0 1 1 1 1 1 0 0 1 0 1 1 1 0 0 0 ======================================== 第5次迭代運算(F函數)中P盒置換前作為輸入的S盒32位二進制秘鑰是P盒置換前作為輸入的明文左部分32位二進制數據是 ======================================== [1, 0, 0, 0] [0, 0, 1, 1] [1, 0, 1, 1] [0, 1, 1, 0] [0, 0, 0, 0] [0, 0, 1, 0] [0, 1, 1, 0] [0, 1, 1, 1] 第 6 次迭代運算(F函數)原子密鑰(上)及經E擴展的48位R0二進制碼(中)及二者異或後的結果(下) 1 1 1 0 1 1 1 1 1 1 0 1 0 0 1 1 0 1 0 1 1 0 1 1 0 0 1 0 1 0 1 0 1 0 1 1 1 1 0 0 1 0 0 1 1 1 0 1 1 1 0 0 0 1 0 1 1 1 0 1 0 1 0 1 1 0 1 0 0 1 1 0 1 0 1 1 1 1 1 1 1 1 0 1 0 1 1 0 1 1 1 1 1 1 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 1 1 0 1 1 1 1 1 1 0 1 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 0 0 1 1 0 0 0 1 0 ======================================== 第6次迭代運算(F函數)中P盒置換前作為輸入的S盒32位二進制秘鑰是 ======================================== [1, 1, 1, 1] [0, 0, 0, 0] [1, 0, 1, 1] [0, 0, 1, 0] [1, 1, 0, 0] [0, 1, 0, 0] [0, 0, 0, 1] [1, 0, 1, 1] 第 6 次迭代運算(F函數)中P盒置換後作為輸入的S盒32位二進制秘鑰被替換成如下二進制數據 0 0 0 0 1 1 1 1 1 1 0 0 0 1 1 0 1 0 0 0 1 0 1 1 0 0 0 0 1 1 1 0 ======================================== 第6次迭代運算(F函數)中P盒置換前作為輸入的S盒32位二進制秘鑰是P盒置換前作為輸入的明文左部分32位二進制數據是 ======================================== [0, 0, 0, 0] [0, 1, 0, 1] [0, 1, 0, 1] [0, 1, 0, 0] [1, 1, 1, 0] [0, 1, 0, 1] [0, 0, 1, 0] [1, 1, 0, 1] 第 7 次迭代運算(F函數)原子密鑰(上)及經E擴展的48位R0二進制碼(中)及二者異或後的結果(下) 0 0 1 0 1 1 1 1 1 1 0 1 0 0 1 1 1 1 0 1 1 0 1 1 1 1 1 0 1 0 1 1 0 1 0 1 0 1 0 1 1 0 1 1 0 1 1 1 1 0 0 0 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 0 1 0 0 0 0 1 1 0 1 0 1 1 1 0 0 0 0 0 1 0 0 0 0 0 1 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0 1 1 1 0 1 1 1 1 1 1 1 1 1 0 1 1 1 1 0 1 0 0 1 0 1 0 0 1 0 1 1 0 0 0 1 ======================================== 第7次迭代運算(F函數)中P盒置換前作為輸入的S盒32位二進制秘鑰是 ======================================== [0, 1, 1, 0] [1, 0, 1, 0] [1, 1, 1, 1] [1, 1, 1, 0] [1, 0, 0, 1] [1, 0, 0, 1] [1, 1, 0, 0] [1, 1, 1, 1] 第 7 次迭代運算(F函數)中P盒置換後作為輸入的S盒32位二進制秘鑰被替換成如下二進制數據 0 1 1 1 1 1 0 1 0 1 0 1 1 0 1 1 1 0 1 1 1 0 1 1 0 1 1 0 0 1 0 1 ======================================== 第7次迭代運算(F函數)中P盒置換前作為輸入的S盒32位二進制秘鑰是P盒置換前作為輸入的明文左部分32位二進制數據是 ======================================== [1, 1, 1, 1] [0, 0, 0, 0] [1, 0, 1, 1] [0, 0, 1, 0] [1, 1, 0, 0] [0, 1, 0, 0] [0, 0, 0, 1] [1, 0, 1, 1] 第 8 次迭代運算(F函數)原子密鑰(上)及經E擴展的48位R0二進制碼(中)及二者異或後的結果(下) 0 0 1 1 1 1 1 1 0 1 0 1 1 0 0 1 1 1 0 1 1 0 1 1 0 0 0 0 1 1 1 1 0 1 0 0 1 0 1 1 1 0 1 0 1 0 1 1 0 1 0 0 0 1 0 1 1 0 1 1 1 1 1 1 0 1 0 1 0 0 1 0 1 0 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 0 1 0 1 1 1 1 0 1 0 1 1 1 0 0 1 1 0 1 0 0 0 1 0 0 1 1 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1 0 1 1 0 ======================================== 第8次迭代運算(F函數)中P盒置換前作為輸入的S盒32位二進制秘鑰是 ======================================== [0, 1, 1, 1] [0, 0, 0, 1] [0, 1, 0, 0] [0, 1, 1, 0] [0, 1, 1, 1] [0, 0, 1, 0] [1, 1, 0, 1] [1, 1, 1, 0] 第 8 次迭代運算(F函數)中P盒置換後作為輸入的S盒32位二進制秘鑰被替換成如下二進制數據 0 0 1 0 1 0 1 0 0 1 1 1 0 1 1 1 1 1 0 1 0 0 1 0 1 0 1 0 0 0 1 1 ======================================== 第8次迭代運算(F函數)中P盒置換前作為輸入的S盒32位二進制秘鑰是P盒置換前作為輸入的明文左部分32位二進制數據是 ======================================== [0, 1, 1, 0] [1, 0, 1, 0] [1, 1, 1, 1] [1, 1, 1, 0] [1, 0, 0, 1] [1, 0, 0, 1] [1, 1, 0, 0] [1, 1, 1, 1] 第 9 次迭代運算(F函數)原子密鑰(上)及經E擴展的48位R0二進制碼(中)及二者異或後的結果(下) 0 0 0 1 1 1 1 1 0 1 0 1 1 0 1 1 1 1 0 1 1 0 0 1 0 0 1 1 0 1 0 0 0 1 1 0 1 1 1 1 0 1 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 1 0 0 1 0 1 0 1 0 0 1 0 1 0 1 1 0 1 0 1 1 0 1 0 1 1 0 0 0 0 0 1 1 1 1 1 1 0 1 0 0 1 1 1 1 1 0 0 0 1 0 1 1 1 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 ======================================== 第9次迭代運算(F函數)中P盒置換前作為輸入的S盒32位二進制秘鑰是 ======================================== [0, 0, 0, 1] [1, 1, 0, 0] [0, 1, 1, 1] [1, 1, 1, 1] [0, 0, 0, 1] [0, 0, 0, 0] [0, 0, 1, 1] [1, 1, 0, 0] 第 9 次迭代運算(F函數)中P盒置換後作為輸入的S盒32位二進制秘鑰被替換成如下二進制數據 1 0 1 0 1 1 1 0 0 1 0 0 1 0 0 1 0 0 0 1 0 1 0 0 0 1 1 1 0 1 1 0 ======================================== 第9次迭代運算(F函數)中P盒置換前作為輸入的S盒32位二進制秘鑰是P盒置換前作為輸入的明文左部分32位二進制數據是 ======================================== [0, 1, 1, 1] [0, 0, 0, 1] [0, 1, 0, 0] [0, 1, 1, 0] [0, 1, 1, 1] [0, 0, 1, 0] [1, 1, 0, 1] [1, 1, 1, 0] 第 10 次迭代運算(F函數)原子密鑰(上)及經E擴展的48位R0二進制碼(中)及二者異或後的結果(下) 0 0 0 1 1 1 1 1 0 1 1 1 1 0 0 1 1 1 0 1 1 1 0 1 1 1 1 1 1 1 0 1 1 0 0 0 1 0 0 0 0 1 0 1 0 1 1 0 0 1 1 0 1 1 1 1 1 1 1 0 1 0 0 0 0 1 0 1 1 1 1 0 1 0 1 1 0 0 0 0 1 1 0 1 0 1 0 1 0 1 0 1 0 0 0 1 0 1 1 1 0 0 0 0 1 0 0 1 0 0 0 1 1 0 0 0 0 0 1 1 0 1 0 0 1 1 0 1 0 1 0 1 1 1 0 1 0 0 0 0 0 1 1 1 ======================================== 第10次迭代運算(F函數)中P盒置換前作為輸入的S盒32位二進制秘鑰是 ======================================== [0, 0, 0, 0] [1, 1, 1, 1] [1, 1, 1, 0] [1, 0, 0, 0] [0, 0, 0, 0] [1, 1, 0, 1] [0, 1, 1, 0] [1, 0, 0, 0] 第 10 次迭代運算(F函數)中P盒置換後作為輸入的S盒32位二進制秘鑰被替換成如下二進制數據 0 1 0 1 1 0 0 0 0 0 0 1 1 0 0 1 0 1 1 0 0 1 0 1 0 1 0 1 1 1 0 0 ======================================== 第10次迭代運算(F函數)中P盒置換前作為輸入的S盒32位二進制秘鑰是P盒置換前作為輸入的明文左部分32位二進制數據是 ======================================== [0, 0, 0, 1] [1, 1, 0, 0] [0, 1, 1, 1] [1, 1, 1, 1] [0, 0, 0, 1] [0, 0, 0, 0] [0, 0, 1, 1] [1, 1, 0, 0] 第 11 次迭代運算(F函數)原子密鑰(上)及經E擴展的48位R0二進制碼(中)及二者異或後的結果(下) 0 0 0 1 1 1 1 1 0 1 1 0 1 1 0 1 1 1 0 0 1 1 0 1 1 1 0 0 0 1 0 1 1 1 1 0 0 1 1 0 1 1 0 1 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 1 1 1 0 1 0 1 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 1 0 0 1 1 0 1 1 1 0 1 1 0 1 0 ======================================== 第11次迭代運算(F函數)中P盒置換前作為輸入的S盒32位二進制秘鑰是 ======================================== [0, 0, 0, 1] [1, 1, 1, 1] [0, 1, 0, 1] [1, 1, 0, 1] [0, 0, 1, 1] [0, 1, 0, 0] [1, 1, 1, 1] [0, 0, 0, 0] 第 11 次迭代運算(F函數)中P盒置換後作為輸入的S盒32位二進制秘鑰被替換成如下二進制數據 1 1 1 0 0 1 1 0 0 0 0 1 1 0 0 1 0 1 0 1 0 1 0 0 1 1 0 1 1 0 1 1 ======================================== 第11次迭代運算(F函數)中P盒置換前作為輸入的S盒32位二進制秘鑰是P盒置換前作為輸入的明文左部分32位二進制數據是 ======================================== [0, 0, 0, 0] [1, 1, 1, 1] [1, 1, 1, 0] [1, 0, 0, 0] [0, 0, 0, 0] [1, 1, 0, 1] [0, 1, 1, 0] [1, 0, 0, 0] 第 12 次迭代運算(F函數)原子密鑰(上)及經E擴展的48位R0二進制碼(中)及二者異或後的結果(下) 0 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 0 1 1 0 1 0 0 1 1 1 1 0 1 1 0 1 1 0 1 1 0 0 1 0 0 1 1 0 1 1 1 1 1 0 1 0 1 0 0 1 1 1 1 1 1 1 0 1 0 0 0 1 0 1 0 1 0 1 1 1 1 0 0 1 1 1 1 0 1 1 0 1 0 0 1 1 1 1 0 1 0 1 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 1 1 1 1 1 0 0 1 0 0 1 0 1 0 0 0 1 0 1 1 1 1 1 0 1 0 1 0 ======================================== 第12次迭代運算(F函數)中P盒置換前作為輸入的S盒32位二進制秘鑰是 ======================================== [1, 0, 0, 1] [1, 0, 1, 0] [0, 1, 1, 0] [0, 0, 1, 1] [0, 0, 0, 1] [0, 0, 1, 0] [0, 1, 1, 1] [1, 1, 0, 0] 第 12 次迭代運算(F函數)中P盒置換後作為輸入的S盒32位二進制秘鑰被替換成如下二進制數據 1 1 1 0 1 0 1 0 1 1 1 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0 1 1 0 ======================================== 第12次迭代運算(F函數)中P盒置換前作為輸入的S盒32位二進制秘鑰是P盒置換前作為輸入的明文左部分32位二進制數據是 ======================================== [0, 0, 0, 1] [1, 1, 1, 1] [0, 1, 0, 1] [1, 1, 0, 1] [0, 0, 1, 1] [0, 1, 0, 0] [1, 1, 1, 1] [0, 0, 0, 0] 第 13 次迭代運算(F函數)原子密鑰(上)及經E擴展的48位R0二進制碼(中)及二者異或後的結果(下) 1 1 0 1 1 0 0 1 1 0 1 0 1 1 0 1 1 0 1 0 1 1 0 1 1 0 1 1 1 0 1 0 1 1 0 1 0 1 0 0 1 1 1 0 0 1 1 0 0 1 1 1 1 0 1 0 1 0 1 1 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1 0 1 1 0 1 0 1 0 1 1 0 1 1 0 1 0 0 0 1 1 0 0 0 1 0 0 0 0 1 0 1 0 0 1 0 1 1 0 1 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 1 0 1 1 ======================================== 第13次迭代運算(F函數)中P盒置換前作為輸入的S盒32位二進制秘鑰是 ======================================== [1, 1, 0, 1] [1, 0, 1, 1] [0, 0, 0, 0] [0, 0, 0, 0] [1, 0, 1, 0] [0, 1, 1, 0] [0, 1, 0, 0] [0, 0, 1, 1] 第 13 次迭代運算(F函數)中P盒置換後作為輸入的S盒32位二進制秘鑰被替換成如下二進制數據 0 1 0 0 0 0 0 1 1 0 1 1 1 0 1 0 1 1 0 0 1 0 0 0 1 0 0 0 1 0 1 0 ======================================== 第13次迭代運算(F函數)中P盒置換前作為輸入的S盒32位二進制秘鑰是P盒置換前作為輸入的明文左部分32位二進制數據是 ======================================== [1, 0, 0, 1] [1, 0, 1, 0] [0, 1, 1, 0] [0, 0, 1, 1] [0, 0, 0, 1] [0, 0, 1, 0] [0, 1, 1, 1] [1, 1, 0, 0] 第 14 次迭代運算(F函數)原子密鑰(上)及經E擴展的48位R0二進制碼(中)及二者異或後的結果(下) 1 1 0 1 0 0 0 1 1 0 1 0 1 1 1 0 1 0 1 0 1 1 1 1 0 0 0 0 1 1 0 0 1 1 1 0 1 1 1 1 1 0 1 0 0 1 1 1 0 1 1 0 1 1 1 1 0 1 1 1 1 1 1 0 1 1 1 1 0 0 1 1 1 1 1 0 1 1 1 1 0 1 0 1 0 1 1 1 1 0 1 0 1 1 0 1 1 0 1 1 1 1 1 0 1 1 0 1 0 0 0 0 0 1 0 1 1 1 0 0 1 1 1 0 0 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 1 0 1 0 ======================================== 第14次迭代運算(F函數)中P盒置換前作為輸入的S盒32位二進制秘鑰是 ======================================== [0, 1, 1, 1] [0, 1, 0, 0] [1, 1, 0, 1] [0, 1, 0, 0] [0, 1, 1, 0] [0, 0, 0, 0] [0, 0, 0, 1] [1, 1, 1, 1] 第 14 次迭代運算(F函數)中P盒置換後作為輸入的S盒32位二進制秘鑰被替換成如下二進制數據 0 0 0 0 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 1 1 0 1 1 1 0 1 1 0 0 1 0 ======================================== 第14次迭代運算(F函數)中P盒置換前作為輸入的S盒32位二進制秘鑰是P盒置換前作為輸入的明文左部分32位二進制數據是 ======================================== [1, 1, 0, 1] [1, 0, 1, 1] [0, 0, 0, 0] [0, 0, 0, 0] [1, 0, 1, 0] [0, 1, 1, 0] [0, 1, 0, 0] [0, 0, 1, 1] 第 15 次迭代運算(F函數)原子密鑰(上)及經E擴展的48位R0二進制碼(中)及二者異或後的結果(下) 1 1 1 1 0 0 0 1 1 0 1 1 1 1 1 0 1 0 1 0 0 1 1 0 1 0 1 1 1 1 1 0 0 1 1 0 1 1 0 0 1 1 0 1 0 0 0 1 1 1 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 0 0 0 1 1 0 0 0 1 1 0 1 1 0 0 0 1 0 1 1 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 0 1 1 1 0 1 0 0 1 1 0 1 1 1 0 0 1 0 ======================================== 第15次迭代運算(F函數)中P盒置換前作為輸入的S盒32位二進制秘鑰是 ======================================== [0, 0, 0, 1] [1, 0, 1, 1] [0, 1, 0, 0] [1, 1, 0, 0] [0, 1, 1, 1] [0, 0, 1, 1] [0, 0, 0, 1] [0, 1, 1, 0] 第 15 次迭代運算(F函數)中P盒置換後作為輸入的S盒32位二進制秘鑰被替換成如下二進制數據 0 1 1 0 0 0 1 0 0 0 1 0 1 1 1 1 0 1 1 1 0 0 0 0 1 1 1 0 0 0 1 0 ======================================== 第15次迭代運算(F函數)中P盒置換前作為輸入的S盒32位二進制秘鑰是P盒置換前作為輸入的明文左部分32位二進制數據是 ======================================== [0, 1, 1, 1] [0, 1, 0, 0] [1, 1, 0, 1] [0, 1, 0, 0] [0, 1, 1, 0] [0, 0, 0, 0] [0, 0, 0, 1] [1, 1, 1, 1] 第 16 次迭代運算(F函數)原子密鑰(上)及經E擴展的48位R0二進制碼(中)及二者異或後的結果(下) 1 1 1 1 0 0 0 0 1 0 1 1 1 1 1 0 0 0 1 0 1 1 1 0 1 1 1 0 0 0 1 1 0 0 1 1 1 0 0 0 0 1 1 1 0 1 1 1 1 0 0 0 1 0 1 0 1 1 0 1 0 1 1 1 1 1 1 1 0 1 1 0 1 0 0 0 1 0 1 0 0 0 0 1 0 1 1 1 1 1 1 1 1 0 1 0 0 1 1 1 1 0 1 0 0 1 1 0 1 0 0 1 1 1 0 1 1 0 0 0 0 1 1 0 1 0 0 1 0 0 1 0 1 1 1 1 1 0 0 0 1 1 0 1 ======================================== 第16次迭代運算(F函數)中P盒置換前作為輸入的S盒32位二進制秘鑰是 ======================================== [0, 1, 1, 1] [1, 0, 1, 1] [0, 0, 0, 0] [1, 0, 1, 1] [0, 0, 0, 0] [1, 1, 0, 1] [0, 0, 1, 0] [0, 1, 1, 1] 第 16 次迭代運算(F函數)中P盒置換後作為輸入的S盒32位二進制秘鑰被替換成如下二進制數據 1 1 0 1 0 0 0 0 0 1 0 0 1 0 1 0 1 1 1 0 1 1 1 0 0 1 1 0 1 0 1 0 ======================================== 第16次迭代運算(F函數)中P盒置換前作為輸入的S盒32位二進制秘鑰是P盒置換前作為輸入的明文左部分32位二進制數據是 ======================================== [0, 0, 0, 1] [1, 0, 1, 1] [0, 1, 0, 0] [1, 1, 0, 0] [0, 1, 1, 1] [0, 0, 1, 1] [0, 0, 0, 1] [0, 1, 1, 0] ======================================== 明文和密碼經十六輪F函數迭代後最終結果 ======================================== [0, 1, 1, 1, 1, 0, 1, 1] [0, 0, 0, 0, 1, 0, 1, 1] [0, 0, 0, 0, 1, 1, 0, 1] [0, 0, 1, 0, 0, 1, 1, 1] [1, 1, 0, 0, 1, 0, 1, 1] [0, 0, 0, 0, 0, 1, 1, 0] [1, 0, 0, 1, 1, 1, 0, 1] [0, 1, 1, 1, 1, 1, 0, 0] ======================================== 明文經過秘鑰通過DES加密算法最終生成以下密文 ======================================== [1, 1, 0, 1, 1, 1, 0, 1] [1, 1, 1, 1, 0, 0, 0, 1] [0, 0, 1, 0, 1, 1, 1, 1] [1, 1, 0, 1, 1, 1, 1, 0] [0, 1, 0, 0, 1, 0, 1, 0] [0, 1, 0, 0, 0, 0, 1, 1] [1, 1, 0, 0, 0, 0, 1, 0] [1, 0, 0, 0, 1, 0, 0, 0] 密文轉為ASCII碼為 Ýñ/ÞJCÂ Process finished with exit code 0