上一篇文章我们介绍了基于 Tkinter 的文件加密工具,今天我们来看看它的配套工具 ——SFED 格式文件解密器。这个解密工具专门用于解密由加密工具生成的.sfed格式文件,保持了一致的操作风格和用户体验。

工具核心功能

  • 支持.sfed格式加密文件的解密

  • 自动识别原始文件类型和压缩算法

  • 可视化文件选择界面

  • 实时状态反馈和错误处理

  • 支持多种编程语言和文档格式

界面设计思路

1. 整体布局优化

解密工具界面比加密工具更简洁,专注于核心功能:

class SparrowFileDecryption(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title("39文件解密工具")
        self.geometry("500x500")  # 更紧凑的尺寸
        self.resizable(True, True)
        
        # 创建专业配色方案
        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')  # 警告颜色
        
        self.create_widgets()

2. 文件选择区域

突出.sfed文件格式要求,提供明确的视觉提示:

def create_widgets(self):
    # 文件选择部分
    file_frame = ttk.LabelFrame(main_frame, text="文件选择", padding=10)
    file_frame.pack(fill=tk.X, pady=5)

    # 选择文件按钮
    file_btn = ttk.Button(
        file_frame, text="选择被解密的文件",
        command=self.choose_file
    )
    file_btn.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)

3. 核心输入区域

简化界面,只保留必要元素:

# 文件名输入
name_frame = ttk.Frame(main_frame)
name_frame.pack(fill=tk.X, pady=5)

name_label = ttk.Label(name_frame, text="解密文件保存名字:", width=18)
name_label.pack(side=tk.LEFT, padx=(0, 5))

self.file_name_entry = ttk.Entry(name_frame)
self.file_name_entry.pack(fill=tk.X, expand=True)

# 密钥输入
key_frame = ttk.Frame(main_frame)
key_frame.pack(fill=tk.X, pady=5)

key_label = ttk.Label(key_frame, text="秘钥:", width=18)
key_label.pack(side=tk.LEFT, padx=(0, 5))

self.key_entry = ttk.Entry(key_frame, show="*")  # 密码隐藏显示
self.key_entry.pack(fill=tk.X, expand=True)

4. 状态栏设计

提供实时操作反馈:

# 状态栏
status_bar = ttk.Frame(self, relief=tk.SUNKEN)
status_bar.pack(side=tk.BOTTOM, fill=tk.X)

self.status_text = ttk.Label(
    status_bar, text="就绪",
    anchor=tk.W, style='Status.TLabel'
)
self.status_text.pack(side=tk.LEFT, padx=10)

# 初始提示
self.update_status("请选择要解密的.sfed文件")

核心功能实现

1. 智能文件选择

自动验证文件格式并提供即时反馈:

def 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.select_file_text.configure(
                text="请选择.sfed文件",
                style='Warning.TLabel'  # 使用警告样式
            )
            self.update_status("错误: 请选择.sfed格式的加密文件")
            return

        self.file_path = file_path
        file_name = file_path.split("/")[-1]
        self.select_file_text.configure(
            text=f"已选择: {file_name}",
            style='Success.TLabel'  # 使用成功样式
        )
        self.update_status(f"已选择要解密的文件: {file_name}")

2. 解密核心逻辑

自动提取原始文件类型和压缩算法:

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}")

3. 解密按钮事件处理

完善的输入验证和用户引导:

def on_decrypt_clicked(self):
    # 检查是否选择了文件夹
    if not self.folder_path:
        messagebox.showwarning("警告", "请先选择解密文件保存文件夹")
        self.update_status("错误: 未选择保存文件夹")
        return

    # 检查是否选择了文件
    if not self.file_path:
        messagebox.showwarning("警告", "请先选择要解密的文件")
        self.update_status("错误: 未选择要解密的文件")
        return

    # 检查文件名是否为空
    file_name = self.file_name_entry.get().strip()
    if not file_name:
        messagebox.showwarning("警告", "请输入解密文件保存名字")
        self.update_status("错误: 未输入文件名")
        return

    # 检查密钥是否为空
    key = self.key_entry.get().strip()
    if not key:
        messagebox.showwarning("警告", "请输入解密秘钥")
        self.update_status("错误: 未输入秘钥")
        return

    self.update_status("正在解密文件,请稍候...")

    # 调用解密方法
    self.decryption(
        self.folder_path,
        self.file_path,
        key,
        file_name
    )

使用技巧和注意事项

  1. 文件格式要求

    • 只支持.sfed格式的加密文件

    • 文件名结构应为:原始文件名.原始扩展名.压缩算法.sfed

    • 示例:document.txt.zlib.sfed

  2. 密钥注意事项

    • 必须使用加密时设置的相同密钥

    • 密钥区分大小写

    • 忘记密钥将无法解密文件

  3. 常见问题解决

    # 文件格式错误的处理逻辑
    if len(parts) < 3 or parts[-1] != "sfed":
        messagebox.showerror("文件格式错误", "请选择有效的 .sfed 加密文件")
        self.update_status("错误: 无效的加密文件格式")
        return
  4. 状态监控

    • 状态栏实时显示操作进度

    • 成功/错误使用不同颜色标识

    • 详细错误信息帮助快速定位问题

设计亮点

  1. 智能文件识别

    # 自动提取文件类型和压缩算法
    file_type = parts[-2]  # 原始文件类型
    compress = parts[-3]  # 压缩算法
  2. 用户友好提示

    # 初始引导提示
    self.update_status("请选择要解密的.sfed文件")
    
    # 文件格式错误提示
    format_label = ttk.Label(
        format_frame,
        text="注意: 解密文件必须是 .sfed 格式",
        style='Warning.TLabel'
    )
  3. 响应式界面

    # 状态更新方法
    def update_status(self, message):
        self.status_text.configure(text=message)
        self.update()  # 强制刷新界面
  4. 键盘快捷键支持

    # 回车键触发解密
    self.bind("<Return>", lambda event: self.on_decrypt_clicked())

总结

这个文件解密工具通过Tkinter实现了:

  • 简洁直观的用户界面

  • 自动识别加密文件信息

  • 实时状态反馈和错误处理

  • 完善的输入验证机制

  • 支持多种文件格式的解密

关键设计思想

  1. 专注于核心功能,去除不必要元素

  2. 提供明确的用户引导和错误提示

  3. 实时反馈增强用户体验

  4. 自动化提取文件信息减少用户操作

这个工具可以直接集成到文件加密系统中,为用户提供完整的加密-解密解决方案。

解密工具的实现充分考虑了安全性和易用性的平衡,既保证了加密文件的安全性(必须使用正确密钥和格式),又通过精心设计的界面和提示降低了操作难度。

下载

  1. 文件解密V1.1.0.0

    1. 描述:

      1. 将加密后的文件进行解密

    2. 下载:

      1. 文件解密.exe