Python实现文件访问和加密
简单的文本文件加密和解密的GUI应用程序,实现了一个简单的凯撒密码加密和解密算法
运行效果
1.实现UI界面
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yG28ajb1-1720676735133)(https://i-blog.csdnimg.cn/direct/e5130309995b46279478a09dd013c689.png)]
2.打开原始文件,显示的文件名和文件内容正确。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QhQldndf-1720676735135)(https://i-blog.csdnimg.cn/direct/cd86486c99fd4250bd37fc7d89302ffb.png)]
3. 对照原始文件,加密文件正确
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V1pBHV4D-1720676735136)(https://i-blog.csdnimg.cn/direct/6e6b8a4bd0fe4d5bb280b5923f003047.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qekLqZO3-1720676735136)(https://i-blog.csdnimg.cn/direct/60a3b76e467d4d80b488498f2695cd68.png)]
4. 对照原始文件,解密文件一致
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5xguLPdD-1720676735137)(https://i-blog.csdnimg.cn/direct/7098e13c57e14097bf47933c7cf6a8f7.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Shk3FOQl-1720676735138)(https://i-blog.csdnimg.cn/direct/a21a85c406384c1cbe4a6b55d3babca9.png)]
5.测试使用不同的秘钥进行加密解密,结果正确
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vXF6sfK7-1720676735138)(https://i-blog.csdnimg.cn/direct/079dcb23a6454d7cb32778fa93fd8907.png)]
6. 对程序进行错误测试
6.1 没有打开文件直接进行加密,程序不应崩溃。
6.2 没有打开文件直接进行解密,程序不应崩溃。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nn4VMZwl-1720676735139)(https://i-blog.csdnimg.cn/direct/5ee623222a62464c867c57d42ab3ae12.png)]
6.3 没有设定秘钥直接进行加密,程序不应崩溃。
6.4 没有设定秘钥直接进行解密,程序不应崩溃。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g3dPN9bk-1720676735139)(https://i-blog.csdnimg.cn/direct/aeb6b2e4fa794dfab70def9f1d5b8b30.png)]
6.5 秘钥设定错误,进行加密,程序不应崩溃。
6.6 秘钥设定错误,进行解密,程序不应崩溃。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HD2QHdUp-1720676735141)(https://i-blog.csdnimg.cn/direct/4ae9ce7dd9534ea093f7f78fa84a2a46.png)]
代码
导入必要的库和模块
from tkinter import *:导入Tkinter库,这是Python的标准GUI库。
from tkinter.filedialog import askopenfilename, asksaveasfilename:导入Tkinter库中用于选择文件和保存文件的对话框功能。
from Caesar import Caesar:导入自定义的Caesar密码算法类。
FileEncryptWindow类:
创建了Tkinter窗口并添加了两个Frame容器,分别用于文件名输入和密钥输入。
在文件名输入区域,有一个Entry控件用于显示选择的文件名,以及一个"打开"按钮触发openFile方法来选择要加密/解密的文件。
在密钥输入区域,有一个Entry控件用于输入密钥(默认为3),以及"加密"和"解密"按钮分别触发encryptFile和decryptFile方法。
在窗口底部,有一个Text控件用于显示文件的内容。
class FileEncryptWindow():
def __init__(self):
window = Tk()
frame1 = Frame(window)
frame1.pack()
labelFileName = Label(frame1, text="文件名:", )
labelFileName.grid(row=0, column=0)
self.fileName = StringVar()
entryFileName = Entry(frame1, width=100, textvariable=self.fileName)
entryFileName.grid(row=0, column=1)
btnOpen = Button(frame1, text="打开", command=self.openFile)
btnOpen.grid(row=0, column=2)
frame2 = Frame(window)
frame2.pack()
labelKey = Label(frame2, text="密钥:", )
labelKey.grid(row=1, column=0)
self.key = StringVar()
entryKey = Entry(frame2, textvariable=self.key)
self.key.set("3")
entryKey.grid(row=1, column=1)
btnEncrypt = Button(frame2, text="加密", command=self.encryptFile)
btnEncrypt.grid(row=1, column=2)
btnDecrypt = Button(frame2, text="解密", command=self.decryptFile)
btnDecrypt.grid(row=1, column=3)
self.text = Text(window)
self.text.pack()
window.mainloop()
def openFile(self):
inFileName = askopenfilename()
inFile = open(inFileName, "r")
self.fileName.set(inFileName)
self.fileContext = inFile.read()
self.text.delete(1.0, END)
self.text.insert(END, self.fileContext)
inFile.close()
def encryptFile(self):
key = eval(self.key.get())
caesar = Caesar(key)
encryptStr = caesar.encrypt(self.fileContext)
outfileName = asksaveasfilename()
outFile = open(outfileName, "w")
outFile.write(encryptStr)
outFile.close()
def decryptFile(self):
key = eval(self.key.get())
caesar = Caesar(key)
decryptStr = caesar.decrypt(self.fileContext)
outfileName = asksaveasfilename()
outFile = open(outfileName, "w")
outFile.write(decryptStr)
outFile.close()
Caesar类
Caesar类提供了一个基本的凯撒密码加密和解密功能,可以与前面介绍的GUI应用程序一起使用。用户只需要输入密钥,就可以对文件内容进行加密和解密操作
- encrypt(self, Text):实现对输入文本Text的加密。遍历输入文本的每个字符,如果字符在self.biao中出现,则找到该字符在self.biao中的索引位置。然后将该索引加上密钥self.miyao,并对字符集长度取余,得到密文字符在self.biao中的新索引。最后,将新索引对应的字符添加到cipText字符串中,形成最终的密文。返回加密后的密文字符串。
- decrypt(self, cipText):实现了对输入密文cipText的解密。与encrypt方法类似,但是将索引减去密钥self.miyao,而不是加上。解密时,同样对字符集长度取余,得到明文字符在self.biao中的索引。将明文字符添加到clearText字符串中,形成最终的明文。方法返回解密后的明文字符串。
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
调用方法
# 创建Caesar类的实例,密钥为3
caesar = Caesar(3)
# 加密文本"Hello, world!"
encrypted_text = caesar.encrypt("Hello, world!")
print("Encrypted text:", encrypted_text)
# 解密密文
decrypted_text = caesar.decrypt(encrypted_text)
print("Decrypted text:", decrypted_text)
总代码
from tkinter import *
from tkinter.filedialog import askopenfilename
from tkinter.filedialog import asksaveasfilename
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):
window = Tk()
frame1 = Frame(window)
frame1.pack()
labelFileName = Label(frame1, text="文件名:", )
labelFileName.grid(row=0, column=0)
self.fileName = StringVar()
entryFileName = Entry(frame1, width=100, textvariable=self.fileName)
entryFileName.grid(row=0, column=1)
btnOpen = Button(frame1, text="打开", command=self.openFile)
btnOpen.grid(row=0, column=2)
frame2 = Frame(window)
frame2.pack()
labelKey = Label(frame2, text="密钥:", )
labelKey.grid(row=1, column=0)
self.key = StringVar()
entryKey = Entry(frame2, textvariable=self.key)
self.key.set("3")
entryKey.grid(row=1, column=1)
btnEncrypt = Button(frame2, text="加密", command=self.encryptFile)
btnEncrypt.grid(row=1, column=2)
btnDecrypt = Button(frame2, text="解密", command=self.decryptFile)
btnDecrypt.grid(row=1, column=3)
self.text = Text(window)
self.text.pack()
window.mainloop()
def openFile(self):
inFileName = askopenfilename()
inFile = open(inFileName, "r")
self.fileName.set(inFileName)
self.fileContext = inFile.read()
self.text.delete(1.0, END)
self.text.insert(END, self.fileContext)
inFile.close()
def encryptFile(self):
key = eval(self.key.get())
caesar = Caesar(key)
encryptStr = caesar.encrypt(self.fileContext)
outfileName = asksaveasfilename()
outFile = open(outfileName, "w")
outFile.write(encryptStr)
outFile.close()
def decryptFile(self):
key = eval(self.key.get())
caesar = Caesar(key)
decryptStr = caesar.decrypt(self.fileContext)
outfileName = asksaveasfilename()
outFile = open(outfileName, "w")
outFile.write(decryptStr)
outFile.close()
FileEncryptWindow()
点击"打开"按钮,选择要加密或解密的文件。
在密钥输入框中输入密钥值(默认为3)。
点击"加密"或"解密"按钮,输出文件将被保存到用户选择的路径