Python DES 加密解密算法实现 - 基于Tkinter图形界面
import tkinter import tkinter as tk from tkinter import ttk
定义DES算法所需的常量
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_RE = [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 = [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 = [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 = [1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1]
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]
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]
S = [[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], [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], [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], [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], [2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 9, 14, 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 6, 9, 8, 3, 4, 18, 1, 10, 13, 0, 7, 9, 14, 6, 11, 12, 15, 5, 2, 8, 13, 4, 11, 2, 14, 15, 0, 8, 12, 9, 5, 6, 3, 7, 10, 1], [1, 7, 14, 13, 0, 5, 8, 10, 3, 9, 15, 11, 6, 4, 12, 2, 0, 5, 14, 11, 10, 2, 8, 13, 12, 6, 7, 9, 1, 15, 4, 3, 13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 10, 6, 2, 6, 15, 14, 1, 3, 4, 5, 12, 9, 0, 2, 11, 8, 10, 7, 13], [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], [6, 12, 13, 1, 2, 15, 11, 8, 3, 10, 0, 7, 5, 9, 14, 4, 9, 3, 15, 0, 2, 6, 8, 1, 13, 11, 12, 4, 7, 14, 10, 5, 10, 2, 8, 4, 7, 6, 1, 11, 15, 12, 9, 14, 3, 5, 13, 0, 0, 1, 2, 14, 13, 11, 6, 7, 10, 5, 12, 8, 9, 3, 15, 4]]
读取文件
def read_file(filename): try: fp = open(filename, "r", encoding='utf-8') message = fp.read() fp.close() return message except: print("Open file error!")
写入文件
def write_file(filename, message): try: fp = open(filename, 'w', encoding='utf-8') fp.write(message) fp.close() except: print("Write file error!")
字符串转换为二进制
def str_bit(message): bits = "" for i in message: asc2i = bin(ord(i))[2:] for j in range(8 - len(asc2i)): asc2i = '0' + asc2i bits += asc2i return bits
处理密钥
def process_key(key): key_bits = "" for i in key: count = 0 asc2i = bin(ord(i))[2:] for j in asc2i: count += int(j) if count % 2 == 0: asc2i += '0' else: asc2i += '1' for j in range(7 - len(asc2i)): asc2i = '0' + asc2i key_bits += asc2i if len(key_bits) > 64: return key_bits[0:64] else: for i in range(64 - len(key_bits)): key_bits += '0' return key_bits
将二进制位串按指定位数进行分组
def divide(bits, bit): m = len(bits) // bit N = ["" for i in range(m)] for i in range(m): N[i] = bits[i * bit:(i + 1) * bit] if len(bits) % bit != 0: N.append(bits[m * bit:]) for i in range(bit - len(N[m])): N[m] += '0' return N
IP置换
def IP_change(bits): ip_str = "" for i in IP: ip_str = ip_str + bits[i - 1] return ip_str
PC_1置换
def PC_1_change(key): pc_1 = "" for i in PC_1: pc_1 = pc_1 + key[i - 1] return pc_1
左移位
def key_leftshift(key_str, num): left = key_str[num:28] left += key_str[0:num] return left
PC_2置换
def PC_2_change(key): pc_2 = "" for i in PC_2: pc_2 = pc_2 + key[i - 1] return pc_2
生成密钥
def generate_key(key): key_list = ["" for i in range(16)] key = PC_1_change(key) # 置换PC_1 key_left = key[0:28] key_right = key[28:] for i in range(len(SHIFT)): key_left = key_leftshift(key_left, SHIFT[i]) key_right = key_leftshift(key_right, SHIFT[i]) key_i = PC_2_change(key_left + key_right) # 置换PC_2 key_list[i] = key_i return key_list
E扩展置换
def E_change(bits): e = "" for i in E: e = e + bits[i - 1] return e
异或运算
def xor(bits, ki): bits_xor = "" for i in range(len(bits)): if bits[i] == ki[i]: bits_xor += '0' else: bits_xor += '1' return bits_xor
S盒置换
def s(bits, i): row = int(bits[0] + bits[5], 2) col = int(bits[1:5], 2) num = bin(S[i - 1][row * 16 + col])[2:] for i in range(4 - len(num)): num = '0' + num return num
S盒置换
def S_change(bits): s_change = "" for i in range(8): temp = bits[i * 6:(i + 1) * 6] temp = s(temp, i + 1) s_change += temp return s_change
P置换
def P_change(bits): p = "" for i in P: p = p + bits[i - 1] return p
F函数
def F(bits, ki): bits = xor(E_change(bits), ki) bits = P_change(S_change(bits)) return bits
IP逆置换
def IP_RE_change(bits): ip_re = "" for i in IP_RE: ip_re += bits[i - 1] return ip_re
DES加密
def des_encrypt(bits, key): bits = IP_change(bits) # 切片分成两个32bit L = bits[0:32] R = bits[32:] key_list = generate_key(key) # 16个密钥 for i in range(16): L_next = R R = xor(L, F(R, key_list[i])) L = L_next result = IP_RE_change(R + L) return result
DES解密
def des_decrypt(bits, key): bits = IP_change(bits) # 切片分成两个32bit L = bits[0:32] R = bits[32:] key_list = generate_key(key) # 16个密钥 for i in range(16): L_next = R R = xor(L, F(R, key_list[15 - i])) L = L_next result = IP_RE_change(R + L) return result
将二进制位串转换为字符串
def bit_str(bits): temp = "" for i in range(len(bits) // 8): temp += chr(int(bits[i * 8:(i + 1) * 8], 2)) return temp
加密函数
def jiami(): key = entry1.get() # 获取输入密钥 message = entry.get() # 获取输入的明文 bits = str_bit(message) key = process_key(key) mess_div = divide(bits, 64) result = "" for i in mess_div: result += des_encrypt(i, key) var.set(bit_str(result))
解密函数
def jiemi(): key = entry1.get() # 获取输入密钥 message = entry.get() # 获取输入的密文 bits = str_bit(message) key = process_key(key) mess_div = divide(bits, 64) result = "" for i in mess_div: result += des_decrypt(i, key) var.set(bit_str(result))
处理下拉菜单选择事件
def on_select(event): selected_value = combobox.get() # 获取选中的值 label5.config(text='选择: ' + selected_value)
处理下拉菜单选择事件
def on_select1(event): selected_value = combobox.get() # 获取选中的值 if selected_value == '加密': jiami() print('选择加密') elif selected_value == '解密': jiemi() print('选择解密')
构建图形界面
if name == "main":
window = tk.Tk()
window.geometry('1000x400')
window.title('DES加解密算法')
label = tk.Label(window, text='DES算法', font=('Arial', 19))
label.place(x=30, y=10) # 将标签放置在窗口中
label1 = tk.Label(window, text='请输入明文', font=('Arial', 12))
label1.place(x=200, y=60)
label2 = tk.Label(window, text='请输入密钥', font=('Arial', 12))
label2.place(x=500, y=60)
label3 = tk.Label(window, text='待加密/解密的文本', font=('Arial', 12))
label3.place(x=40, y=100)
label4 = tk.Label(window, text='加密方式', font=('Arial', 12))
label4.place(x=30, y=60)
entry = tkinter.Entry(window, width=25)
entry.place(x=300, y=60)
entry1 = tkinter.Entry(window, width=10)
entry1.place(x=600, y=60)
key = entry1.get() # 获取输入密钥
text = tkinter.Label(window, bd=4, bg='white', text='ECB')
text.place(x=110, y=60)
var = tkinter.StringVar()
message = tkinter.Message(window, width=200, textvariable=var, bg='white')
message.place(x=300, y=100)
label5 = tk.Label(window, text='选择处理方法:', font=('Arial', 12))
label5.place(x=700, y=60)
combobox = ttk.Combobox(window, values=['加密', '解密'], font=('Arial', 12))
combobox.place(x=800, y=60)
combobox['width'] = 10
combobox.bind('<
原文地址: https://www.cveoy.top/t/topic/o2OB 著作权归作者所有。请勿转载和采集!