import os
import random
import string
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.primitives.padding import PKCS7
import tkinter as tk
from tkinter import filedialog, messagebox
import pyperclip

#定义填充函数
def pad(data, bs):
    return data + (bs - len(data) % bs) * bytes([bs - len(data) % bs])

#定义去除填充函数
def unpad(data, bs):
    return data[:-data[-1]]

def Blowfish_encrypt_decrypt(key, data, mode):
    #获取块大小,并生成随机的初始向量
    bs = Blowfish.block_size
    iv = os.urandom(bs)
    #创建Blowfish密码器并进行加密/解密操作
    cipher = Blowfish.new(key, mode, iv)
    data = pad(data, bs)#对数据进行填充
    encrypted_data = iv + cipher.encrypt(data)#添加初始向量,并加密数据
    return encrypted_data

def Blowfish_encrypt(key, data):
    #使用CBC模式进行加密
    return Blowfish_encrypt_decrypt(key, data, Blowfish.MODE_CBC)

def Blowfish_decrypt(key, data):
    bs = Blowfish.block_size
    # 判断是否需要填充
    if len(data) % bs != 0:
        raise ValueError('Invalid data length. Data length must be a multiple of ' + str(bs) + ' bytes.')
    # 获取初始向量和加密后的数据
    iv = data[:bs]
    encrypted_data = data[bs:]
    # 创建Blowfish密码器并进行解密操作
    cipher = Blowfish.new(key, Blowfish.MODE_CBC, iv)
    decrypted_data = cipher.decrypt(encrypted_data)
    # 去除填充
    unpadded_data = unpad(decrypted_data, bs)
    return unpadded_data

def validate_key(key):
    #验证密钥长度是否符合要求
    key_length = len(key.encode())
    if key_length < 8 or key_length > 56 or key_length % 8 != 0:
        raise ValueError('Invalid key length. Key must be between 8 and 56 bytes, and a multiple of 8 bytes.')
    return key.encode()

def create_new_window3():
    def encrypt_file(input_file_path, output_file_path, key):
        #验证密钥长度是否符合要求
        key = validate_key(key)
        #读取输入文件并加密文件内容
        with open(input_file_path, 'rb') as f:
            data = f.read()
            encrypted_data = Blowfish_encrypt(key, data)
        #将加密后的内容写入输出文件
        with open(output_file_path, 'wb') as f:
            f.write(encrypted_data)
        return True
    def decrypt_file(input_file_path, output_file_path, key):
        #验证密钥长度是否符合要求
        key = validate_key(key)
        #读取输入文件并解密文件内容
        with open(input_file_path, 'rb') as f:
            encrypted_data = f.read()
            decrypted_data = Blowfish_decrypt(key, encrypted_data)
        #将解密后的内容写入输出文件
        with open(output_file_path, 'wb') as f:
            f.write(decrypted_data)
        return True
    def on_encrypt():
        #获取输入文件路径、输出文件路径和密钥
        input_file_path = e_input.get()
        output_file_path = e_output.get()
        key = e_key.get()
        #检查是否填写完整
        if not input_file_path or not output_file_path or not key:
            messagebox.showwarning('Warning', '请填写完整的输入、输出路径和密钥!')
            return
        #调用文件加密函数进行处理
        if encrypt_file(input_file_path, output_file_path, key):
            messagebox.showinfo('Success', '文件加密成功!')

    def on_decrypt():
        #获取输入文件路径、输出文件路径和密钥
        input_file_path = e_input.get()
        output_file_path = e_output.get()
        key = e_key.get()
        #检查是否填写完整
        if not input_file_path or not output_file_path or not key:
            messagebox.showwarning('Warning', '请填写完整的输入、输出路径和密钥!')
            return
        #调用文件解密函数进行处理
        if decrypt_file(input_file_path, output_file_path, key):
            messagebox.showinfo('Success', '文件解密成功!')

    def generate_random_key():
        #生成随机密钥,包括字母和数字,长度为8
        key = ''.join(random.choices(string.ascii_letters + string.digits, k=8))
        return key

    #用于生成密钥按钮的事件处理函数
    def on_generate_key():
        #调用生成随机密钥函数生成密钥
        key = generate_random_key()
        #清空密钥输入框并将生成的密钥赋值给输入框
        e_key.delete(0, tk.END)
        e_key.insert(0, key)

    #复制按钮函数
    def on_copy_key():
        #获取密钥
        key = e_key.get()
        if key:
            #将密钥复制到剪贴板
            pyperclip.copy(key)
            messagebox.showinfo('Copied', '密钥已复制到剪贴板!')
            
    def on_select_input():
        #打开文件选择对话框,获取选择的文件路径
        file_path = filedialog.askopenfilename()
        if file_path:
            e_input.delete(0, tk.END)
            e_input.insert(0, file_path)
            
    def on_select_output():
        #打开文件保存对话框,并设置默认文件扩展名为.docx
        file_path = filedialog.asksaveasfilename(defaultextension='.docx')
        if file_path:
            e_output.delete(0, tk.END)
            e_output.insert(0, file_path)
    #创建主窗口
    root = tk.Tk()
    root.title('Blowfish 加密解密工具')
    #创建标签和输入框
    label_input = tk.Label(root, text='输入文件路径:')
    label_input.grid(row=0, column=0, padx=5, pady=5)
    e_input = tk.Entry(root, width=50)
    e_input.grid(row=0, column=1, padx=5, pady=5)
    button_select_input = tk.Button(root, text='选择文件', command=on_select_input)
    button_select_input.grid(row=0, column=2, padx=5, pady=5)
    label_output = tk.Label(root, text='输出文件路径:')
    label_output.grid(row=1, column=0, padx=5, pady=5)
    e_output = tk.Entry(root, width=50)
    e_output.grid(row=1, column=1, padx=5, pady=5)
    button_select_output = tk.Button(root, text='选择文件', command=on_select_output)
    button_select_output.grid(row=1, column=2, padx=5, pady=5)
    label_key = tk.Label(root, text='密钥:')
    label_key.grid(row=2, column=0, padx=5, pady=5)
    e_key = tk.Entry(root, width=50)
    e_key.grid(row=2, column=1, padx=5, pady=5)
    button_generate_key = tk.Button(root, text='生成密钥', command=on_generate_key)
    button_generate_key.grid(row=2, column=2, padx=5, pady=5)
    button_copy_key = tk.Button(root, text='复制密钥', command=on_copy_key)
    button_copy_key.grid(row=2, column=3, padx=5, pady=5)
    #创建加密和解密按钮
    button_encrypt = tk.Button(root, text='加密', command=on_encrypt, width=10)
    button_encrypt.grid(row=3, column=0, padx=5, pady=10)
    button_decrypt = tk.Button(root, text='解密', command=on_decrypt, width=10)
    button_decrypt.grid(row=3, column=1, padx=5, pady=10)
    #运行主循环
    root.mainloop()

功能说明:

  • Blowfish 加密解密: 使用 Blowfish 算法实现文件加密和解密功能。
  • 随机密钥生成: 提供生成随机密钥的功能,密钥长度为 8 个字符。
  • 密钥复制: 可以将生成的密钥复制到剪贴板。
  • 文件选择: 可以选择要加密或解密的文件。
  • 文件保存: 可以选择保存加密或解密后的文件。
  • 错误提示: 如果输入信息不完整或密钥格式不正确,会弹出提示信息。

使用方法:

  1. 运行程序。
  2. 选择要加密或解密的文件。
  3. 输入或生成密钥。
  4. 点击 “加密” 或 “解密” 按钮。
  5. 选择保存加密或解密后的文件。

注意:

  • 密钥长度必须在 8 到 56 个字节之间,且必须是 8 的倍数。
  • 请妥善保管密钥,不要泄露给任何人。
  • 该程序仅供学习参考,不建议用于生产环境。

代码解析:

  • Blowfish_encrypt_decrypt(): 实现 Blowfish 加密和解密的核心函数,支持 CBC 模式。
  • Blowfish_encrypt(): 使用 CBC 模式进行加密的函数。
  • Blowfish_decrypt(): 使用 CBC 模式进行解密的函数。
  • validate_key(): 验证密钥长度是否符合要求。
  • encrypt_file(): 加密文件内容的函数。
  • decrypt_file(): 解密文件内容的函数。
  • on_encrypt(): 处理加密按钮的事件,调用 encrypt_file() 函数进行加密。
  • on_decrypt(): 处理解密按钮的事件,调用 decrypt_file() 函数进行解密。
  • generate_random_key(): 生成随机密钥的函数。
  • on_generate_key(): 处理生成密钥按钮的事件,调用 generate_random_key() 函数生成密钥。
  • on_copy_key(): 处理复制密钥按钮的事件,将密钥复制到剪贴板。
  • on_select_input(): 处理选择输入文件按钮的事件。
  • on_select_output(): 处理选择输出文件按钮的事件。

依赖库:

  • cryptography
  • tkinter
  • filedialog
  • messagebox
  • pyperclip

安装依赖库:

pip install cryptography tkinter pyperclip
Blowfish 加密解密 Python 代码库

原文地址: https://www.cveoy.top/t/topic/oRTz 著作权归作者所有。请勿转载和采集!

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