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, '')
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, '')
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
DES原理及代码实现的更多相关文章
- Base64加密解密原理以及代码实现(VC++)
Base64加密解密原理以及代码实现 转自:http://blog.csdn.net/jacky_dai/article/details/4698461 1. Base64使用A--Z,a--z,0- ...
- flume原理及代码实现
转载标明出处:http://www.cnblogs.com/adealjason/p/6240122.html 最近想玩一下流计算,先看了flume的实现原理及源码 源码可以去apache 官网下载 ...
- Java Base64加密、解密原理Java代码
Java Base64加密.解密原理Java代码 转自:http://blog.csdn.net/songylwq/article/details/7578905 Base64是什么: Base64是 ...
- AC-BM算法原理与代码实现(模式匹配)
AC-BM算法原理与代码实现(模式匹配) AC-BM算法将待匹配的字符串集合转换为一个类似于Aho-Corasick算法的树状有限状态自动机,但构建时不是基于字符串的后缀而是前缀.匹配 时,采取自后向 ...
- Java基础知识强化之集合框架笔记47:Set集合之TreeSet保证元素唯一性和比较器排序的原理及代码实现(比较器排序:Comparator)
1. 比较器排序(定制排序) 前面我们说到的TreeSet的自然排序是根据集合元素的大小,TreeSet将它们以升序排列. 但是如果需要实现定制排序,比如实现降序排序,则要通过比较器排序(定制排序)实 ...
- 兼容PHP和Java的des加密解密代码分享
这篇文章主要介绍了兼容PHP和Java的des加密解密代码分享,适合如服务器是JAVA语言编写,客户端是PHP编写,并需要des加密解密的情况,需要的朋友可以参考下 作为一个iOS工程师来解决安卓的问 ...
- PHP网站安装程序的原理及代码
原文:PHP网站安装程序的原理及代码 原理: 其实PHP程序的安装原理无非就是将数据库结构和内容导入到相应的数据库中,从这个过程中重新配置连接数据库的参数和文件,为了保证不被别人恶意使用安装文件,当安 ...
- 免费的Lucene 原理与代码分析完整版下载
Lucene是一个基于Java的高效的全文检索库.那么什么是全文检索,为什么需要全文检索?目前人们生活中出现的数据总的来说分为两类:结构化数据和非结构化数据.很容易理解,结构化数据是有固定格式和结构的 ...
- 机器学习之KNN原理与代码实现
KNN原理与代码实现 本文系作者原创,转载请注明出处:https://www.cnblogs.com/further-further-further/p/9670187.html 1. KNN原理 K ...
随机推荐
- JWT校验流程源码
目录 一. jwt token校验源码简析 1.1 前言 1.2 jwt的authenticate方法 二. jwt的RefreshJSONWebToken 返回目录 一. jwt token校验源码 ...
- Smallest Range II
2020-01-21 21:43:52 问题描述: 问题求解: 这个题目还是有点难度的,感觉很巧妙也很难想到. 整体的思路如下: 1. 首先原问题等价于 +0 / + 2*K 2. 那么res = M ...
- [模拟,英语阅读] Codeforces 549D Haar Features
题目:https://codeforces.com/contest/549/problem/D D. Haar Features time limit per test 1 second memory ...
- IO多路复用(IO Multiplexing)
什么是IO多路复用 为什么要有IO多路复用 作者总结 遵循学习新知识的三部曲:是什么?为什么?怎么用? 作者前言:IO多路复用本质上是网络通信过程中的一个技术名词. 什么是IO多路复用 一个用机场管理 ...
- 关于Spring的常见面试题
1.Spring是什么? Spring是一个轻量级的IoC和AOP容器框架.是为Java应用程序提供基础性服务的一套框架,目的是用于简化企业应用程序的开发,它使得开发者只需要关心业务需求.常见的配置方 ...
- HDU - 1005 Number Sequence 矩阵快速幂
HDU - 1005 Number Sequence Problem Description A number sequence is defined as follows:f(1) = 1, f(2 ...
- 超越Mask-RCNN:谷歌大脑的AI,自己写了个目标检测AI
这是一只AI生出的小AI. 谷歌大脑的Quoc Le团队,用神经网络架构搜索 (NAS) ,发现了一个目标检测模型.长这样: △ 看不清请把手机横过来 它的准确率和速度都超过了大前辈Mask-RCNN ...
- 初识js(第一篇)
初识javascript js是前端中作交互控制的语言,有了它,我们的前端页面才能"活"起来.学好这么语言显得非常重要,但是存在一定难度,所以一定要认真学习,充满耐心. js书写规 ...
- SpringCloud服务的注册发现--------Eureka实现高可用
1,Eureka作为注册中心,掌管者服务治理的功能,十分重要,如果注册中心的服务一旦宕机,所有的服务就会挂了,为此,实现注册中心的集群(高可用)就显得十分必要了 2,Eureka 搭建集群 实现原理就 ...
- 下面总结一些在HTML中经常使用到的快捷键
使用的编辑器是VS code: 首先是很基础的: ctrl+s :保存: ctrl+a : 全选: ctrl+c , ctrl+c , ctrl+v : 剪切,复制,粘贴: ctrl+z ,ct ...