Blowfish 算法加密解密工具:文件加密解密,密钥生成和复制
import os
import random
import string
import tkinter as tk
from tkinter import messagebox, filedialog
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.primitives.padding import PKCS7
import pyperclip
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):
#使用CBC模式进行解密
bs = Blowfish.block_size
return unpad(Blowfish_encrypt_decrypt(key, data, Blowfish.MODE_CBC), bs)
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)
new_window = tk.Toplevel(root_new)
new_window.title('Blowfish算法加密/解密窗口')
new_window.geometry('2000x1000')
lbl_input = tk.Label(new_window, text='输入文件路径:')
lbl_input.pack()
e_input = tk.Entry(new_window, width=50)
e_input.pack()
btn_select_input = tk.Button(new_window, text='选择文件', command=on_select_input)
btn_select_input.pack()
lbl_output = tk.Label(new_window, text='输出文件路径:')
lbl_output.pack()
e_output = tk.Entry(new_window, width=50)
e_output.pack()
btn_select_output = tk.Button(new_window, text='选择路径', command=on_select_output)
btn_select_output.pack()
lbl_key = tk.Label(new_window, text='密钥:')
lbl_key.pack()
e_key = tk.Entry(new_window)
e_key.pack()
#创建生成密钥按钮
generate_key_btn = tk.Button(new_window, text='生成密钥', command=on_generate_key)
generate_key_btn.pack()
#复制
copy_key_btn = tk.Button(new_window, text='复制密钥', command=on_copy_key)
copy_key_btn.pack()
#创建加密和解密按钮
btn_encrypt = tk.Button(new_window, text='加密', command=on_encrypt)
btn_encrypt.pack()
btn_decrypt = tk.Button(new_window, text='解密', command=on_decrypt)
btn_decrypt.pack()
解决TypeError: unpad() missing 1 required positional argument: 'block_size'
错误的代码:
def Blowfish_decrypt(key, data):
#使用CBC模式进行解密
bs = Blowfish.block_size
return unpad(Blowfish_encrypt_decrypt(key, data, Blowfish.MODE_CBC), bs)
解释:
在 Blowfish_decrypt
函数中添加了 bs = Blowfish.block_size
代码行,并将其作为参数传递给 unpad()
函数。unpad()
函数需要 block_size
参数来确定填充的块大小,从而正确地去除填充数据。
其他优化措施:
- 标题和描述的优化: 调整了标题和描述,使其更具描述性和吸引力,方便搜索引擎理解内容。
- 关键词的优化: 添加了与工具功能相关的关键词,方便用户搜索。
- 代码格式的优化: 使用了规范的代码格式和注释,提高代码可读性和可维护性。
- 内容的优化: 对代码进行了简化和整理,并添加了对错误解决的解释,使内容更加清晰易懂。
注意:
- 此代码需要安装
cryptography
和pyperclip
库。 - 请确保
Blowfish
类已正确定义,例如使用cryptography
库中的algorithms.Blowfish
类。 - 为了安全起见,请勿在生产环境中使用此代码。此代码仅供学习和参考使用。
希望这些改进能帮助您更好地理解和使用此 Blowfish 加密解密工具。
原文地址: http://www.cveoy.top/t/topic/oK0M 著作权归作者所有。请勿转载和采集!