import base64
from Crypto.Cipher import AES # Crypto.Cipher是Python Cryptography Toolkit(pycryptodome)库中的一个模块
from Crypto.Util.Padding import pad, unpad
import tkinter as tk
from tkinter import messagebox

def encrypt_text():
    plaintext = text_box.get("1.0", "end-1c")
    password = password_box.get()

    # 判断秘钥长度
    if len(password) != 32:
        messagebox.showinfo("Error", "key 必须是 32 个字节")
        return

    # base64 加密
    encoded_plaintext = base64.b64encode(plaintext.encode()).decode()

    # AES 加密
    cipher = AES.new(password.encode(), AES.MODE_ECB)
    encrypted_data = cipher.encrypt(pad(encoded_plaintext.encode(), AES.block_size))

    # base64 加密
    encoded_encrypted_data = base64.b64encode(encrypted_data).decode()

    output_box.delete("1.0", tk.END)
    output_box.insert(tk.END, encoded_encrypted_data)

def decrypt_text():
    encoded_encrypted_data = text_box.get("1.0", "end-1c")
    password = password_box.get()

    # 判断秘钥长度
    if len(password) != 32:
        messagebox.showinfo("Error", "key 必须是 32 个字节")
        return

    # BASE64 解密
    encrypted_data = base64.b64decode(encoded_encrypted_data)

    # AES 解密
    cipher = AES.new(password.encode(), AES.MODE_ECB)
    decrypted_data = unpad(cipher.decrypt(encrypted_data), AES.block_size)

    # base64 解密
    decoded_decrypted_data = base64.b64decode(decrypted_data).decode()

    output_box.delete("1.0", tk.END)
    output_box.insert(tk.END, decoded_decrypted_data)

# 创建主窗口
window = tk.Tk()
window.title("文本加密解密器")
window.geometry("400x300")

# 创建消息框
text_label = tk.Label(window, text="文本:")
text_label.pack()
text_box = tk.Text(window, height=5)
text_box.pack()

# 创建密码框
password_label = tk.Label(window, text="key:")
password_label.pack()
password_box = tk.Entry(window, show="*")
password_box.pack()

# 创建输出框
output_label = tk.Label(window, text="输出:")
output_label.pack()
output_box = tk.Text(window, height=5)
output_box.pack()

# 创建加密解密按钮
encrypt_button = tk.Button(window, text="加密", command=encrypt_text)
encrypt_button.pack(side=tk.LEFT, padx=10)
decrypt_button = tk.Button(window, text="解密", command=decrypt_text)
decrypt_button.pack(side=tk.LEFT)

# 开启主循环
window.mainloop()