一、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原理及代码实现的更多相关文章

  1. Base64加密解密原理以及代码实现(VC++)

    Base64加密解密原理以及代码实现 转自:http://blog.csdn.net/jacky_dai/article/details/4698461 1. Base64使用A--Z,a--z,0- ...

  2. flume原理及代码实现

    转载标明出处:http://www.cnblogs.com/adealjason/p/6240122.html 最近想玩一下流计算,先看了flume的实现原理及源码 源码可以去apache 官网下载 ...

  3. Java Base64加密、解密原理Java代码

    Java Base64加密.解密原理Java代码 转自:http://blog.csdn.net/songylwq/article/details/7578905 Base64是什么: Base64是 ...

  4. AC-BM算法原理与代码实现(模式匹配)

    AC-BM算法原理与代码实现(模式匹配) AC-BM算法将待匹配的字符串集合转换为一个类似于Aho-Corasick算法的树状有限状态自动机,但构建时不是基于字符串的后缀而是前缀.匹配 时,采取自后向 ...

  5. Java基础知识强化之集合框架笔记47:Set集合之TreeSet保证元素唯一性和比较器排序的原理及代码实现(比较器排序:Comparator)

    1. 比较器排序(定制排序) 前面我们说到的TreeSet的自然排序是根据集合元素的大小,TreeSet将它们以升序排列. 但是如果需要实现定制排序,比如实现降序排序,则要通过比较器排序(定制排序)实 ...

  6. 兼容PHP和Java的des加密解密代码分享

    这篇文章主要介绍了兼容PHP和Java的des加密解密代码分享,适合如服务器是JAVA语言编写,客户端是PHP编写,并需要des加密解密的情况,需要的朋友可以参考下 作为一个iOS工程师来解决安卓的问 ...

  7. PHP网站安装程序的原理及代码

    原文:PHP网站安装程序的原理及代码 原理: 其实PHP程序的安装原理无非就是将数据库结构和内容导入到相应的数据库中,从这个过程中重新配置连接数据库的参数和文件,为了保证不被别人恶意使用安装文件,当安 ...

  8. 免费的Lucene 原理与代码分析完整版下载

    Lucene是一个基于Java的高效的全文检索库.那么什么是全文检索,为什么需要全文检索?目前人们生活中出现的数据总的来说分为两类:结构化数据和非结构化数据.很容易理解,结构化数据是有固定格式和结构的 ...

  9. 机器学习之KNN原理与代码实现

    KNN原理与代码实现 本文系作者原创,转载请注明出处:https://www.cnblogs.com/further-further-further/p/9670187.html 1. KNN原理 K ...

随机推荐

  1. shell脚本基础知识以及变量

    一.基础知识 1.shell脚本的格式注意事项 第一行(一般必须写明):指定脚本使用的shell(若不写明也不影响脚本的执行,系统会自动以sh解析脚本)."#!/bin/bash" ...

  2. C 2012年笔试题(保)

    1 程序改错 1.1 下面程序段的功能是交换两个字符数组的内容(每个字符串字符数均不超过100)  (8分)   [ 见2012年笔试题1.1] void StrSwap(char *pa,char ...

  3. Colab笔记本能用英伟达Tesla T4了,谷歌的羊毛薅到酸爽

    谷歌出品的Colab笔记本,机器学习界薅羊毛神器,如今又有了新福利: 连英伟达最新一代机器学习GPU:Tesla T4都能免费蹭,穷苦羊毛党也顿时高端了起来. 英伟达的Tesla T4,是去年秋天才发 ...

  4. 使用tensorflow实现cnn进行mnist识别

    第一个CNN代码,暂时对于CNN的BP还不熟悉.但是通过这个代码对于tensorflow的运行机制有了初步的理解 ''' softmax classifier for mnist created on ...

  5. 基于Andriod的简易计算器

    这学期有安卓这门课,这里做了一个简易的计算器,实现了两位数加减乘除的基本功能,比较简单适合用来入门学习. 运行效果 预备知识 实现这个计算器之前要先了解实现计算器需要的基本组件 1.TextView ...

  6. 读者来信 | 刚搭完HBase集群,Phoenix一启动,HBase就全崩了,是什么原因?(已解决)

    前言:之前有朋友加好友与我探讨一些问题,我觉得这些问题倒挺有价值的:于是就想在本公众号开设一个问答专栏,方便技术交流与分享,专栏名就定为:<读者来信>.如遇到本人能力有限难以解决的问题,我 ...

  7. 【tensorflow2.0】处理图片数据-cifar2分类

    1.准备数据 cifar2数据集为cifar10数据集的子集,只包括前两种类别airplane和automobile. 训练集有airplane和automobile图片各5000张,测试集有airp ...

  8. ovirt 替换自主签署证书

    需求我自己写了一个python后台,添加上了ovirt 引擎web上,如图 但第一次访问时需要,需要接受两次不安全连接,ovirt  web使用https,我往里面加http,加不进去. 只能同样使用 ...

  9. IDEA+EasyCode实现代码生成

    IDEA+EasyCode实现代码生成 Easy Code介绍 EasyCode是基于IntelliJ IDEA开发的代码生成插件,支持自定义任意模板(Java,html,js,xml).只要是与数据 ...

  10. SpringBoot系列之RabbitMQ使用实用教程

    SpringBoot系列之RabbitMQ使用实用教程 @ 目录 1. 消息队列概述 1.1 MQ的概述 1.2 MQ目的地形式 2. 消息队列实现方式 2.1 常见MQ框架 2.2 MQ实现方式 3 ...