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 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录