使用Blowfish算法加密和解密Excel文件
import os import random import string import tkinter as tk from tkinter import filedialog, messagebox import pyperclip import io from Crypto.Cipher import Blowfish from Crypto.Util.Padding import pad, unpad import pandas as pd
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 {} bytes.'.format(bs)) '获取初始向量和加密后的数据' 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) '读取输入文件并加密文件内容' df = pd.read_excel(input_file_path) data = df.to_csv(index=False).encode() 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)
df = pd.read_csv(io.StringIO(decrypted_data.decode()))
'将解密后的内容写入输出文件'
df.to_excel(output_file_path, index=False)
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', '请填写完整的输入、输出路径和密钥!(文件类型为Excel文件)')
return
'调用文件加密函数进行处理'
if encrypt_file(input_file_path, output_file_path, key):
messagebox.showinfo('Success', '文件加密成功!(文件类型为Excel文件)')
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', '请填写完整的输入、输出路径和密钥!(文件类型为Excel文件)')
return
'调用文件解密函数进行处理'
if decrypt_file(input_file_path, output_file_path, key):
messagebox.showinfo('Success', '文件解密成功!(文件类型为Excel文件)')
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(filetypes=[('Excel Files', '*.xlsx'), ('All Files', '*.*')])
if file_path:
e_input.delete(0, tk.END)
e_input.insert(0, file_path)
def on_select_output():
'打开文件保存对话框,并设置默认文件扩展名为.xlsx'
file_path = filedialog.asksaveasfilename(defaultextension='.xlsx', filetypes=[('Excel Files', '*.xlsx'), ('All Files', '*.*')])
if file_path:
e_output.delete(0, tk.END)
e_output.insert(0, file_path)
'创建窗口'
window3 = tk.Toplevel()
window3.title('文件加密/解密(Excel文件)')
window3.geometry('500x300')
'创建输入文件路径标签及输入框'
l_input = tk.Label(window3, text='输入文件路径:')
l_input.grid(row=0, column=0, padx=10, pady=10)
e_input = tk.Entry(window3, width=40)
e_input.grid(row=0, column=1, padx=10, pady=10)
'创建选择输入文件按钮'
b_select_input = tk.Button(window3, text='选择文件', command=on_select_input)
b_select_input.grid(row=0, column=2, padx=10, pady=10)
'创建输出文件路径标签及输入框'
l_output = tk.Label(window3, text='输出文件路径:')
l_output.grid(row=1, column=0, padx=10, pady=10)
e_output = tk.Entry(window3, width=40)
e_output.grid(row=1, column=1, padx=10, pady=10)
'创建选择输出文件按钮'
b_select_output = tk.Button(window3, text='选择文件', command=on_select_output)
b_select_output.grid(row=1, column=2, padx=10, pady=10)
'创建密钥标签及输入框'
l_key = tk.Label(window3, text='密钥:')
l_key.grid(row=2, column=0, padx=10, pady=10)
e_key = tk.Entry(window3, width=40)
e_key.grid(row=2, column=1, padx=10, pady=10)
'创建生成密钥按钮'
b_generate_key = tk.Button(window3, text='生成密钥', command=on_generate_key)
b_generate_key.grid(row=2, column=2, padx=10, pady=10)
'创建复制密钥按钮'
b_copy_key = tk.Button(window3, text='复制密钥', command=on_copy_key)
b_copy_key.grid(row=2, column=3, padx=10, pady=10)
'创建加密和解密按钮'
b_encrypt = tk.Button(window3, text='加密', command=on_encrypt)
b_encrypt.grid(row=3, column=1, padx=10, pady=10)
b_decrypt = tk.Button(window3, text='解密', command=on_decrypt)
b_decrypt.grid(row=3, column=2, padx=10, pady=10)
'进入消息循环'
window3.mainloop()
if name == 'main': create_new_window3()
原文地址: https://www.cveoy.top/t/topic/oRTJ 著作权归作者所有。请勿转载和采集!