DES 加密解密算法 Python 实现
import tkinter as tk
from tkinter import ttk
# DES 算法相关常量
IP = [2, 6, 3, 1, 4, 8, 5, 7]
IP_RE = [4, 1, 3, 5, 7, 2, 8, 6]
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, 11, 2, 12, 5, 3],
[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],
[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],
[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],
[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, 10, 0, 9, 13, 3, 14, 5, 11, 15, 8, 7, 4, 2, 1,
3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14,
2, 14, 12, 9, 5, 11, 10, 3, 0, 13, 1, 4, 6, 7, 8, 15,
1, 6, 15, 10, 13, 0, 9, 8, 7, 4, 5, 11, 12, 14, 2, 3]
]
# 读取文件内容
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(message):
try:
fp = open('text.txt', '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
# 将二进制字符串分成若干个bit长度的字符串
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
# 生成16个子密钥
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_RE
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(message, key):
message = str_bit(message)
key = process_key(key)
mess_div = divide(message, 64)
result = ''
for i in mess_div:
result += des_encrypt(i, key)
return result
# 解密函数
def jiemi(message, key):
message = str_bit(message)
key = process_key(key)
mess_div = divide(message, 64)
result = ''
for i in mess_div:
result += des_decrypt(i, key)
return 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 == '加密':
message_text = entry.get()
key_text = entry1.get()
result = jiami(message_text, key_text)
var.set(result)
label5.config(text='选择: ' + selected_value)
elif selected_value == '解密':
message_text = entry.get()
key_text = entry1.get()
result = jiemi(message_text, key_text)
var.set(result)
label5.config(text='选择: ' + selected_value)
# 主窗口
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)
label5 = tk.Label(window, text='选择处理方法:', font=('Arial', 12))
label5.place(x=700, y=60)
# 输入框
entry = tk.Entry(window, width=25)
entry.place(x=300, y=60)
entry1 = tk.Entry(window, width=10)
entry1.place(x=600, y=60)
# 文本框
text = tk.Label(window, bd=4, bg='white', text='ECB', width=10)
text.place(x=110, y=60)
# 消息框
var = tk.StringVar()
message = tk.Message(window, width=200, textvariable=var, bg='white')
message.place(x=300, y=100)
var.set('')
# 下拉菜单
combobox = ttk.Combobox(window, values=['加密', '解密'], font=('Arial', 12))
combobox.place(x=800, y=60)
combobox['width'] = 10
combobox.bind('<<ComboboxSelected>>', on_select)
combobox.bind('<<ComboboxSelected>>', on_select1)
# 运行主循环
window.mainloop()
原文地址: https://www.cveoy.top/t/topic/o2Oj 著作权归作者所有。请勿转载和采集!