Python Tkinter:开发一款文件加密解密小工具

在这个信息泄露风险日益增加的时代,使用文件加密工具对于保护个人隐私和企业机密至关重要。

本文介绍了一款小工具——encryptDecrypt,它不仅提供了一个易于使用的图形界面,简化了加密和解密过程,还确保了数据的安全性,帮助用户遵守数据保护法规,同时尊重和保障了信息的隐私性。

What's NEW:

GitHub正式发布V1.0.0,欢迎使用:https://github.com/AICVHub/encryptDecrypt.giticon-default.png?t=N7T8https://github.com/AICVHub/encryptDecrypt.git

同时,GitHub上面还提供了针对linux和windows两个平台上打包好的可执行文件,也欢迎大家从release里面下载使用:


1. 简介

该加密/解密工具的特性主要体现在以下几个方面:

  • 数据保护: 随着网络攻击和数据泄露事件的日益增多,加密是保护数据不被未授权访问的有效手段。

  • 遵守法规: 许多国家和地区都有严格的数据保护法规,如欧盟的通用数据保护条例(GDPR),加密工具帮助组织和个人遵守这些法规。

  • 隐私尊重: 对于处理敏感信息的个人和企业来说,加密是尊重用户隐私和建立信任的重要方式。

  • 便捷操作: 该工具提供了一个简单易用的图形界面,使得没有专业加密知识的用户也能轻松进行文件的加密和解密,降低了使用门槛。

  • 灵活性: 用户可以根据自己的需求生成和加载密钥,对不同文件使用不同的加密策略,提供灵活的加密选项。

  • 本地化处理: 加密和解密过程在用户本地计算机上完成,无需上传数据到第三方服务器,减少了数据在传输过程中的风险。

  • 多平台支持:提供了windows和linux两个平台的预编译包,也提供了源码,可以在任何平台使用。

2. 方法

2.1. 导入模块

  • tkinter as tk: 用于创建GUI应用程序。
  • filedialog: Tkinter的文件对话框模块,用于打开文件选择对话框。
  • messagebox: 用于显示消息框。
  • ttk: 它们是Tkinter主题化的扩展,提供更现代的界面元素。
  • Fernet: 来自cryptography.fernet模块,用于创建安全的加密密钥。

2.2. 定义FileEncryptorDecryptor

这个类负责处理加密和解密的核心逻辑。

  • __init__: 初始化类实例,设置keyfernet对象为None
  • generate_key: 生成一个新的加密密钥并返回。
  • save_key: 将加密密钥保存到文件中。
  • load_key: 从文件中加载加密密钥,并初始化Fernet对象。
  • encrypt_file: 加密文件,如果尚未设置Fernet对象,则生成新密钥并保存。
  • decrypt_file: 解密文件,需要先加载密钥,如果密钥不正确会捕获异常。

2.3. 定义EncryptDecryptApp

这个类是Tkinter应用程序的主要入口点,负责创建和管理GUI组件。

  • __init__: 初始化GUI窗口和组件,包括按钮和框架。
  • encrypt_file: 定义加密文件的逻辑,包括打开文件选择对话框、保存加密文件,并调用FileEncryptorDecryptor类的encrypt_file方法。
  • decrypt_file: 类似于encrypt_file,但用于解密文件。
  • load_key: 打开密钥文件选择对话框,并调用FileEncryptorDecryptor类的load_key方法。

2.4. GUI组件

  • self.frame: 创建一个Ttk框架作为按钮的容器。
  • self.encrypt_button: 加密按钮,点击时会触发文件加密操作。
  • self.decrypt_button: 解密按钮,点击时会触发文件解密操作。
  • self.key_load_button: 加载密钥按钮,点击时会打开文件对话框让用户选择密钥文件。

2.5. 主程序

  • 检查__name__ == '__main__'确保当脚本被直接运行时才创建Tkinter窗口和应用实例,并启动事件循环。

2.6. 错误处理

代码中使用了try...except块来捕获并处理可能发生的异常,例如文件操作错误、密钥加载错误等,并通过messagebox.showerror向用户显示错误信息。

2.7. 用户交互

  • 用户可以通过点击按钮来选择要加密或解密的文件。
  • 加密操作会生成一个新的密钥(如果尚未生成),并提示用户保存。
  • 解密操作需要用户先加载正确的密钥文件。

2.8. 密钥管理

  • 密钥以二进制形式保存和加载,通常保存在扩展名为.key的文件中。

3. 代码

主要的代码如下,包括了FileEncryptorDecryptor和EncryptDecryptApp,分别负责处理加密和解密的核心逻辑以及负责创建和管理GUI组件:

class FileEncryptorDecryptor:def __init__(self):self.key = Noneself.fernet = Nonedef generate_key(self):self.key = Fernet.generate_key()return self.keydef save_key(self, key, key_filename='key.key'):try:with open(key_filename, 'wb') as key_file:key_file.write(key)except Exception as e:messagebox.showerror("错误", f"保存密钥时发生错误: {e}")def load_key(self, key_filename):try:with open(key_filename, 'rb') as key_file:key = key_file.read()self.fernet = Fernet(key)except FileNotFoundError:messagebox.showerror("错误", "密钥文件未找到,请确保密钥文件存在。")except Exception as e:messagebox.showerror("错误", f"加载密钥时发生错误: {e}")def encrypt_file(self, input_filename, output_filename):if not self.fernet:self.fernet = Fernet(self.generate_key())self.save_key(self.key)try:with open(input_filename, 'rb') as input_file:content = input_file.read()encrypted_content = self.fernet.encrypt(content)with open(output_filename, 'wb') as output_file:output_file.write(encrypted_content)messagebox.showinfo("成功", "文件已加密。")except Exception as e:messagebox.showerror("错误", f"加密过程中发生错误: {e}")def decrypt_file(self, input_filename, output_filename):if not self.fernet:messagebox.showerror("错误", "请先加载密钥。")try:with open(input_filename, 'rb') as input_file:encrypted_content = input_file.read()decrypted_content = self.fernet.decrypt(encrypted_content)with open(output_filename, 'wb') as output_file:output_file.write(decrypted_content)messagebox.showinfo("成功", "文件已解密。")except Fernet.InvalidToken:messagebox.showerror("错误", "解密失败,密钥可能不正确。")except Exception as e:messagebox.showerror("错误", f"解密过程中发生错误: {e}")class EncryptDecryptApp:def __init__(self, root):self.root = rootself.root.title("文件加密/解密工具")self.ed = FileEncryptorDecryptor()self.frame = ttk.Frame(self.root, padding="3 3 12 12")self.frame.grid(column=0, row=0, sticky=(tk.W, tk.E, tk.N, tk.S))self.encrypt_button = ttk.Button(self.frame, text="加密文件", command=self.encrypt_file)self.encrypt_button.grid(column=0, row=0, padx=10, pady=10)self.decrypt_button = ttk.Button(self.frame, text="解密文件", command=self.decrypt_file)self.decrypt_button.grid(column=1, row=0, padx=10, pady=10)self.key_load_button = ttk.Button(self.frame, text="加载密钥", command=self.load_key)self.key_load_button.grid(column=2, row=0, padx=10, pady=10)def encrypt_file(self):input_filename = filedialog.askopenfilename(title="选择要加密的文件",filetypes=[("所有文件", "*.*")])if not input_filename:returnoutput_filename = filedialog.asksaveasfilename(title="保存加密文件",defaultextension=".enc",filetypes=[("加密文件", "*.enc")])if not output_filename:returnself.ed.encrypt_file(input_filename, output_filename)def decrypt_file(self):input_filename = filedialog.askopenfilename(title="选择要解密的文件",filetypes=[("加密文件", "*.enc")])if not input_filename:returnoutput_filename = filedialog.asksaveasfilename(title="保存解密文件",defaultextension=".txt",filetypes=[("解密文件", "*")])if not output_filename:returnself.ed.decrypt_file(input_filename, output_filename)def load_key(self):key_filename = filedialog.askopenfilename(title="选择密钥文件",filetypes=[("密钥文件", "*.key")])if not key_filename:returnself.ed.load_key(key_filename)

完整代码见GitHub,或直接使用打包好的程序。

4. 软件运行截图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/38606.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入解析 androidx.databinding.BaseObservable

在现代 Android 开发中,数据绑定 (Data Binding) 是一个重要的技术,它简化了 UI 和数据之间的交互。在数据绑定框架中,androidx.databinding.BaseObservable 是一个关键类,用于实现可观察的数据模型。本文将详细介绍 BaseObservab…

python-求s=a+aa+aaa+aaaa+aa...a的值(赛氪OJ)

[题目描述] 求 saaaaaaaaaaaa...a 的值,其中 a 是一个一位的整数。 例如 :2222222222222222(此时共有 5 个数相加)。输入格式: 整数 a 和 n ( n 个数相加)。输出格式: s 的值。样例输入 2 2样例输出 24数据…

WSL——忘记root密码(Ubuntu)

1、问题描述 Windows下的WSL(Ubuntu)忘记了root密码,无法使用管理员权限。 2、解决方法 关闭 Ubuntu 窗口。打开 Windows 的 Powershell 或 cmd, 以 root 默认登陆 WSL。 wsl -u root 修改对应用户密码。 # xxx为要修改密码的用…

Stable Diffusion【真人模型】:人脸特美的人像摄影大模型wuhaXL_realisticMixV3.0

今天和大家分享一个基于SDXL的真人大模型:wuhaXL_realisticMix。该模型无需使用LORA**就能生成的特别漂亮的人脸,虽然有时候人脸有些假,但是生成的人脸确实非常漂亮。 该模型底模融合了WhiteXL_realisticMix,训练素材来自于视频转…

pytorch统计学分布

1、pytorch统计学函数 import torcha torch.rand(2,2) print(a) print(torch.sum(a, dim0)) print(torch.mean(a, dim0)) print(torch.prod(a, dim0))print(torch.argmax(a, dim0)) print(torch.argmin(a, dim0)) print(torch.std(a)) print(torch.var(a)) print(torch.median…

如何学好AI绘画?点这里有答案!

前言 地狱难度的求职模式下,“掌握一门技术”的那部分求职者,远比其他人更有竞争力;而拥有出色技术和技能的设计师、以及未来想做设计师的小伙伴们,怎么才能更好实现工作自由? 只有两个字:学习。 学习新…

EE trade:白银什么情况下会暴涨

白银价格的暴涨通常由多种因素共同作用引发,包括宏观经济背景、市场供需变化、地缘政治紧张局势以及金融市场波动等。本文整理了一些具体情况和实例,说明白银在什么情况下可能会暴涨。 1. 宏观经济因素 通货膨胀急剧上升 背景:当通货膨胀急…

电脑怎么录屏幕视频带声音?2种方法教会你

在数字时代的浪潮中,电脑屏幕视频录制已经成为一项潮流且实用的技能。无论是为了创作短视频、分享游戏过程,还是为了记录在线会议或教程,电脑录屏都是非常重要的功能。但是不少的人都会遇上录制好的视频没有声音的困境,面对这种情…

HTML5+CSS3+JS小实例:图片九宫格

实例:图片九宫格 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1…

操作系统精选题(四)(论述题)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;操作系统 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 前言 一、银行家算法的一道例题 二、页…

二叉搜索树的实现与测试

目录 1.二叉搜索树的结构与特性 2.二叉搜索树的实现 &#xff08;1&#xff09;节点 &#xff08;2&#xff09;功能实现 插入&#xff1a; 删除&#xff1a; 查找: 打印&#xff1a; 3.测试 插入删除&#xff1a; 查找&#xff1a; 4.变种测试&#xff0c;即带valu…

vue3 【提效】自动注册组件 unplugin-vue-components 实用教程

还在为每次都要导入组件而烦恼吗 &#xff1f; // 每次都需手动导入组件 import webName from /components/webName.vue用 unplugin-vue-components 来帮你吧&#xff0c;以后组件直接拿来用即可&#xff0c;无需再导入啦 &#xff01; <webName />使用流程 1. 安装 un…

逻辑这回事(七)---- 器件基础

Xilinx FPGA创建了先进的硅模块(ASMBL)架构,以实现FPGA具有针对不同应用程序领域优化的各种功能组合的平台。通过这一创新,Xilinx提供了更多的设备选择,使客户能够为其特定设计选择具有正确的功能和功能组合的FPGA。ASMBL体系结构通过以下方式突破了传统的设计障碍:消除几…

LINUX系统编程:多线程互斥

目录 1.铺垫 2.线程锁接口的认识 静态锁分配 动态锁的分配 互斥量的销毁 互斥量加锁和解锁 3.加锁版抢票 4.互斥的底层实现 1.铺垫 先提一个小场景&#xff0c;有1000张票&#xff0c;现在有4个进程&#xff0c;这四个进程疯狂的去抢这1000张票&#xff0c;看看会发生什…

新书速览|Adobe Firefly:萤火虫:AI绘画快速创意设计

《Adobe Firefly&#xff1a;萤火虫&#xff1a;AI绘画快速创意设计》 本书内容 人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;浪潮的席卷已经变成不可阻挡的趋势&#xff0c;伴随着这种变化&#xff0c;在图形设计、图像制作、绘画领域也相应发生了…

什么是接口测试,我们如何实现接口测试?

1. 什么是接口测试 顾名思义&#xff0c;接口测试是对系统或组件之间的接口进行测试&#xff0c;主要是校验数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及相互逻辑依赖关系。其中接口协议分为HTTP,WebService,Dubbo,Thrift,Socket等类型&#xff0c;测试类型又主…

NewspaceGPT带你玩系列之SQL专家(强烈推荐)

目录 注册一个账号&#xff0c;用qq邮箱&#xff0c;然后登录选一个可用的Plus&#xff0c;不要选3.5探索GPT今天的主角是SQL Expert&#xff08;SQL 专家&#xff09;问题1&#xff1a;答1. 索引原因&#xff1a;优化措施&#xff1a;示例&#xff1a; 2. 查询设计原因&#x…

ros中teleop_twist_keyboard安装使用

目录 1.安装 2.使用 3.说明 1.安装 sudo apt-get install ros-noetic-teleop-twist-keyboard 其中noetic替换成你自己的ros版本 2.使用 roscore #启动roscore rosrun teleop_twist_keyboard teleop_twist_keyboard.py …

零基础STM32单片机编程入门(五)FreeRTOS实时操作系统详解及实战含源码视频

文章目录 一.概要二.什么是实时操作系统三.FreeRTOS的特性四.FreeRTOS的任务详解1.任务函数定义2.任务的创建3.任务的调度原理 五.CubeMX配置一个FreeRTOS例程1.硬件准备2.创建工程3.调试FreeRTOS任务调度 六.CubeMX工程源代码下载七.讲解视频链接地址八.小结 一.概要 FreeRTO…

[SwiftUI 开发] 嵌套的ObservedObject中的更改不会更新UI

1. 发生问题的demo 业务逻辑代码 class Address: ObservableObject {Published var street "123 Apple Street"Published var city "Cupertino" }class User: ObservableObject {Published var name "Tim Cook"Published var address Addr…