源代码:https://gitee.com/mydreamambitious/file-encryption-and-decryption





注:这个代码和界面是做好的,但是还在进行优化和美化中。但是在加密的时候存在一个问题就是fp.read()读取的问题,如果不加任何的限制的话,如fp.read(size),就是size大小的限制。如果加了size大小读取的限制的话,加密的文件在进行解密时,会出现文件损失,这个原因也是想尽了很多的办法进行解决,但是其中最主要的原因是,对于中文字符的话是占三个字节,采用二进制的读取方式,会导致从中文字符的二进制中间的某个地方进行读取,也就导致读取的中文字符不完整,导致只能进行一次性的读取。但是在解密的时候可以设置读取的文件大小,这是因为在读取加密的文件时,读取的是已经进行二进制转换的文件,所以读取的文件是完整的。其中就是这个问题没有完全的解决,但是对于几百或者几十MB的文件,加密和解密完全没有问题,只是对于上GB的文件,在读取的时对于内存的消耗很大,但是也能读取成功(也就是加密和解密也能成功,但是需要的时间也就更长),当出现提示“文件加密”成功时,加密就完成,解密不用担心,解密的按一定大小的读取,所以不会出现卡顿或者等上的时间更长。

代码的下载可以看前面的连接下载,也可以使用以下的代码运行,一样的代码:
主界面main.py:

import os
import cv2
import tkinter
from CBC_2 import CBCS
from Base64 import BaSe64
from CBC_1 import AES_ENCRYPT
from tkinter import filedialog
from tkinter import simpledialog
from tkinter.messagebox import showwarning,showinfo#主窗口界面
root=tkinter.Tk()
#窗口的大小
root['height']=600
root['width']=800
#界面颜色设置
root['background']='#FFFFFF'
#固定窗口的大小
root.resizable(0,0)
#设置窗口title
root.title('文件加密系统')
#设置窗口图标
#设置标题为图像形式,第一个参数设置为True,表示该图标适用于所有的窗口
#这里注意图像格式为.png,就算是从.jpg到.png的格式转换也不能,只能是.png格式
root.iconphoto(True,tkinter.PhotoImage(file='title.png'))#Base64加密选择文件
def Select_Files_Base64_Encode(root):filename=filedialog.askopenfilename(title='选择加密文件')if filename:# 初始化Base64ba64 = BaSe64(filename,'E',root)ba64.start()else:showwarning(title='警告',message='未选择加密文件')
#Base64解密选择文件
def Select_Files_Base64_Decode(root):filename=filedialog.askopenfilename(title='选择解密文件')if filename:# 初始化Base64ba64 = BaSe64(filename,'D',root)ba64.start()else:showwarning(title='警告',message='未选择解密文件')#CBC_1加密选择文件
def Select_Files_CBC_1_Encode(root):filename=filedialog.askopenfilename(title='选择加密文件')if filename:key=simpledialog.askstring(title='文件加密秘钥',prompt='秘钥输入')if not key:key = '123'showinfo(title='警告', message='系统默认秘钥值')# 初始化CBCcbc64 = AES_ENCRYPT(key=key,filename=filename,flag='E',root=root)cbc64.start()else:showwarning(title='警告',message='未选择加密文件')
#CBC_1解密选择文件
def Select_Files_CBC_1_Decode(root):filename=filedialog.askopenfilename(title='选择解密文件')if filename:key=simpledialog.askstring(title='文件解密秘钥',prompt='秘钥输入')if not key:key = '123'showinfo(title='警告', message='系统默认秘钥值')# 初始化CBCcbc64 = AES_ENCRYPT(key=key, filename=filename, flag='D', root=root)cbc64.start()else:showwarning(title='警告',message='未选择解密文件')#CBC_2加密选择文件
def Select_Files_CBC_2_Encode(root):filename=filedialog.askopenfilename(title='选择加密文件')if filename:key=simpledialog.askstring(title='文件加密秘钥',prompt='秘钥输入')if not key:key = '123'showinfo(title='警告', message='系统默认秘钥值')# 初始化CBC_2cbc64 = CBCS(key=key, filename=filename, flag='E', root=root)cbc64.start()else:showwarning(title='警告',message='未选择加密文件')
#Base64解密选择文件
def Select_Files_CBC_2_Decode(root):filename=filedialog.askopenfilename(title='选择解密文件')if filename:key=simpledialog.askstring(title='文件解密秘钥',prompt='秘钥输入')if not key:key = '123'showinfo(title='警告', message='系统默认秘钥值')# 初始化CBC_2cbc64 = CBCS(key=key, filename=filename, flag='D', root=root)cbc64.start()else:showwarning(title='警告',message='未选择解密文件')def Buttons(root):#这里的cursor样式值指的是当鼠标经过Button时,鼠标显示的样式btn_Base64_encode=tkinter.Button(root,text='Base64加密',font=('黑体',14),width=10,height=1,background='#00FFFF',command=lambda :Select_Files_Base64_Encode(root),cursor='hand2')btn_Base64_encode.place(x=500,y=150)btn_Base64_decode = tkinter.Button(root,text='Base64解密', font=('黑体', 14), width=10, height=1,background='#00FFFF',command=lambda :Select_Files_Base64_Decode(root),cursor='hand2')btn_Base64_decode.place(x=615, y=150)btn_CBC_1_encode = tkinter.Button(root, text='CBC_1_加密', font=('黑体', 14), width=10, height=1,background='#00FF7F',command=lambda :Select_Files_CBC_1_Encode(root),cursor='hand2')btn_CBC_1_encode.place(x=500, y=250)btn_CBC_1_decode = tkinter.Button(root, text='CBC_1_解密', font=('黑体', 14), width=10, height=1,background='#00FF7F',command=lambda :Select_Files_CBC_1_Decode(root),cursor='hand2')btn_CBC_1_decode.place(x=615, y=250)btn_CBC_2_encode = tkinter.Button(root, text='CBC_2_加密', font=('黑体', 14), width=10, height=1,background='#DAA520',command=lambda :Select_Files_CBC_2_Encode(root),cursor='hand2')btn_CBC_2_encode.place(x=500, y=350)btn_CBC_2_decode = tkinter.Button(root, text='CBC_2_解密', font=('黑体', 14), width=10, height=1,background='#DAA520',command=lambda :Select_Files_CBC_2_Decode(root),cursor='hand2')btn_CBC_2_decode.place(x=615, y=350)#退出函数
def Close_Event(root):btn_close=tkinter.Button(root,text='退出',font=('黑体',14),width=10,height=1,command=root.destroy,background='#BDB768',cursor='hand2')btn_close.place(x=615,y=500)if __name__=='__main__':Buttons(root)Close_Event(root)root.mainloop()

加密算法一:Base64加密和解密(模块)

import os
import base64
import win32api
import win32con
import threading
import tkinter.ttk
from time import sleep
from tkinter import scrolledtext
from alive_progress import alive_bar
from tkinter.messagebox import showwarning#读取最大文件大小
MAX_SIZE_FILE=1024*1024#这里最好规定一下文件一次性读取的大小,不然一次性读取容易造成加密和解密的卡顿和程序崩溃class BaSe64(threading.Thread):def __init__(self,filename,flag,root):super(BaSe64, self).__init__()self.base64_encrypt_str=Noneself.filename=filenameself.flag=flagself.__stop=Trueself.present=0self.tips=''#主要用于提示线程是否执行完毕self.error=Falseself.root=root# 判断文件类型的函数def Identity_File_Type(self):type_file = os.path.splitext(self.filename)[1]# print(type_file) #('D:\\A\\test', '.TXT')if type_file == '.TXT' or type_file == '.txt':return 'txt'elif type_file == '.jpg' or type_file == '.JPG':return 'jpg'elif type_file == '.png' or type_file == '.PNG':return 'png'elif type_file == '.zip' or type_file == '.ZIP':return 'zip'elif type_file == '.html' or type_file == '.HTML':return 'html'elif type_file == '.xlsx' or type_file == '.XLSX':return 'xlsx'elif type_file == '.docx' or type_file == '.DOCX':return 'docx'elif type_file == '.doc' or type_file == '.DOC':return 'doc'elif type_file == '.sql' or type_file == '.SQL':return 'sql'elif type_file == '.gif' or type_file == '.GIF':return 'gif'elif type_file == '.htm' or type_file == '.HTM':return 'htm'elif type_file == '.css' or type_file == '.CSS':return 'css'elif type_file == '.js' or type_file == '.JS':return 'js'elif type_file == '.pdf' or type_file == '.PDF':return 'pdf'elif type_file == '.rar' or type_file == '.RAR':return 'rar'def TextT(self):# 实现滚动文本框textlabel = tkinter.Text(self.root, width=45, height=13, font=('黑体', 10))textlabel.place(x=100, y=150)return textlabel#想文本框中写入字符def Write_text(self,textlabel,text):textlabel.insert(tkinter.END,text)def Encoder(self):try:label=tkinter.Label(self.root,text='加密进度:',font=('黑体', 14))label.place(x=110,y=450)progressbar=tkinter.ttk.Progressbar(self.root)progressbar.place(x=200,y=450)#设置进度条最大值为100progressbar['maximum']=100#设置精度条长度progressbar['length']=280#初始化初始值progressbar['value']=0#实现滚动文本框textlabel=self.TextT()# 切分出路径名path_name = os.path.splitext(self.filename)[0]# 切分出文件名file_name = os.path.splitext(self.filename)[1]self.key_file = path_name + '_Base64_key' + file_nametype_file = self.Identity_File_Type()fp = open(self.filename, 'rb')fp_key = open(self.key_file, 'wb')# str_encrypt = fp.read(MAX_SIZE_FILE)file_Size = os.path.getsize(self.filename)print('总的文件大小: ', file_Size)curr_file_size=0flag=False# with alive_bar(total=file_Size) as bar:while True:str_encrypt = fp.read()# self.Write_text(scroll,str_encrypt)# 这里一定要注意,对于判断二进制形式读取文件是否结束要使用b''if str_encrypt == b'':breakupdate_len=len(str_encrypt)curr_file_size += update_lenprogressbar['value']=curr_file_size/file_Size*100# bar(update_len)sleep(0.1)self.root.update()# pbar.update(update_len)# 将字符转换为bytes类型base64_encrypt = base64.b64encode(str_encrypt)# print(type(self.base64_encrypt_str))fp_key.write(base64_encrypt)except IOError as e:self.error=Trueshowwarning(title='警告',message='出现错误')finally:print('加密文件')fp.close()fp_key.close()def Decoder(self):try:label = tkinter.Label(self.root, text='解密进度:', font=('黑体', 14))label.place(x=110, y=450)progressbar = tkinter.ttk.Progressbar(self.root)progressbar.place(x=200, y=450)# 设置进度条最大值为100progressbar['maximum'] = 100# 设置精度条长度progressbar['length'] = 280# 初始化初始值progressbar['value'] = 0# 实现滚动文本框textlabel = self.TextT()# 切分出路径名path_name = os.path.splitext(self.filename)[0]# 切分出文件名file_name = os.path.splitext(self.filename)[1]self.decoder = path_name + '_Base64_Decode' + file_nametype_file = self.Identity_File_Type()fp = open(self.decoder, 'wb')fp_key = open(self.filename, 'rb')file_Size = os.path.getsize(self.filename)curr_file_size=0# with alive_bar(total=file_Size) as bar:while True:base64_encrypt_str = fp_key.read(MAX_SIZE_FILE)# self.Write_text(textlabel,base64_encrypt_str)# textlabel.update()# #这里一定要注意,对于判断二进制形式读取文件是否结束要使用b''if base64_encrypt_str==b'':breakupdate_len = len(base64_encrypt_str)curr_file_size += update_lenprogressbar['value']=curr_file_size/file_Size*100# bar(update_len)sleep(0.01)self.root.update()# pbar.update(update_len)if not os.path.exists(self.decoder):print('文件没有打开')# 将字节型转换为字符型self.str_decrypt = base64.b64decode(base64_encrypt_str)# print(self.str_decrypt)# print('写入文件大小: ',len(self.str_decrypt))fp.write(self.str_decrypt)# print('解密文件')# fp.close()# fp_key.close()except IOError as e:self.error=Trueshowwarning(title='警告', message='出现错误')finally:print('解密文件')fp.close()fp_key.close()def run(self):if self.flag=='E' and self.__stop is True:self.Encoder()self.__stop=Falseself.tips='E'self.Tips()print('run')returnelif self.flag=='D' and self.__stop is True:self.Decoder()self.__stop=Falseself.tips='D'self.Tips()print('run')returndef Tips(self):if self.tips=='E' and self.error==False:# choise=win32api.MessageBox(0,'文件加密成功','提示',win32con.MB_YESNOCANCEL)choise = win32api.MessageBox(0, '文件加密成功', '提示', win32con.MB_OK)# choise = win32api.MessageBox(0, '文件加密成功', '提示', win32con.MB_ICONHAND)elif self.tips=='D' and self.error==True:choise = win32api.MessageBox(0, '文件解密成功', '提示', win32con.MB_OK)if __name__=='__main__':print('请输入要加密的文件路径: ')filename=input()Base=BaSe64()Base.Encoder(filename)key_path='D:\\Base64_Base64_key.TXT'Base.Decoder(key_path)# D:\\test1.TXT

加密算法二:CBC加密和解密(模块)

import os
import base64
import tkinter
import win32api
import win32con
import threading
from tkinter import ttk
from time import sleep
from Crypto.Cipher import AES
from alive_progress import alive_bar
from Crypto.Util.Padding import pad
from tkinter.messagebox import showwarningMAX_SIZE_FILE=1024*1024#这里最好规定一下文件一次性读取的大小,不然一次性读取容易造成加密和解密的卡顿和程序崩溃
AES_SECRET_KEY = 'helloBrook2abcdehelloBrook2abcde'  # 此处16|24|32个字符
IV = 'helloBrook2abcde'# padding算法
BS = len(AES_SECRET_KEY)
# pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS)
unpad = lambda s: s[0:-ord(s[-1:])]class AES_ENCRYPT(threading.Thread):def __init__(self,key,flag,filename,root):# self.key = AES_SECRET_KEYsuper(AES_ENCRYPT, self).__init__()self.key=keyself.mode = AES.MODE_CBCself.filename=filenameself.flag=flag#用于判断是否加密还是解密,便于线程的运行self.present=0self.tips=''#用于弹出提示,判断文件加密和解密是否成功self.error=Falseself.root=rootdef add_to_16(self, s):while len(s) % 16 != 0:s += '\0'return str.encode(s)  # 返回bytes# 判断文件类型的函数def Identity_File_Type(self):type_file = os.path.splitext(self.filename)[1]# print(type_file) #('D:\\A\\test', '.TXT')if type_file == '.TXT' or type_file == '.txt':return 'txt'elif type_file == '.jpg' or type_file == '.JPG':return 'jpg'elif type_file == '.png' or type_file == '.PNG':return 'png'elif type_file == '.zip' or type_file == '.ZIP':return 'zip'elif type_file == '.html' or type_file == '.HTML':return 'html'elif type_file == '.xlsx' or type_file == '.XLSX':return 'xlsx'elif type_file == '.docx' or type_file == '.DOCX':return 'docx'elif type_file == '.doc' or type_file == '.DOC':return 'doc'elif type_file == '.sql' or type_file == '.SQL':return 'sql'elif type_file == '.gif' or type_file == '.GIF':return 'gif'elif type_file == '.htm' or type_file == '.HTM':return 'htm'elif type_file == '.css' or type_file == '.CSS':return 'css'elif type_file == '.js' or type_file == '.JS':return 'js'elif type_file == '.pdf' or type_file == '.PDF':return 'pdf'elif type_file == '.rar' or type_file == '.RAR':return 'rar'elif type_file == '.rmvb' or type_file == '.RMVB':return 'rmvb'def TextT(self):# 实现滚动文本框textlabel = tkinter.Text(self.root, width=45, height=13, font=('黑体', 10))textlabel.place(x=100, y=150)return textlabel#想文本框中写入字符def Write_text(self,textlabel,text):textlabel.insert(tkinter.END,text)# 加密函数def Encoder(self):try:label = tkinter.Label(self.root, text='加密进度:', font=('黑体', 14))label.place(x=110, y=450)progressbar = ttk.Progressbar(self.root)progressbar.place(x=200, y=450)# 设置进度条最大值为100progressbar['maximum'] = 100# 设置精度条长度progressbar['length'] = 280# 初始化初始值progressbar['value'] = 0#实现多行文本框textlabel=self.TextT()# 切分出路径名path_name = os.path.splitext(self.filename)[0]# 切分出文件名file_name = os.path.splitext(self.filename)[1]self.key_file = path_name + '_CBC_First_key' + file_nametype_file=self.Identity_File_Type()fp = open(self.filename, 'rb')key_file = open(self.key_file, 'wb')file_Size = os.path.getsize(self.filename)print('总的文件大小: ', file_Size)# with tqdm(total=file_Size) as pbar:# with alive_bar(file_Size) as bar:curr_file_size=0while True:text = fp.read()if text == b'':breakupdate_len = len(text)curr_file_size += update_lenprogressbar['value'] = curr_file_size / file_Size * 100# bar(update_len)sleep(0.01)self.root.update()# pbar.update(update_len)key = self.add_to_16(self.key)cryptor = AES.new(key, self.mode, IV.encode("utf8"))self.ciphertext = cryptor.encrypt((pad(text, BS)))# AES加密时候得到的字符串不一定是ascii字符集的,输出到终端或者保存时候可能存在问题,使用base64编码# print(base64.b64encode(self.ciphertext).decode("utf-8"))key_file.write(base64.b64encode(self.ciphertext))except IOError as e:self.error=Trueshowwarning(title='警告', message='出现错误')finally:fp.close()key_file.close()# 解密函数def Decoder(self):try:label = tkinter.Label(self.root, text='解密进度:', font=('黑体', 14))label.place(x=110, y=450)progressbar = ttk.Progressbar(self.root)progressbar.place(x=200, y=450)# 设置进度条最大值为100progressbar['maximum'] = 100# 设置精度条长度progressbar['length'] = 280# 初始化初始值progressbar['value'] = 0# 实现多行文本框textlabel = self.TextT()# 切分出路径名path_name = os.path.splitext(self.filename)[0]# 切分出文件名file_name = os.path.splitext(self.filename)[1]self.decoder = path_name + '_CBC_First_Decode' + file_nametype_file=self.Identity_File_Type()fp = open(self.decoder, 'wb')fp_key = open(self.filename, 'rb')file_Size = os.path.getsize(self.filename)print('总的文件大小: ', file_Size)# with tqdm(total=file_Size) as pbar:curr_file_size=0# with alive_bar(file_Size) as bar:while True:text = fp_key.read(MAX_SIZE_FILE)if text == b'':breakupdate_len = len(text)curr_file_size += update_lenprogressbar['value']=curr_file_size/file_Size*100# bar(update_len)sleep(0.01)self.root.update()# pbar.update(update_len)key = self.add_to_16(self.key)decode = base64.b64decode(text)cryptor = AES.new(key, self.mode, IV.encode("utf8"))plain_text = cryptor.decrypt(decode)# print(unpad(plain_text))fp.write(plain_text)except IOError as e:self.error=Trueshowwarning(title='警告', message='出现错误')finally:fp.close()fp_key.close()def run(self):if self.flag=='E':self.Encoder()self.tips='E'self.Tips()elif self.flag=='D':self.Decoder()self.tips='D'self.Tips()def Tips(self):if self.tips == 'E' and self.error==False:# choise=win32api.MessageBox(0,'文件加密成功','提示',win32con.MB_YESNOCANCEL)choise = win32api.MessageBox(0, '文件加密成功', '提示', win32con.MB_OK)# choise = win32api.MessageBox(0, '文件加密成功', '提示', win32con.MB_ICONHAND)elif self.tips == 'D' and self.error==False:choise = win32api.MessageBox(0, '文件解密成功', '提示', win32con.MB_OK)
if __name__ == '__main__':print('请输入解密文件路径: ')filename=input()aes_encrypt = AES_ENCRYPT()aes_encrypt.Encoder(filename)aes_encrypt.Decoder('D:\\CBC(1)key_file.TXT')

加密算法三:CBC改进加密和解密(模块)

import os
import tkinter
import win32api
import win32con
import threading
from tkinter import ttk
from time import sleep
from Crypto.Cipher import AES
from alive_progress import alive_bar
from Crypto.Util.Padding import pad
from tkinter.messagebox import showwarning
MAX_SIZE_FILE=1024*1024#这里最好规定一下文件一次性读取的大小,不然一次性读取容易造成加密和解密的卡顿和程序崩溃
class CBCS(threading.Thread):# # 一旦加密和解密函数执行完毕之后就触发信号# Encoder_trigger = pyqtSignal(str)# Decoder_trigger=pyqtSignal(str)def __init__(self, key,flag,filename,root):super(CBCS, self).__init__()self.base64_encrypt_str = Noneself.key=keyself.flag=flagself.filename=filenameself.present=0self.tips=''self.error=Falseself.root=rootdef add_to_16(self,s):while len(s) % 16 != 0:s += '\0'return str.encode(s)  # 返回bytes# 判断文件类型的函数def Identity_File_Type(self):type_file = os.path.splitext(self.filename)[1]# print(type_file) #('D:\\A\\test', '.TXT')if type_file == '.TXT' or type_file == '.txt':return 'txt'elif type_file == '.jpg' or type_file == '.JPG':return 'jpg'elif type_file == '.png' or type_file == '.PNG':return 'png'elif type_file == '.zip' or type_file == '.ZIP':return 'zip'elif type_file == '.html' or type_file == '.HTML':return 'html'elif type_file == '.xlsx' or type_file == '.XLSX':return 'xlsx'elif type_file == '.docx' or type_file == '.DOCX':return 'docx'elif type_file == '.doc' or type_file == '.DOC':return 'doc'elif type_file == '.sql' or type_file == '.SQL':return 'sql'elif type_file == '.gif' or type_file == '.GIF':return 'gif'elif type_file == '.htm' or type_file == '.HTM':return 'htm'elif type_file == '.css' or type_file == '.CSS':return 'css'elif type_file == '.js' or type_file == '.JS':return 'js'elif type_file == '.pdf' or type_file == '.PDF':return 'pdf'elif type_file == '.rar' or type_file == '.RAR':return 'rar'elif type_file == '.rmvb' or type_file == '.RMVB':return 'rmvb'def TextT(self):# 实现滚动文本框textlabel = tkinter.Text(self.root, width=45, height=13, font=('黑体', 10))textlabel.place(x=100, y=150)return textlabel#想文本框中写入字符def Write_text(self,textlabel,text):textlabel.insert(tkinter.END,text)def Encoder(self):try:label = tkinter.Label(self.root, text='加密进度:', font=('黑体', 14))label.place(x=110, y=450)progressbar = ttk.Progressbar(self.root)progressbar.place(x=200, y=450)# 设置进度条最大值为100progressbar['maximum'] = 100# 设置精度条长度progressbar['length'] = 280# 初始化初始值progressbar['value'] = 0#实现多行文本框textlabel=self.TextT()# 切分出路径名path_name = os.path.splitext(self.filename)[0]# 切分出文件名file_name = os.path.splitext(self.filename)[1]self.key_file = path_name + '_CBC_key' + file_nametype_file=self.Identity_File_Type()print('正在进行中...')fp = open(self.filename, 'rb')fp_key = open(self.key_file, 'wb')# 需要补位,补足为16的倍数# block_size补充为16的整数BLOCK_SIZE = 32file_Size = os.path.getsize(self.filename)print('总的文件大小: ', file_Size)# with tqdm(total=file_Size) as pbar:# with alive_bar(file_Size) as bar:curr_file_size=0while True:str_encrypt = fp.read()if str_encrypt==b'':breakupdate_len = len(str_encrypt)curr_file_size += update_lenprogressbar['value']=curr_file_size/file_Size*100# bar(update_len)sleep(0.01)self.root.update()# pbar.update(update_len)# 密钥长度必须为16、24或32位,分别对应AES-128、AES-192和AES-256key = self.key# 初始化加密器aes = AES.new(self.add_to_16(key), AES.MODE_ECB)# 加密 这个地方的pad(str_encrypt.encode(),BLOCK_SIZE)要非常的注意str_encrypt必须编码为bytes类型#特别要注意这个地方的CBC加密方式,可以先CBC加密再使用base64进行第二次加密# encrypted_text = str(base64.encodebytes(aes.encrypt(pad(str_encrypt.encode(), BLOCK_SIZE))), \#                      encoding='utf8').replace('\n', '')encrypted_text = aes.encrypt(pad(str_encrypt, BLOCK_SIZE))# print('加密值:', encrypted_text)fp_key.write(encrypted_text)# fp.close()# fp_key.close()except IOError as e:self.error=Trueshowwarning(title='警告', message='出现错误')finally:fp.close()fp_key.close()def Decoder(self):try:label = tkinter.Label(self.root, text='解密进度:', font=('黑体', 14))label.place(x=110, y=450)progressbar = ttk.Progressbar(self.root)progressbar.place(x=200, y=450)# 设置进度条最大值为100progressbar['maximum'] = 100# 设置精度条长度progressbar['length'] = 280# 初始化初始值progressbar['value'] = 0# 实现多行文本框textlabel = self.TextT()# 切分出路径名path_name = os.path.splitext(self.filename)[0]# 切分出文件名file_name = os.path.splitext(self.filename)[1]self.decoder = path_name + '_CBC_Decode' + file_nametype_file=self.Identity_File_Type()# 解密fp = open(self.decoder, 'wb')fp_key = open(self.filename, 'rb')file_Size = os.path.getsize(self.filename)print('总的文件大小: ', file_Size)print('正在进行中...')# with tqdm(total=file_Size) as pbar:# with alive_bar(file_Size) as bar:curr_file_size=0while self.present <= file_Size:encrypted_text = fp_key.read(MAX_SIZE_FILE)if encrypted_text==b'':breakupdate_len = len(encrypted_text)curr_file_size += update_lenprogressbar['value']=curr_file_size/file_Size*100# bar(update_len)sleep(0.01)self.root.update()# pbar.update(update_len)key = self.keyaes = AES.new(self.add_to_16(key), AES.MODE_ECB)#注意这里的encrypted_text已经是经过编码格式过了,不需要再编码# 特别要注意这个地方的CBC解密方式,可以先base64解密之后再使用CBC进行第二次解密# decrypted_text = str(#     aes.decrypt(base64.decodebytes(bytes(encrypted_text, encoding='utf8'))).#         rstrip(b'\0').decode("utf8"))decrypted_text = (aes.decrypt((encrypted_text)))# print('解密值:\n', decrypted_text)fp.write(decrypted_text)except IOError as e:self.error=Trueshowwarning(title='警告', message='出现错误')finally:fp.close()fp_key.close()def run(self):if self.flag=='E':self.Encoder()self.tips='E'self.Tips()elif self.flag=='D':self.Decoder()self.tips='D'self.Tips()def Tips(self):if self.tips == 'E' and self.error==False:# choise=win32api.MessageBox(0,'文件加密成功','提示',win32con.MB_YESNOCANCEL)choise = win32api.MessageBox(0, '文件加密成功', '提示', win32con.MB_OK)# choise = win32api.MessageBox(0, '文件加密成功', '提示', win32con.MB_ICONHAND)elif self.tips == 'D' and self.error==False:choise = win32api.MessageBox(0, '文件解密成功', '提示', win32con.MB_OK)if __name__=='__main__':print('请输入要加密的文件路径: ')filename = input()cbc = CBCS('123')filename='D:\\1.jpg'cbc.Encoder(filename)cbc.Decoder("D:\\1_CBC_key.TXT")# D:\\test1.TXT

如果读者能够对其中的代码进行改进,这样最好。
如果代码中存在什么问题,望指教。

tkinter实现文件加密和解密相关推荐

  1. Java基础篇之利用IO流给文件加密、解密

    目标:给文件加密.解密(最基础版) 注意: a.加密过程:先读取整个目标文件,然后将目标文件写入一个新的文件中,在写入的过程中,每隔几个字符插入一个加密符号(随意定),此时这个新的文件就是加密文件 b ...

  2. (C语言)简单的文件加密和解密程序

    一个简单的文件加密和解密程序 main.c #include <stdio.h> #include <stdlib.h> #include "fun.h"i ...

  3. 文件加密和解密 - 密钥存储

    当我们想要做一次加密系统,或者只是有一个关于这个问题,它是如何保存的加密和解密密钥. 一般认为想要的文件加密和解密,对称算法用于.一般是AES要么DES. 这就存在密钥管理的问题,它是如何? 基本上两 ...

  4. Linux下使用Vim/Vi给文件加密和解密

    本文介绍在Linux下使用Vim/Vi给文件加密和解密的简单方法,Vim的文件加密功能不是很强,但比较实用,因为不必要借助其他软件即可实现. 一. 用 Vim/Vi 加密文件: 用 Vim/Vi 加密 ...

  5. 文件加密和解密软件:AutoCrypt for mac

    为大家推荐一款好用的文件加密和解密软件,AutoCrypt for mac具备强大的AES-256算法,只需点击一下,即可加密并保存在自定义位置,能够轻松帮助用户加密或解密文件,而且autocrypt ...

  6. 文件加密及解密openssl

    Openssl是一个开源的用以实现SSL协议的产品,它主要包括了三个部分:密码算法库.应用程序.SSL协议库.Openssl实现了SSL协议所需要的大多数算法. 下面我将单介绍使用Openssl进行文 ...

  7. MD5文件加密和解密

    举个例子: import java.awt.*; import java.awt.event.*;import java.io.*;import java.security.*;import java ...

  8. c语言 文件加密与解密

    本程序是一个c语言的大作业的一部分 是简单的基于给定密钥实现的加密解密程序 希望能给后来人一些参考 文件的传输会有明文和密文的区别,明文发送是不安全的.本题目实现对文件的加密和解密操作,采用的加密算法 ...

  9. Python 对json文件加密和解密

    #!/usr/bin/env python # -*-coding:utf-8-*-""" # File : Json文件加密解密.py # Time :2022/6/3 ...

最新文章

  1. sql列转行函数oracle,SQL列转行
  2. SAP MM 外部采购流程里的Advanced Return Management
  3. php 5.3.3 漏洞,PHP 5.3.10多个拒绝服务漏洞
  4. 产品开发过程问题及解决方案汇总
  5. linux samba服务器
  6. Linux USB 驱动开发实例 (三)—— 基于USB总线的无线网卡浅析
  7. C语言字母的压缩,C语言字符串快速压缩算法代码
  8. 统计学习方法读书笔记3-感知机SVM
  9. 基于webpack工程化的思考
  10. Vivado HLS教程
  11. 计算机显示器刷新率怎么调,电脑显示器刷新率如何设置,免费教你如何快手设置刷新率...
  12. 74ls20设计半加器_组合逻辑电路(半加器全加器及逻辑运算)实验报告
  13. 小公司需要企业邮箱么?小企业用什么企业邮箱?
  14. 植树节的微信软文如何写?素材加文案帮你分分钟搞定!
  15. Git新手入门视频教程
  16. 如何像Python高手(Pythonista)一样编程
  17. 探究添加水印的多种方式
  18. Python中动态编译函数compile(source, filename, mode, ......)参数filename的作用是什么?...
  19. 2021象山中学高考成绩查询,2019年象山中学高考喜报、二本上线人数1424人
  20. python坐标表示_已知经纬度坐标求两点间距离,用python表示

热门文章

  1. 操作系统学习:系统调用与Linux0.12初始化详细流程
  2. TCP流量控制-TCP拥塞控制 拥塞控制与流量控制的区别
  3. 【最新专升本】软件工程试题及答案_
  4. 网络工程师_想要记录下来的一些题_2
  5. 注意力机制原理及其模型发展和应用
  6. 背包思想计算方案的总数(货币系统)
  7. vue - config(index.js)
  8. python面向对象编程 -- 封装、继承
  9. Unity3D是怎么提升游戏运行效率的?
  10. [译] 数据可视化教程:基于Google Sheets 和 RStudio Shiny 建立实时仪表盘