在這個信息泄露風險日益增加的時代,使用文件加密工具對于保護個人隱私和企業機密至關重要。
本文介紹了一款小工具——encryptDecrypt,它不僅提供了一個易于使用的圖形界面,簡化了加密和解密過程,還確保了數據的安全性,幫助用戶遵守數據保護法規,同時尊重和保障了信息的隱私性。
What's NEW:
GitHub正式發布V1.0.0,歡迎使用:https://github.com/AICVHub/encryptDecrypt.githttps://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__
: 初始化類實例,設置key
和fernet
對象為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,或直接使用打包好的程序。