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.pswp.cn/diannao/38606.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/38606.shtml
英文地址,請注明出處:http://en.pswp.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,訓練素材來自于視頻轉…

Dockerfile構建一個包含多個SpringBoot應用程序的鏡像

為什么要使用Dockerfile 構建一個包含多個SpringBoot應用程序的鏡像呢? 1、可移植性:Dockerfile 定義了一個標準化的方式來構建Docker鏡像,意味著無論在哪個系統上(只要它支持Docker), 都可以使用相同的Dockerfile來構建完全相同的…

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種方法教會你

在數字時代的浪潮中,電腦屏幕視頻錄制已經成為一項潮流且實用的技能。無論是為了創作短視頻、分享游戲過程,還是為了記錄在線會議或教程,電腦錄屏都是非常重要的功能。但是不少的人都會遇上錄制好的視頻沒有聲音的困境,面對這種情…

Jenkins的一些記錄

設置環境變量 在 Jenkins 流水線中,取決于使用的是聲明式還是腳本式流水線,設置環境變量的方法不同。 聲明式流水線支持 environment 指令,而腳本式流水線的使用者必須使用 withEnv 步驟。 pipeline {agent anyenvironment { CC clang}stag…

權限控制在軟件開發中的重要性和實施方法

權限控制在軟件開發中的重要性和實施方法 大家好,我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編,也是冬天不穿秋褲,天冷也要風度的程序猿! 1. 為什么權限控制很重要? 權限控制是軟件開發中不可或…

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…

audio ref獲取后 pause失效

this.$refs[soundaudititem].pause()失效&#xff0c;通過ref獲取后&#xff0c;調用pause不生效 后來使用id&#xff0c;生效 let audio document.getElementById(soundaudititem) audio.pause()

機器學習模型訓練過程和預測過程 用孩子來生動的比喻 --九五小龐

訓練過程&#xff1a;孩子在學習知識 想象一下&#xff0c;一個年幼的孩子剛開始學習新知識&#xff0c;這就像是機器學習的模型訓練過程。 收集教材&#xff1a;孩子首先得到了一本教科書或一系列學習材料&#xff0c;這些材料就像機器學習中的數據集&#xff0c;包含了各種…

邏輯這回事(七)---- 器件基礎

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;在圖形設計、圖像制作、繪畫領域也相應發生了…