wordpress 到顶插件东莞网站优化找哪家
- 作者: 多梦笔记
- 时间: 2026年02月18日 12:05
当前位置: 首页 > news >正文
wordpress 到顶插件,东莞网站优化找哪家,一篇关于大学网站建设与管理的论文,网站建设维护保密协议书DES算法 一、算法介绍1.1 背景1.2 原理1.3 基本功能函数1.3.1 初始置换函数 I P IP IP1.3.2 f f f 轮函数1.3.3 逆初始置换函数 I P − 1 IP^{-1} IP−1 1.4 子密钥的生成 二、代码实现2.1 子密钥生成实现2.2 DES加解密实现2.3 完整代码 三、演示效果 一、算法介绍
1.1 背景… DES算法 一、算法介绍1.1 背景1.2 原理1.3 基本功能函数1.3.1 初始置换函数 I P IP IP1.3.2 f f f 轮函数1.3.3 逆初始置换函数 I P − 1 IP^{-1} IP−1 1.4 子密钥的生成 二、代码实现2.1 子密钥生成实现2.2 DES加解密实现2.3 完整代码 三、演示效果 一、算法介绍
1.1 背景 DES 算法是由美国 IBM 公司在 20 世纪 70 年代提出并被美国政府、美国国家标准局和美国国家标准协会采纳和承认的一种标准加密算法。 它属于分组加密算法即在明文加密和密文解密过程中信息都是按照固定长度分组后进行处理的。混淆和扩散是它采用的两个最重要的安全特性。
混淆是指通过密码算法使明文和密文以及密钥的关系非常复杂无法从数学上描述或者统计。扩散是指明文和密钥中每一位信息的变动都会影响到密文中许多位信息的变动从而隐藏统计上的特性增加密码的安全。
1.2 原理 DES 算法将明文分成 64 位大小的众多数据块即分组长度为 64 位同时用 64 位密钥有效密钥 56 位对 64 位明文信息加密最终形成 64 位的密文。如果明文长度不足 64 位则将其扩展为 64 位如补零等方法。 具体加密过程首先是将输入的数据进行初始换位 I P IP IP即将明文 M M M 中数据的排列顺序按一定的规则重新排列生成新的数据序列以打乱原来的次序。然后将变换后的数据平分成左右两部分左边记为 L 0 L{0} L0右边记为 R 0 R{0} R0然后对 R 0 R{0} R0 实行在子密钥由加密密钥产生控制下的变换 f f f结果记为 f ( R 0 , K 1 ) f(R{0},K{1}) f(R0,K1)再与 L 0 L{0} L0 做逐位异或运算其结果记为 R 1 R{1} R1 R 0 R{0} R0 则作为下一轮的 L 1 L{1} L1。如此循环 16 轮最后得到 L 16 L{16} L16、 R 16 R{16} R16。再对 L 16 L{16} L16、 R 16 R{16} R16 实行逆初始置换 I P − 1 IP^{-1} IP−1即可得到加密数据。 解密过程与此类似不同之处仅在于子密钥的使用顺序正好相反。
DES 全部 16 轮的加密过程如图所示
1.3 基本功能函数
1.3.1 初始置换函数 I P IP IP
它的作用是把输入的 64 位数据块的排列顺序打乱每位数据按照下面换位规则重新组合即将第 58 位换到第 1 位第 50 位换到第 2 位……依次类推重组后的 64 位输出分为 L 0 L{0} L0、 R 0 R{0} R0左、右两部分每部分分别为 32 位。初始置换如表如下所示 R 0 R{0} R0 和 K 1 K{1} K1 经过 变换后的输出结果再和 L 0 L{0} L0进行异或运算输出结果做为 R 1 R{1} R1 R 0 R{0} R0 则赋给 L 1 L{1} L1。 L 1 L{1} L1 和 R 1 R{1} R1 同样再做类似运算生成 L 2 L{2} L2 和 R 2 R{2} R2……经过 16次运算后生成 L 16 L{16} L16 的 R 16 R{16} R16。
1.3.2 f f f 轮函数 f f f 轮函数是多个置换函数和替代函数的组合函数它将 32 位比特的输入变换为 32 位的输出 R i R{i} Ri 经过扩展运算 E E E 变换后扩展为 48 位的 E ( R i ) E(R{i}) E(Ri) 与 K i 1 K{i1} Ki1 进行异或运算后输出的结果分成 8 组每组 6 比特的并联 B B B B B B B 1 B{1} B1 B 2 B{2} B2 B 3 B{3} B3 B 4 B{4} B4 B 5 B{5} B5 B 6 B{6} B6 B 7 B{7} B7 B 8 B{8} B8再经过 8 个 S S S 盒的选择压缩运算转换为 4 位8 个 4 位合并为 32 位后再经过 P P P 变换输出为 32 位的 f ( R i , K i 1 ) f(R{i},K{i1}) f(Ri,Ki1) 。其中扩展运算 E E E 与置换 P P P 主要作用是增加算法的扩展效果。 f f f 轮函数处理流程如下图所示 1.3.3 逆初始置换函数 I P − 1 IP^{-1} IP−1
它将 L 16 L{16} L16 和 R 16 R{16} R16 作为输入进行逆初始换位得到密文输出。逆初始换位是初始位的逆运算逆初始置换的换位规则如下表所示 1.4 子密钥的生成
具体子密钥的产生流程如图所示 输入的初始密钥值为 64 位但 DES 算法规定64 位初始密钥中第 8、16、……、64 位是奇偶检验位不参与 DES 运算。所以实际可用位数只有56 位经过缩小选择换位表即置换选择 P C 1 PC1 PC1 的变换后初始密钥的位数由 64 位变成了 56 位将其平分为两部分 C 0 C{0} C028 位、 D 0 D{0} D028 位。然后分别进行第 1 次循环左移得到 C 1 C{1} C1、 D 1 D{1} D1需要注意的是循环左移需经过 16 轮次第 i i i 轮迭代时对应的左移位数要依据移位表的规则进行。接着将 C 1 C{1} C1、 D 1 D{1} D1 合并后得到 56 位的输出结果再经过缩小选择换位表即置换选择 P C 2 PC2 PC2 从而得到了密钥 K 1 K{1} K148 位依次类推便可得到 K 2 K{2} K2、……、 K 16 K_{16} K16。
二、代码实现
2.1 子密钥生成实现
一、子密钥生成
(1) 初始置换 64-56
64位的种子密钥经过PC_1置换后生成56位的密钥
(2) 划分 56-(28,28)
经过初始置换后的56位密钥被均分成C0和D0两部分
(3) 循环左移
第一轮C0和D0根据移位次数表各自进行循环左移
得到C1和D1
每一轮的C和D值是由上一轮的C和D值循环左移得到的
(4) 合并 (28,28)-56-48
左移后的两部分再次合并,通过一个选择压缩表(PC_2)
得到这一轮的子密钥
(5)重复3、4操作,最终得到16个子密钥
# 置换选择表1(PC_1) 64-56
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]# 选择压缩表2(PC_2) 56-48 PC_2 [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]# 移位次数表 shift_num [1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1]def pc_1_change(bin_key):初始置换64位的种子密钥经过PC_1置换后生成56位的密钥return [bin_key[i - 1] for i in PC_1] # 列表形式def shift_left(bin_key, num):实现C和D的循环左移return bin_key[num:] bin_key[:num]def pc_2_change(bin_key):选择压缩56位的密钥经过PC_2压缩生成48位子密钥return .join([bin_key[i - 1] for i in PC_2]) # 列表转字符串def get_subkey_list(bin_key):生成16轮的加解子密钥subkey_list [] # 存储16轮子密钥# 1. 初始置换 64-58temp pc_1_change(bin_key)# 2. 循环左移for i in shift_num:temp[:28] shift_left(temp[:28], i) # C部分循环左移temp[28:] shift_left(temp[28:], i) # D部分循环左移subkey_list.append(pc_2_change(temp)) # 生成子密钥return subkey_list 2.2 DES加解密实现
二、DES加解密实现
# 初始置换表IP 64-64
IP [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 64-64 _IP [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]# 扩展置换表E 32-48 E [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]# S盒 48-32 S1 [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] S2 [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] S3 [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] S4 [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] S5 [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] S6 [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] S7 [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] S8 [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 [S1, S2, S3, S4, S5, S6, S7, S8]# P盒 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]# encrypt def ip_change(bin_text):初始置换return [bin_text[i - 1] for i in IP]def s_box(bin_result):S盒替换int_result []result for i in range(8):# 二进制行号bin_row bin_result[i][0] bin_result[i][5]# 二进制列号bin_col .join(bin_result[i][j] for j in range(1, 5))# 获取对应的十进制数int_result.append(S[i][16 * int(bin_row, base2) int(bin_col, base2)])# 十进制转成二进制result bin(int_result[-1])[2:].zfill(4)return resultdef p_box(result):P盒置换return .join(result[i - 1] for i in P)def f(R, bin_key):轮函数f()# 1.将R由32位扩展成48位R_ext [R[i - 1] for i in E]# 2.与子密钥进行逐位异或bin_temp [str(int® ^ int(k)) for r, k in zip(R_ext, bin_key)]# 6个字符为一组共8组bin_result [.join(bin_temp[i:i 6]) for i in range(0, len(bin_temp), 6)]# 3.S盒替换 48-32result s_box(bin_result)# 4.P盒置换 32-32return p_box(result)def _ip_change(bin_text):进行IP-1逆置换return .join(bin_text[i - 1] for i in _IP)def des_cipher(bin_text, bin_key, reverse_keysFalse):通用DES加密解密函数# 1. 初始置换IPbin_text ip_change(bin_text)# 2. 分成左右两部分L、RL, R bin_text[:32], bin_text[32:]# 3. 获得16轮子密钥subkey_list get_subkey_list(bin_key)if reverse_keys:subkey_list subkey_list[::-1] # 解密时反转子密钥列表# 4. 进行16轮迭代for i in subkey_list:R_temp R# 轮函数f()结果和L进行异或R .join(str(int® ^ int(l)) for r, l in zip(f(R, i), L))L R_temp# 5. 进行IP-1逆置换 64-64return _ip_change(R L) # 输出二进制字符串# 使用示例 def str2bin(text):字符串转二进制字符串return .join(bin(byte)[2:].zfill(8) for byte in text.encode())def bin2str(bin_text):二进制字符串转字符串# 1.将二进制字符串按8位分割并转换为字节数组byte_array bytearray(int(i, 2) for i in re.findall(r.{8}, bin_text) if int(i, 2) ! 0)# 2.将字节序列解码为字符串return byte_array.decode()def is_valid_key(key):检查密钥是否有效 64bitreturn len(key.encode()) 8def des_encrypt(plaintext, key):DES加密# 1.明文转成二进制字符串, 0填充至64的倍数bin_plaintext str2bin(plaintext)padding_len (64 - (len(bin_plaintext) % 64)) % 64bin_padding_plaintext bin_plaintext 0 * padding_len# 2.进行64位分组加密bin_group_64 re.findall(r.{64}, bin_padding_plaintext)bin_ciphertext for g in bin_group_64:bin_ciphertext des_cipher(g, str2bin(key))# 3.密文转为16进制输出bin_group_4 re.findall(r.{4}, bin_ciphertext)hex_ciphertext for g in bin_group_4:hex_ciphertext format(int(g, 2), x)return hex_ciphertextdef des_decrypt(hex_ciphertext, key):DES解密# 1.16进制密文转为2进制字符串bin_ciphertext .join(bin(int(h, 16))[2:].zfill(4) for h in hex_ciphertext)# 2.进行64位分组解密bin_group_64 re.findall(r.{64}, bin_ciphertext)bin_deciphertext for g in bin_group_64:bin_deciphertext des_cipher(g, str2bin(key), reverse_keysTrue)# 3.将解密密文转为字符串输出return bin2str(bin_deciphertext)2.3 完整代码 import re#
一、子密钥生成
(1) 初始置换 64-56
64位的种子密钥经过PC_1置换后生成56位的密钥
(2) 划分 56-(28,28)
经过初始置换后的56位密钥被均分成C0和D0两部分
(3) 循环左移
第一轮C0和D0根据移位次数表各自进行循环左移
得到C1和D1
每一轮的C和D值是由上一轮的C和D值循环左移得到的
(4) 合并 (28,28)-56-48
左移后的两部分再次合并,通过一个选择压缩表(PC_2)
得到这一轮的子密钥
(5)重复3、4操作,最终得到16个子密钥
# 置换选择表1(PC_1) 64-56
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]# 选择压缩表2(PC_2) 56-48 PC_2 [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]# 移位次数表 shift_num [1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1]def pc_1_change(bin_key):初始置换64位的种子密钥经过PC_1置换后生成56位的密钥return [bin_key[i - 1] for i in PC_1] # 列表形式def shift_left(bin_key, num):实现C和D的循环左移return bin_key[num:] bin_key[:num]def pc_2_change(bin_key):选择压缩56位的密钥经过PC_2压缩生成48位子密钥return .join([bin_key[i - 1] for i in PC_2]) # 列表转字符串def get_subkey_list(bin_key):生成16轮的加解子密钥subkey_list [] # 存储16轮子密钥# 1. 初始置换 64-58temp pc_1_change(bin_key)# 2. 循环左移for i in shift_num:temp[:28] shift_left(temp[:28], i) # C部分循环左移temp[28:] shift_left(temp[28:], i) # D部分循环左移subkey_list.append(pc_2_change(temp)) # 生成子密钥return subkey_list#
二、DES加解密实现
# 初始置换表IP 64-64
IP [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 64-64 _IP [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]# 扩展置换表E 32-48 E [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]# S盒 48-32 S1 [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] S2 [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] S3 [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] S4 [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] S5 [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] S6 [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] S7 [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] S8 [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 [S1, S2, S3, S4, S5, S6, S7, S8]# P盒 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]# encrypt def ip_change(bin_text):初始置换return [bin_text[i - 1] for i in IP]def s_box(bin_result):S盒替换int_result []result for i in range(8):# 二进制行号bin_row bin_result[i][0] bin_result[i][5]# 二进制列号bin_col .join(bin_result[i][j] for j in range(1, 5))# 获取对应的十进制数int_result.append(S[i][16 * int(bin_row, base2) int(bin_col, base2)])# 十进制转成二进制result bin(int_result[-1])[2:].zfill(4)return resultdef p_box(result):P盒置换return .join(result[i - 1] for i in P)def f(R, bin_key):轮函数f()# 1.将R由32位扩展成48位R_ext [R[i - 1] for i in E]# 2.与子密钥进行逐位异或bin_temp [str(int® ^ int(k)) for r, k in zip(R_ext, bin_key)]# 6个字符为一组共8组bin_result [.join(bin_temp[i:i 6]) for i in range(0, len(bin_temp), 6)]# 3.S盒替换 48-32result s_box(bin_result)# 4.P盒置换 32-32return p_box(result)def _ip_change(bin_text):进行IP-1逆置换return .join(bin_text[i - 1] for i in _IP)def des_cipher(bin_text, bin_key, reverse_keysFalse):通用DES加密解密函数# 1. 初始置换IPbin_text ip_change(bin_text)# 2. 分成左右两部分L、RL, R bin_text[:32], bin_text[32:]# 3. 获得16轮子密钥subkey_list get_subkey_list(bin_key)if reverse_keys:subkey_list subkey_list[::-1] # 解密时反转子密钥列表# 4. 进行16轮迭代for i in subkey_list:R_temp R# 轮函数f()结果和L进行异或R .join(str(int® ^ int(l)) for r, l in zip(f(R, i), L))L R_temp# 5. 进行IP-1逆置换 64-64return _ip_change(R L) # 输出二进制字符串# 使用示例 def str2bin(text):字符串转二进制字符串return .join(bin(byte)[2:].zfill(8) for byte in text.encode())def bin2str(bin_text):二进制字符串转字符串# 1.将二进制字符串按8位分割并转换为字节数组byte_array bytearray(int(i, 2) for i in re.findall(r.{8}, bin_text) if int(i, 2) ! 0)# 2.将字节序列解码为字符串return byte_array.decode()def is_valid_key(key):检查密钥是否有效 64bitreturn len(key.encode()) 8def des_encrypt(plaintext, key):DES加密# 1.明文转成二进制字符串, 0填充至64的倍数bin_plaintext str2bin(plaintext)padding_len (64 - (len(bin_plaintext) % 64)) % 64bin_padding_plaintext bin_plaintext 0 * padding_len# 2.进行64位分组加密bin_group_64 re.findall(r.{64}, bin_padding_plaintext)bin_ciphertext for g in bin_group_64:bin_ciphertext des_cipher(g, str2bin(key))# 3.密文转为16进制输出bin_group_4 re.findall(r.{4}, bin_ciphertext)hex_ciphertext for g in bin_group_4:hex_ciphertext format(int(g, 2), x)return hex_ciphertextdef des_decrypt(hex_ciphertext, key):DES解密# 1.16进制密文转为2进制字符串bin_ciphertext .join(bin(int(h, 16))[2:].zfill(4) for h in hex_ciphertext)# 2.进行64位分组解密bin_group_64 re.findall(r.{64}, bin_ciphertext)bin_deciphertext for g in bin_group_64:bin_deciphertext des_cipher(g, str2bin(key), reverse_keysTrue)# 3.将解密密文转为字符串输出return bin2str(bin_deciphertext)def des_run():DES启动界面flag Truewhile flag:print( * 3, DES加密解密, * 3)print([1]加密)print([2]解密)print([0]退出)choice input(请输入你的选择)match choice:case 0:flag Falsecase 1:plaintext input(请输入明文:)key input(请输入密钥(64bit):)if not is_valid_key(key):print(密钥长度错误)continueciphertext des_encrypt(plaintext, key)print(f密文:{ciphertext})case 2:ciphertext input(请输入密文:)key input(请输入密钥(64bit):)if not is_valid_key(key):print(密钥长度错误)continueprint(f解密:{des_decrypt(ciphertext, key)})case _:print(输入错误)print( * 15)if name main:des_run()三、演示效果
相关文章
-
wordpress 代码压缩百度seoo优化软件
wordpress 代码压缩百度seoo优化软件
- 站长
- 2026年02月18日
-
wordpress 代理插件外贸优化网站制作
wordpress 代理插件外贸优化网站制作
- 站长
- 2026年02月18日
-
wordpress 搭建个人网站来宾城乡建设局网站
wordpress 搭建个人网站来宾城乡建设局网站
- 站长
- 2026年02月18日
-
wordpress 登录404北京网站优化企业
wordpress 登录404北京网站优化企业
- 站长
- 2026年02月18日
-
wordpress 登录验证ios aso优化工具
wordpress 登录验证ios aso优化工具
- 站长
- 2026年02月18日
-
wordpress 等级常州百度seo
wordpress 等级常州百度seo
- 站长
- 2026年02月18日
