DES原理及代码实现
一、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