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

news2024/11/18 18:37:21

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

本文介绍了一款小工具——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 = None
        self.fernet = None

    def generate_key(self):
        self.key = Fernet.generate_key()
        return self.key

    def 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 = root
        self.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:
            return

        output_filename = filedialog.asksaveasfilename(
            title="保存加密文件",
            defaultextension=".enc",
            filetypes=[("加密文件", "*.enc")]
        )
        if not output_filename:
            return

        self.ed.encrypt_file(input_filename, output_filename)

    def decrypt_file(self):
        input_filename = filedialog.askopenfilename(
            title="选择要解密的文件",
            filetypes=[("加密文件", "*.enc")]
        )
        if not input_filename:
            return

        output_filename = filedialog.asksaveasfilename(
            title="保存解密文件",
            defaultextension=".txt",
            filetypes=[("解密文件", "*")]
        )
        if not output_filename:
            return

        self.ed.decrypt_file(input_filename, output_filename)

    def load_key(self):
        key_filename = filedialog.askopenfilename(
            title="选择密钥文件",
            filetypes=[("密钥文件", "*.key")]
        )
        if not key_filename:
            return

        self.ed.load_key(key_filename)

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

4. 软件运行截图

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

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

相关文章

国产压缩包工具——JlmPackCore SDK说明(一)

一、什么是JlmPackCore SDK (1)自主可控 JlmPackCore是一套基于我国自主知识产权的核心算法发明专利——杰林码(详系请参考《杰林码原理及应用》一书,也可以参考后续发表的相关论文),其中一篇会议论文&…

完全入门C语言

1.C语言 C语言是一门通用的计算机编程语言,广泛应用于底层开发。其设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。有良好的跨平台的特性。 同时C语言还是面向过程的编程语言,…

汇编基础语法

指令格式 1、立即数 一个常数,该常数必须对应8位位图,即一个8位的常数通过循环右移偶数位得到该数,该数位合法立即数 在指令中表示方法:#数字,例如:#100 快速判定是否是合法立即数: 首先将这…

一款可以编辑SVG矢量图形的方法(以桑基图为例)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、svg矢量图片在线绘制网站二、保存SVG格式图片二、修改SVG图片中的字体大小一、svg矢量图片在线绘制网站 提示:有些图不想用代码出图时,可以采用这个网站,无需注册,无VIP: 网站地址https…

FFmpeg视频处理工具安装使用

一、前言 FFmpeg是流行的开源视频处理工具,用于转码、合并、编辑等。以下是安装和使用方法: 二、步骤 1.下载 1.1 ffmpeg下载 官网下载地址 wget https://www.ffmpeg.org/releases/ffmpeg-6.1.1.tar.xz1.2 nasm下载 https://www.nasm.us/pub/nasm/…

桥感应加热主电路拓扑结构及控制原

1 桥感应加热主电路拓扑结构及控制原理 1.1 主电路拓扑 本文所述中频感应加热电源采用交—直—交的变频原理,三相50Hz的正弦交流输入电压经过整流滤波为540V平滑直流电压,再经逆变器将直流电压变成不同频率的交流电压供负载使用。本文采用半桥串联谐振…

【echarts】如何关闭dataZoom-silder 组件中数据阴影(缩略图、数据走势图)

echarts开启 “滑动条型数据区域缩放组件(dataZoomInside)”后,默认会显示数据的走势图。 但有时候我们并不需要。 如何关闭呢? 官方有提供一个属性:showDataShadow https://echarts.apache.org/zh/option.html#da…

无线物联网题集

测试一 未来信息产业的发展在由信息网络向 全面感知和 智能应用两个方向拓展、延伸和突破。 各国均把 物联网作为未来信息化战略的重要内容,融合各种信息技术,突破互联网的限制,将物体接入信息网络。 计算机的出现,开始了第四次工业革命,开始了人机物的高度融合(&…

【Unity】 HTFramework框架(五十二)使用 HybridCLR 热更新

更新日期:2024年7月1日。 Github源码:[点我获取源码] Gitee源码:[点我获取源码] 索引 HybridCLR 热更新一、启用宏定义二、导入HybridCLR三、设置热更新程序集四、资源、代码热更 HybridCLR 热更新 HybridCLR是一个特性完整、零成本、高性能…

探索 ONLYOFFICE 8.1:云端协作的新纪元

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

如果对方没做幂等!记一次生产订单重复的反思

最近公司公司的旧系统中发现了一个bug。业务部门反馈,尽管用户只支付了一年的服务费用,系统却将有效期增加了两年。 原因分析: 到底是什么原因呢? 经过日志分析,发现消息队列(MQ)向第三方服务发…

EDI是什么?与ERP有何关系

EDI的发展过程 电子数据交换(Electronic Data Interchange,EDI)是一种通过电子方式传输商业文件的技术。EDI的历史可以追溯到20世纪60年代,当时企业开始使用计算机进行数据处理。最早的EDI系统是为解决大型企业间的信息交换问题而…

【刷题汇总--数字统计、两个数组的交集、点击消除(栈)】

C日常刷题积累 今日刷题汇总 - day0011、数字统计1.1、题目1.2、思路1.3、程序实现 2、两个数组的交集2.1、题目2.2、思路2.3、程序实现 3、点击消除(栈)3.1、题目3.2、思路3.3、程序实现 今日刷题汇总 - day001 1、数字统计 1.1、题目 请统计某个给定范围[L, R]的所有整数中…

智能制造企业CRM系统推荐清单(2024版)

当前,CRM市场呈现出“国际龙头优势逐渐下降,国产CRM奋起直追”的格局。智能制造企业在选型CRM时,如何选择合适的系统是一个需要重视的课题。 在我们之前的文章《一文读懂CRM,2023年30家CRM系统对比(近年最全&#xf…

如何在AWS上使用免费的服务器

要在AWS上免费使用的服务器,你可以按照以下步骤操作: (1)注册AWS账户: 访问AWS官方网站(https://aws.amazon.com/cn/),点击右上角的“完成注册”,按照页面提示填写相关…

经典小游戏(一)C实现——三子棋

switch(input){case 1:printf("三子棋\n");//这里先测试是否会执行成功break;case 0:printf("退出游戏\n");break;default :printf("选择错误,请重新选择!\n");break;}}while(input);//直到输入的结果为假,循环才会结束} …

基于FreeRTOS+STM32CubeMX+LCD1602+MCP23S09(SPI接口)的I/O扩展器Proteus仿真

一、仿真原理图: 二、运行效果: 三、STM32CubeMX配置: 1)、GPIO配置: 2)、SPI配置: 四、部分软件: 1)、主函数: /* USER CODE BEGIN Header */ /** ****************************************************************************** * @file : mai…

游戏AI的创造思路-技术基础-关于艾宾浩斯遗忘曲线的迷思

对于艾宾浩斯遗忘曲线和函数,我一直都有小小的迷思,总想实验下用艾宾浩斯函数来替换sigmoid函数作为激活函数,打造更接近人类的AI算法,这篇文章旨在讨论下 目录 3.10. 艾宾浩斯曲线 3.10.1. 定义 3.10.1.1. 曲线计算公式 3.10…

想用AI高端算力训练模型?试试英智BayStone平台

随着生成式人工智能的迅猛增长,各大公司纷纷推出强大的 AI产品以提升自身核心竞争力,对于依赖基础模型进行推理训练,同时需要高级基础设施的人工智能初创企业,急需使用高端智算算力来加速模型训练与产品研发创新。 算力是否充足&…

测试接口的完整流程

背景 今天睿哥给我布置了一个任务,叫我学习一下如何测试接口。 然后我就上网搜索去了解了一下,看看测试接口是什么。看了很久之后,我大概对接口测试有了一定的理解。 通俗来说,接口测试就是使用某种工具模拟客户端发送http请求…