基于 Python 的“可视化文件加密工具”开发实战(GUI + Fernet 对称加密)



背景介绍

在数字化办公和数据共享日益频繁的今天,保护敏感文件的安全变得尤为重要。无论是个人的隐私文档,还是企业的商业机密,都需要一种简单、安全的方式来实现加密与解密操作。为此,我们开发了一个基于 Python 的“可视化文件加密工具”,它通过图形界面(GUI)让用户直观地选择文件、输入密钥,并一键完成加密与解密操作。

该项目使用了 Python 的 tkinter 构建用户界面,并结合 cryptography 库中的 Fernet 模块实现对称加密。工具支持拖拽操作、按钮交互、密钥管理等功能,适合中级以下开发者学习和实践,具备良好的扩展性和实际应用价值。


思路分析

本项目的核心目标是构建一个用户友好、功能明确、可独立运行的文件加密与解密工具。以下是主要功能模块的实现思路:

  1. GUI 界面设计
    • 使用 tkinter 创建主窗口,包含拖拽文件区域、加密/解密按钮、密钥输入框和状态提示。
    • 支持用户通过拖拽或按钮点击选择文件。
  2. 文件操作逻辑
    • 用户选择文件后,程序读取文件内容并进行加密或解密。
    • 加密后生成 .encrypted 后缀的新文件,解密后则生成 _decrypted 后缀的新文件。
  3. 加密算法实现
    • 使用 Fernet 实现对称加密,确保加密与解密使用相同的密钥。
    • 密钥由用户输入,程序将其转换为 Fernet 所需的字节格式。
  4. 交互与异常处理
    • 提供弹窗提示用户操作结果(如“加密成功”、“解密失败”等)。
    • 捕获并处理可能出现的异常,如密钥错误、文件不存在等。

代码实现

1. 项目结构

file_encryptor/
│
├── main.py              # 启动程序
├── encryptor_gui.py     # GUI 界面逻辑
├── encryptor_utils.py   # 加密/解密工具函数

2. main.py —— 启动程序

# main.py
import tkinter as tk
from encryptor_gui import FileEncryptorGUI

if __name__ == "__main__":
    root = tk.Tk()
    app = FileEncryptorGUI(root)
    root.mainloop()

3. encryptor_gui.py —— GUI 界面逻辑

# encryptor_gui.py
import tkinter as tk
from tkinter import filedialog, messagebox
from encryptor_utils import encrypt_file, decrypt_file
import os

class FileEncryptorGUI:
    def __init__(self, root):
        self.root = root
        self.root.title("可视化文件加密工具")
        self.root.geometry("500x300")

        # 拖拽区域
        self.drag_area = tk.Text(root, height=10, width=60, wrap=tk.WORD, state='disabled')
        self.drag_area.pack(pady=10)
        self.drag_area.drop_target_register(tk.DND_FILES)
        self.drag_area.dnd_bind('<<Drop>>', self.handle_drop)

        # 操作按钮
        self.encrypt_button = tk.Button(root, text="加密文件", command=self.encrypt_file)
        self.encrypt_button.pack(side=tk.LEFT, padx=10)

        self.decrypt_button = tk.Button(root, text="解密文件", command=self.decrypt_file)
        self.decrypt_button.pack(side=tk.RIGHT, padx=10)

        # 密钥输入框
        self.key_label = tk.Label(root, text="请输入密钥:")
        self.key_label.pack(pady=5)
        self.key_entry = tk.Entry(root, show="*")
        self.key_entry.pack(pady=5)

    def handle_drop(self, event):
        file_path = event.data.strip('{}')  # 去除拖拽路径中的大括号
        self.drag_area.config(state='normal')
        self.drag_area.delete(1.0, tk.END)
        self.drag_area.insert(tk.END, f"已选择文件: {file_path}")
        self.drag_area.config(state='disabled')
        self.file_path = file_path

    def encrypt_file(self):
        key = self.key_entry.get()
        if not hasattr(self, 'file_path'):
            messagebox.showerror("错误", "请先拖拽文件到区域中。")
            return
        if not key:
            messagebox.showerror("错误", "请输入密钥。")
            return
        try:
            encrypt_file(self.file_path, key.encode())
            messagebox.showinfo("成功", "文件加密成功!")
        except Exception as e:
            messagebox.showerror("错误", f"加密失败: {str(e)}")

    def decrypt_file(self):
        key = self.key_entry.get()
        if not hasattr(self, 'file_path'):
            messagebox.showerror("错误", "请先拖拽文件到区域中。")
            return
        if not key:
            messagebox.showerror("错误", "请输入密钥。")
            return
        try:
            decrypt_file(self.file_path, key.encode())
            messagebox.showinfo("成功", "文件解密成功!")
        except Exception as e:
            messagebox.showerror("错误", f"解密失败: {str(e)}")

4. encryptor_utils.py —— 加密/解密工具函数

# encryptor_utils.py
from cryptography.fernet import Fernet
import os

def encrypt_file(file_path, key):
    """使用 Fernet 对文件进行加密"""
    fernet = Fernet(key)
    with open(file_path, 'rb') as file:
        file_data = file.read()
    encrypted_data = fernet.encrypt(file_data)
    encrypted_file_path = file_path + '.encrypted'
    with open(encrypted_file_path, 'wb') as encrypted_file:
        encrypted_file.write(encrypted_data)
    os.remove(file_path)  # 可选:删除原始文件

def decrypt_file(file_path, key):
    """使用 Fernet 对文件进行解密"""
    fernet = Fernet(key)
    with open(file_path, 'rb') as file:
        encrypted_data = file.read()
    decrypted_data = fernet.decrypt(encrypted_data)
    decrypted_file_path = file_path.replace('.encrypted', '_decrypted')
    with open(decrypted_file_path, 'wb') as decrypted_file:
        decrypted_file.write(decrypted_data)
    os.remove(file_path)  # 可选:删除加密文件

运行与测试

  1. 安装依赖库
pip install cryptography
  1. 运行程序
python main.py
  1. 操作步骤
    • 拖拽一个文件(如 secret.txt)到 GUI 界面。
    • 输入密钥(如 mysecretpassword)。
    • 点击“加密文件”按钮,生成 secret.txt.encrypted
    • 再次拖入加密文件,输入相同密钥,点击“解密文件”按钮,生成 secret.txt_decrypted

总结

本项目实现了一个可视化文件加密工具,通过 Python 的 tkinter 构建了图形用户界面,结合 cryptography 库中的 Fernet 模块实现了对称加密功能。项目结构清晰,功能完整,适合中级以下开发者练习 GUI 编程与数据加密技术。

该项目具备良好的可扩展性,未来可以加入以下功能以提升实用性:
– 密钥保存与加载(避免每次输入)
– 支持文件夹加密(递归处理子文件)
– 加密强度提示(如密码复杂度检测)
– 多语言支持与国际化

通过本项目,开发者可以深入理解 Python 在桌面应用开发中的能力,同时掌握数据安全处理的基本方法。


发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注