在前两篇文章中,我们分别介绍了文件加密工具和配套的解密工具。今天,我们将这两个工具整合为一个完整的解决方案 ——39 文件加解密工具,通过选项卡式界面实现加密和解密功能的无缝切换,提供更统一、更便捷的用户体验。

工具核心设计

整体架构

class SparrowFileApp(tk.Tk):
    def __init__(self):
        super().__init__()
        # 初始化加密解密引擎
        self.ef = EncryptionFile()
        self.df = DecryptionFile()
        
        # 设置窗口属性
        self.title("39文件加解密工具")
        self.geometry("700x800")
        self.resizable(True, True)
        
        # 创建样式系统
        self.create_styles()
        
        # 初始化路径变量
        self.encrypt_folder_path = ""
        self.encrypt_file_path = ""
        self.decrypt_folder_path = ""
        self.decrypt_file_path = ""
        
        # 构建UI
        self.create_widgets()

界面设计亮点

  1. 选项卡式布局

    def create_widgets(self):
        # 状态栏
        self.status_bar = ttk.Frame(self, relief=tk.SUNKEN)
        self.status_bar.pack(side=tk.BOTTOM, fill=tk.X)
        
        # 选项卡控件
        self.notebook = ttk.Notebook(self)
        self.notebook.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
        
        # 加密选项卡
        self.encrypt_tab = ttk.Frame(self.notebook)
        self.notebook.add(self.encrypt_tab, text="文件加密")
        self.setup_encryption_tab()
        
        # 解密选项卡
        self.decrypt_tab = ttk.Frame(self.notebook)
        self.notebook.add(self.decrypt_tab, text="文件解密")
        self.setup_decryption_tab()
  2. 专业样式系统

    def create_styles(self):
        self.style = ttk.Style()
        # 按钮样式
        self.style.configure('TButton', font=('Arial', 10), padding=5)
        # 标题样式
        self.style.configure('Header.TLabel', font=('Arial', 16, 'bold'), foreground='#2c3e50')
        # 分区标题样式
        self.style.configure('Section.TLabel', font=('Arial', 10, 'bold'), foreground='#3498db')
        # 状态信息样式
        self.style.configure('Status.TLabel', font=('Arial', 9), foreground='#7f8c8d')
        # 成功信息样式
        self.style.configure('Success.TLabel', font=('Arial', 9), foreground='#27ae60')
        # 警告信息样式
        self.style.configure('Warning.TLabel', font=('Arial', 9), foreground='#e67e22')

加密功能实现

加密界面布局

def setup_encryption_tab(self):
    # 主框架
    main_frame = ttk.Frame(self.encrypt_tab, padding=15)
    main_frame.pack(fill=tk.BOTH, expand=True)
    
    # 标题
    header = ttk.Label(main_frame, text="文件加密", style='Header.TLabel')
    header.pack(pady=(0, 15))
    
    # 文件选择区域
    file_frame = ttk.LabelFrame(main_frame, text="文件选择", padding=10)
    file_frame.pack(fill=tk.X, pady=5)
    
    # 加密选项区域
    options_frame = ttk.LabelFrame(main_frame, text="加密选项", padding=10)
    options_frame.pack(fill=tk.X, pady=10)
    
    # 压缩次数选择(水平布局)
    compress_frame = ttk.LabelFrame(options_frame, text="压缩次数", padding=5)
    compress_frame.pack(fill=tk.X, pady=5)
    
    # 加密模式选择(水平布局)
    mode_frame = ttk.LabelFrame(options_frame, text="加密模式", padding=5)
    mode_frame.pack(fill=tk.X, pady=5)
    
    # 加密算法选择(双行布局)
    algorithm_frame = ttk.LabelFrame(options_frame, text="加密算法", padding=5)
    algorithm_frame.pack(fill=tk.X, pady=5)
    
    # 文件名和密钥输入
    # ...
    
    # 加密按钮
    encrypt_btn = ttk.Button(
        main_frame, text="加密文件",
        command=self.on_encrypt_clicked,
        style='TButton'
    )
    encrypt_btn.pack(fill=tk.X, pady=15)

加密选项设计

  1. 压缩次数选择

    self.compress_var = tk.StringVar(value="二次压缩")
    
    # 水平排列的单选按钮
    compress_row = ttk.Frame(compress_frame)
    compress_row.pack(fill=tk.X, padx=5)
    
    for option in ['二次压缩', '一次压缩']:
        rb = ttk.Radiobutton(
            compress_row, text=option,
            variable=self.compress_var,
            value=option
        )
        rb.pack(side=tk.LEFT, padx=10, pady=2)
  2. 加密算法选择

    self.algorithm_var = tk.StringVar(value="zlib")
    algorithms = ['zlib', 'gzip', 'bz2', 'lzma', 'lz4',
                  'brotli', 'snappy', 'huffman', 'deflate', 'lz77']
    
    # 第一行算法
    algo_row1 = ttk.Frame(algorithm_frame)
    algo_row1.pack(fill=tk.X, padx=5, pady=2)
    for option in algorithms[:5]:
        rb = ttk.Radiobutton(
            algo_row1, text=option,
            variable=self.algorithm_var,
            value=option
        )
        rb.pack(side=tk.LEFT, padx=5, pady=2)
    
    # 第二行算法
    algo_row2 = ttk.Frame(algorithm_frame)
    algo_row2.pack(fill=tk.X, padx=5, pady=2)
    for option in algorithms[5:]:
        rb = ttk.Radiobutton(
            algo_row2, text=option,
            variable=self.algorithm_var,
            value=option
        )
        rb.pack(side=tk.LEFT, padx=5, pady=2)

解密功能实现

解密界面布局

def setup_decryption_tab(self):
    # 主框架
    main_frame = ttk.Frame(self.decrypt_tab, padding=15)
    main_frame.pack(fill=tk.BOTH, expand=True)
    
    # 标题
    header = ttk.Label(main_frame, text="文件解密", style='Header.TLabel')
    header.pack(pady=(0, 15))
    
    # 文件选择区域
    file_frame = ttk.LabelFrame(main_frame, text="文件选择", padding=10)
    file_frame.pack(fill=tk.X, pady=5)
    
    # 文件格式警告
    format_frame = ttk.Frame(main_frame)
    format_frame.pack(fill=tk.X, pady=10)
    format_label = ttk.Label(
        format_frame,
        text="注意: 解密文件必须是 .sfed 格式",
        style='Warning.TLabel'
    )
    format_label.pack(side=tk.LEFT, padx=5)
    
    # 文件名和密钥输入
    # ...
    
    # 解密按钮
    decrypt_btn = ttk.Button(
        main_frame, text="解密文件",
        command=self.on_decrypt_clicked,
        style='TButton'
    )
    decrypt_btn.pack(fill=tk.X, pady=15)

文件选择智能验证

def decrypt_choose_file(self):
    file_types = [('加密文件', '*.sfed'), ('所有文件', '*.*')]
    
    file_path = filedialog.askopenfilename(
        title="选择要解密的文件",
        filetypes=file_types
    )
    
    if file_path:
        # 验证文件格式
        if not file_path.lower().endswith('.sfed'):
            self.decrypt_select_file_text.configure(
                text="请选择.sfed文件",
                style='Warning.TLabel'  # 使用警告样式
            )
            self.update_status("错误: 请选择.sfed格式的加密文件")
            return
        
        self.decrypt_file_path = file_path
        file_name = file_path.split("/")[-1]
        self.decrypt_select_file_text.configure(
            text=f"已选择: {file_name}",
            style='Success.TLabel'  # 使用成功样式
        )
        self.update_status(f"已选择要解密的文件: {file_name}")

核心加解密逻辑

加密处理

def encryption(self, folder, file, times, function, compress, key, to_file):
    # 转换加密参数
    function = 0 if function == '二进制加密' else 1
    times = 2 if times == "二次压缩" else 1 if times == "一次压缩" else 0
    
    # 获取文件类型
    file_type = file.split("/")[-1].split(".")[-1]
    supported_types = [
        "txt", "py", "java", "js", "html", "ipynb", "less", "css", "pcss",
        "scss", "ts", "sass", "c", "cpp", "cc", "C", "cxx", "c++", 'h',
        "php", "go", "kt", "cs", "rb", "pl", "pm", "swift", "sql", "xls",
        "xlsx", "db", 'R', "scala"
    ]
    
    if file_type in supported_types:
        try:
            # 调用加密引擎
            self.ef.encryption_txt(file, key, -1, times, function, folder, to_file, file_type, compress)
            messagebox.showinfo("成功", "文件加密成功!")
            self.update_status("文件加密成功!")
        except Exception as e:
            messagebox.showerror("错误", f"加密过程中发生错误:\n{str(e)}")
            self.update_status(f"加密错误: {str(e)}")
    else:
        messagebox.showerror("错误", f"不支持加密 {file_type} 格式的文件")
        self.update_status(f"不支持的文件类型: {file_type}")

解密处理

def decryption(self, folder, file, key, to_file):
    # 从文件名解析原始文件类型和压缩算法
    parts = file.split("/")[-1].split(".")
    if len(parts) < 3 or parts[-1] != "sfed":
        messagebox.showerror("文件格式错误", "请选择有效的 .sfed 加密文件")
        self.update_status("错误: 无效的加密文件格式")
        return
    
    file_type = parts[-2]  # 原始文件类型
    compress = parts[-3]  # 压缩算法
    
    supported_types = [
        "txt", "py", "java", "js", "html", "ipynb", "less", "css", "pcss",
        "scss", "ts", "sass", "c", "cpp", "cc", "C", "cxx", "c++", 'h',
        "php", "go", "kt", "cs", "rb", "pl", "pm", "swift", "sql", "xlsx",
        "xls", "db", 'R', "scala"
    ]
    
    if file_type in supported_types:
        try:
            # 调用解密引擎
            self.df.decryption_txt(key, folder, file, to_file, file_type, compress)
            messagebox.showinfo("成功", "文件解密成功!")
            self.update_status("文件解密成功!")
        except Exception as e:
            messagebox.showerror("错误", f"解密过程中发生错误:\n{str(e)}")
            self.update_status(f"解密错误: {str(e)}")
    else:
        # 提供详细的错误信息和解决方案
        messagebox.showerror("错误",
                             f"{file_type}格式文件暂不支持解密\n"
                             "如加密文件确认无误,请检查文件格式是否被更改\n"
                             "例如: t.txt.sfed 被修改为 t.tx.sfed"
                             )
        self.update_status(f"不支持的文件类型: {file_type}")

状态管理和用户反馈

状态更新系统

def update_status(self, message):
    """更新状态栏信息"""
    if hasattr(self, 'status_text'):
        self.status_text.configure(text=message)
        self.update()  # 强制立即刷新界面

输入验证

def on_encrypt_clicked(self):
    # 检查是否选择了文件夹
    if not self.encrypt_folder_path:
        messagebox.showwarning("警告", "请先选择加密文件保存文件夹")
        self.update_status("错误: 未选择保存文件夹")
        return
    
    # 检查是否选择了文件
    if not self.encrypt_file_path:
        messagebox.showwarning("警告", "请先选择要加密的文件")
        self.update_status("错误: 未选择要加密的文件")
        return
    
    # 检查文件名是否为空
    file_name = self.encrypt_file_name_entry.get().strip()
    if not file_name:
        messagebox.showwarning("警告", "请输入加密文件保存名字")
        self.update_status("错误: 未输入文件名")
        return
    
    # 检查密钥是否为空
    key = self.encrypt_key_entry.get().strip()
    if not key:
        messagebox.showwarning("警告", "请输入加密秘钥")
        self.update_status("错误: 未输入秘钥")
        return
    
    # 获取加密选项
    times = self.compress_var.get()
    function = self.mode_var.get()
    compress = self.algorithm_var.get()
    
    self.update_status("正在加密文件,请稍候...")
    
    # 执行加密
    self.encryption(
        self.encrypt_folder_path,
        self.encrypt_file_path,
        times,
        function,
        compress,
        key,
        file_name
    )

设计亮点总结

  1. 模块化设计

    • 加密和解密功能分离在独立选项卡中

    • 每个功能模块有独立的变量和状态管理

    • 核心逻辑与界面代码分离

  2. 专业视觉系统

    • 多层级样式配置

    • 状态颜色编码(正常、成功、警告)

    • 合理的控件间距和分组

  3. 智能文件处理

    • 加密时自动识别文件类型

    • 解密时从文件名提取原始类型和算法

    • 文件格式自动验证

  4. 用户体验优化

    • 实时状态反馈

    • 详细的错误信息和解决方案

    • 输入验证和用户引导

    • 水平布局节省空间

  5. 扩展性设计

    • 支持10种加密算法

    • 支持多种压缩级别

    • 支持30+文件格式

使用指南

加密文件步骤:

  1. 切换到"文件加密"选项卡

  2. 选择保存加密文件的文件夹

  3. 选择要加密的文件

  4. 设置加密选项:

    • 压缩次数(二次压缩/一次压缩)

    • 加密模式(二进制/四进制)

    • 加密算法

  5. 输入加密文件保存名称

  6. 设置加密密钥

  7. 点击"加密文件"按钮

解密文件步骤:

  1. 切换到"文件解密"选项卡

  2. 选择保存解密文件的文件夹

  3. 选择.sfed格式的加密文件

  4. 输入解密文件保存名称

  5. 输入解密密钥(必须与加密时相同)

  6. 点击"解密文件"按钮

这个工具通过精心设计的界面和健壮的后台逻辑,为用户提供了专业级的文件加解密解决方案。选项卡式设计使加密解密操作互不干扰,状态管理系统提供实时反馈,智能文件处理减少用户操作步骤,整体上大大提升了用户体验和操作效率。

下载

  1. 文件加解密V1.1.0.0

    1. 描述:

      1. 对文件进行加密

      2. 对文件进行解密

    2. 下载:

      1. 信息加解密.exe