Python图形用户界面的文本文件加密工具
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x5oEvdLE-1720676762602)(https://i-blog.csdnimg.cn/direct/ddf0cd975b2d48a9a2f3b35c55e00add.png)]
设计方案
DES.py
DESAlgorithm 类负责管理密钥并提供加密和解密的功能。
在构造函数中,我们初始化了一个 8 字节的密钥。
encrypt 方法的实现如下:
- 首先,创建一个 DES 加密器,并指定 ECB 模式。
- 然后,使用 pad 函数对明文字符串进行填充,使其长度为 DES 块大小(8 字节)的整数倍。
- 最后,使用加密器的 encrypt 方法对填充后的明文进行加密,并返回加密后的二进制数据。
decrypt 方法的实现如下: - 首先,创建一个 DES 解密器,并指定 ECB 模式。
- 然后,使用解密器的 decrypt 方法对加密后的二进制数据进行解密。
- 最后使用 unpad 函数去除填充,并将解密后的二进制数据转换为明文字符串。
create_DES_cipher 函数用于创建 DES 加密/解密器,并接受密钥和工作模式作为输入。
pad 和 unpad 函数分别用于对数据进行填充和去除填充。
创建了一个 8 字节的密钥。
创建 DESAlgorithm 实例,并使用该实例对明文进行加密和解密。
打印出加密后的数据和解密后的数据,以验证加密和解密的正确性。
CAREASR.py
Caesar 类用来实现凯撒密码加密和解密。
在初始化函数 init 中:
- 接受一个 miyao 参数,表示密钥(位移量)。
- 创建了一个 biao 字符串,包含了 26 个大写字母、26 个小写字母、10 个数字以及一些常用的标点符号,这个字符串将作为字符集使用。
encrypt 方法实现了加密功能:
- 初始化一个空字符串 cipText 作为加密结果。
- 遍历输入的 Text 字符串。
- 对于每个字符,如果它在 biao字符集中,则查找它在 biao 中的索引 index。
- 计算新的索引 cipherIndex 为 (index + miyao) % len(biao)。
- 将 biao 中对应新索引的字符添加到 cipText 中。
- 最终返回加密后的字符串 cipText。
decrypt 方法实现了解密功能:
- 初始化一个空字符串 clearText 作为解密结果。
- 遍历输入的 cipText 字符串。
- 对于每个字符,如果它在 biao字符集中,则查找它在 biao 中的索引 index。
- 计算新的索引 clearIndex 为 (index - miyao) %len(biao)。
- 将 biao 中对应新索引的字符添加到 clearText 中。
- 最终返回解密后的明文字符串 clearText。
Main.py
定义 FileEncryptWindow 类:
初始化方法:
1.创建 Tk 窗口
2.设置默认算法为 None
3.调用 create_menu() 方法
4.调用 create_toolbar() 方法
5.调用 create_text_editor() 方法
6.运行 mainloop()
create_menu() 方法:
创建菜单栏
创建文件菜单
添加打开、加密、解密和退出选项
create_toolbar() 方法:
创建工具栏 Frame
添加文件名输入框
添加打开按钮
添加密钥输入框
添加算法选择下拉菜单
添加加密按钮
添加解密按钮
create_text_editor() 方法:
创建文本编辑器 Text 控件
将其设置为填充并扩展
open_file() 方法:
打开文件对话框
读取文件内容
将文件内容显示在文本编辑器中
encrypt_file() 方法:
检查是否已打开文件
根据选择的算法执行加密操作
将加密后的数据保存到新文件
decrypt_file() 方法:
检查是否已打开文件
根据选择的算法执行解密操作
将解密后的数据保存到新文件
run() 方法:
运行 mainloop()
如果是主程序:
创建 FileEncryptWindow 对象
调用 run() 方法
代码
from tkinter import *
from tkinter.filedialog import askopenfilename, asksaveasfilename
from tkinter.messagebox import showerror
class Caesar:
def __init__(self, miyao):
self.miyao = miyao
self.biao = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890 `-=~!@#$%^&*()_+,./<>?{}|[]\\;:\'\""
def encrypt(self,Text):
cipText = ""
for char in Text:
if char in self.biao:
index = self.biao.find(char)
cipherIndex = (index + self.miyao) % len(self.biao)
cipText += self.biao[cipherIndex]
return cipText
def decrypt(self,cipText):
clearText = ""
for char in cipText:
if char in self.biao:
index = self.biao.find(char)
clearIndex = (index - self.miyao) % len(self.biao)
clearText += self.biao[clearIndex]
return clearText
class FileEncryptWindow:
def __init__(self):
self.window = Tk()
self.caesar = None
self.create_menu()
self.create_toolbar()
self.create_text_editor()
self.window.mainloop()
def create_menu(self):
menubar = Menu(self.window)
self.window.config(menu=menubar)
file_menu = Menu(menubar, tearoff=0)
file_menu.add_command(label="打开", command=self.open_file)
file_menu.add_command(label="加密", command=self.encrypt_file)
file_menu.add_command(label="解密", command=self.decrypt_file)
file_menu.add_separator()
file_menu.add_command(label="退出", command=self.window.quit)
menubar.add_cascade(label="文件", menu=file_menu)
def create_toolbar(self):
toolbar = Frame(self.window)
toolbar.pack(fill=X)
self.file_name = StringVar()
entry_file_name = Entry(toolbar, textvariable=self.file_name)
entry_file_name.pack(side=LEFT, padx=5, pady=5)
btn_open = Button(toolbar, text="打开", command=self.open_file)
btn_open.pack(side=LEFT, padx=5, pady=5)
self.key = StringVar()
entry_key = Entry(toolbar, textvariable=self.key)
entry_key.pack(side=LEFT, padx=5, pady=5)
self.key.set("3")
btn_encrypt = Button(toolbar, text="加密", command=self.encrypt_file)
btn_encrypt.pack(side=LEFT, padx=5, pady=5)
btn_decrypt = Button(toolbar, text="解密", command=self.decrypt_file)
btn_decrypt.pack(side=LEFT, padx=5, pady=5)
def create_text_editor(self):
self.text = Text(self.window)
self.text.pack(fill=BOTH, expand=True)
def open_file(self):
in_file_name = askopenfilename()
if in_file_name:
try:
with open(in_file_name, "r") as in_file:
self.file_name.set(in_file_name)
self.file_content = in_file.read()
self.text.delete(1.0, END)
self.text.insert(END, self.file_content)
except Exception as e:
showerror("错误", str(e))
def encrypt_file(self):
if not self.file_name.get():
showerror("错误", "请先打开文件")
return
if not self.key.get().isdigit():
showerror("错误", "密钥必须是整数")
return
try:
key = int(self.key.get())
self.caesar = Caesar(key)
encrypted_text = self.caesar.encrypt(self.file_content)
out_file_name = asksaveasfilename()
if out_file_name:
with open(out_file_name, "w") as out_file:
out_file.write(encrypted_text)
except Exception as e:
showerror("错误", str(e))
def decrypt_file(self):
if not self.file_name.get():
showerror("错误", "请先打开文件")
return
if not self.key.get().isdigit():
showerror("错误", "密钥必须是整数")
return
try:
key = int(self.key.get())
if not self.caesar:
self.caesar = Caesar(key)
decrypted_text = self.caesar.decrypt(self.file_content)
out_file_name = asksaveasfilename()
if out_file_name:
with open(out_file_name, "w") as out_file:
out_file.write(decrypted_text)
except Exception as e:
showerror("错误", str(e))
FileEncryptWindow()