python-GUI-pyqt5之文件加密解密工具
pyqt5的文件加密解密程序,用到base64,rsa和aes进行混合解密,代码比较杂乱,可自行整理,仅供学习参考之用,如需转载,请联系博主或附上博客链接,下面直接干货。
程序截图如下:
# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'hellopyqt5.ui'
#
# Created by: PyQt5 UI code generator 5.11.3
#
# WARNING! All changes made in this file will be lost!
# -*- coding: utf-8 -*-
# coding: utf-8
import os
import sys
import zlib
import time
import random
from os import path
from PIL import Image
from glob import glob
from PyQt5.QtGui import QIcon
from PyQt5.QtGui import QFont
from PyQt5.QtWidgets import QPushButton
from PyQt5.QtWidgets import QFileDialog
from PyQt5.QtWidgets import QMessageBox
from PyQt5.QtWidgets import QMainWindow
from PyQt5.QtWidgets import QFrame
from PyQt5.QtWidgets import QWidget
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import QThread
from PyQt5.QtCore import pyqtSignal
from PyQt5 import QtWidgets, QtCore
from PyQt5.QtGui import QIcon,QColor,QPainter,QFontMetricsF,QDrag
from PyQt5.QtCore import (QByteArray, QDataStream, QIODevice, QMimeData,QPoint, QSize, Qt)
from Crypto.Cipher import AES
import base64
import json
import codecs
import time
from Crypto import Random
from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5
from Crypto.PublicKey import RSA
from PIL import Image as ImagePIL, ImageFont, ImageDraw
#随机16位AES密钥
AES_SECRET_KEY = ''.join(random.sample('1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', 16))
#随机16位填充码
IV = ''.join(random.sample('1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', 16))
class AESCrypt:
def __init__(self):
self.key =AES_SECRET_KEY #只截取16位
self.iv = IV# 16位字符,用来填充缺失内容,可固定值也可随机字符串,具体选择看需求。
self.mode=AES.MODE_CBC
#CBC好像对中文支持不太好
#self.mode=AES.MODE_EBC def __pad(self, text):
"""填充方式,加密内容必须为16字节的倍数,若不足则使用self.iv进行填充"""
text_length = len(text)
amount_to_pad = AES.block_size - (text_length % AES.block_size)
if amount_to_pad == 0:
amount_to_pad = AES.block_size
pad = chr(amount_to_pad)
return text + pad * amount_to_pad def __unpad(self, text):
pad = ord(text[-1])
return text[:-pad] def encrypt(self, raw):
"""加密"""
raw = self.__pad(raw)
cipher = AES.new(str.encode(self.key),self.mode,str.encode(self.iv))
# msg=cipher.encrypt(str.encode(raw))
return base64.b64encode(cipher.encrypt(str.encode(raw))) def decrypt(self, enc):
"""解密"""
enc = base64.b64decode(enc)
cipher = AES.new(str.encode(self.key),self.mode,str.encode(self.iv))
return self.__unpad(cipher.decrypt(enc).decode("utf-8")) def change(c):
#返回字母数字的对应的 ASCII 数值
num = ord(c)
#a的ansii为97,z为122,a~z
if num >= 97 and num <= 120:
num = 97 + ((num - 97) + 2)
#chr返回10进制数字对应的ansii值,也可返回16进制
return chr(num) def dechange(c):
num = ord(c)
if num >= 97 and num <= 122:
num = (num - 97) + 95
#返回字母数字的对应的 ASCII 数值
return chr(num) #选择文件加密按钮,支持拖动文件
class Button(QPushButton):
def __init__(self, title, parent):
super().__init__(title, parent)
self.setAcceptDrops(True) droppath=str(23)
def dragEnterEvent(self, event):
global droppath
try:
#label4显示
ui.label_4.setVisible(True)
#避免重复点击,按钮置为不可用
ui.pushButton_3.setEnabled(False)
ui.pushButton_4.setEnabled(False)
ui.pushButton.setEnabled(False)
ui.pushButton_2.setEnabled(False)
ui.pushButton_6.setEnabled(False)
droppath=event.mimeData().text()
droppath=str(droppath.replace(r'file:///',r'')).replace(r'/',r'\\')
#print(droppath)
f=os.path.splitext(droppath)
#鼠标放开函数事件
event.accept()
except Excetion as e:
print(e) # 鼠标放开执行
def dropEvent(self, evn):
try:
global timedrop
try:
filepath2 = droppath.replace(r'/',r'\\')
print(filepath2)
if filepath2 != '':
try:
start=time.time()
file = open(filepath2,'rb').read()
file_len = len(file)
default_length = 200
# 伪随机数生成器
random_generator = Random.new().read
# rsa算法生成实例
rsa = RSA.generate(2048, random_generator)
#公钥加密,也生成文件吧
rsa_public_key = rsa.publickey().exportKey()
#公钥加密
rsakey = RSA.importKey(rsa_public_key)
cipher = Cipher_pkcs1_v1_5.new(rsakey)
# 密钥key生成
rsa_private_key = rsa.exportKey()
keypath = filepath2
f=os.path.splitext(keypath)
newname = f[0] + 'secure'
newname = newname+ '.key'
with open(newname, 'wb') as f:
f.write(rsa_private_key)
time.sleep(0.1)
#self.rsignal.emit(str(int(10)))
#长度不用分段
if file_len < default_length:
stringrsa = base64.b64encode(cipher.encrypt(file))
else:
#需要分段
offset = 0
res = []
count = 0
while file_len - offset > 0:
if file_len - offset > default_length:
res.append(cipher.encrypt(file[offset:offset+default_length]))
else:
res.append(cipher.encrypt(file[offset:]))
offset += default_length
count = count + 1 #print('计数分段次数:'+ str(count))
time.sleep(0.1)
#ui.rsignal.emit(str(int(60)))
#stringrsa = ''
stringrsa = b''.join(res)
stringrsa = base64.b64encode(stringrsa)
#ui.rsignal.emit(str(int(90)))
#下面进行AES加密
stringaes = AESCrypt()
stringaes_comp = stringaes.encrypt(str(stringrsa))
defilepath = filepath2
ft=os.path.splitext(defilepath)
newjiami = ft[0] + '-已加密'
newjiami = newjiami+ ft[1]
with open(newjiami,'wb') as f:
f.write(stringaes_comp)
print('加密成功')
time.sleep(0.1)
#ui.rsignal.emit(str(int(100)))
end=time.time()
timedrop=(format(float(end-start),'.2f'))
except Exception as e:
print(e)
#ui.stop()
except Exception as e:
print(e)
QMessageBox.information(self,"已完成!", "已成功加密文件到原有目录。" + '\n' +'共耗时:'+str(timedrop)+' '+'秒',QMessageBox.Yes)
ui.pushButton_3.setEnabled(True)
ui.pushButton_4.setEnabled(True)
ui.pushButton.setEnabled(True)
ui.pushButton_2.setEnabled(True) #label4隐藏
ui.label_4.setVisible(False)
#self.pushButton_4.setVisible(False)
ui.pushButton_6.setEnabled(True)
except Exception as e:
print(e) def dragMoveEvent(self,evn):
pass
#print('鼠标移入') #可自行增加选择文件加拖动功能 class Button2(QPushButton):
def __init__(self, title, parent):
super().__init__(title, parent)
self.setAcceptDrops(True) droppath2=str(23)
def dragEnterEvent(self, event):
if 1==1:
QMessageBox.information(ui,"提示", "不支持拖拽文件!",QMessageBox.Yes)
# 鼠标放开执行
def dropEvent(self, evn):
try:
pass#ui.label_6.setText(dropfile)
except Exception as e:
print(e) def dragMoveEvent(self,evn):
pass
#print('鼠标移入') #可自行增加选择key加拖动功能 class Button3(QPushButton):
def __init__(self, title, parent):
super().__init__(title, parent)
self.setAcceptDrops(True) #droppath2=str(23)
def dragEnterEvent(self, event):
#global dropkey
try:
if 1==1:
QMessageBox.information(ui,"提示", "不支持拖拽文件!",QMessageBox.Yes)
event.accept() except Excetion as e:
print(e) # 鼠标放开执行
def dropEvent(self, evn):
try:
pass#event.accept()
except Exception as e:
print(e) def dragMoveEvent(self,evn):
pass
#print('鼠标移入')
#播放音乐类
#openpic类
class Runthreadmusic(QtCore.QThread):
# 通过类成员对象定义信号对象
rsignal = pyqtSignal(str)
def __init__(self):
super(Runthreadmusic, self).__init__()
self.flag = 1 def __del__(self):
self.wait() def stop(self):
self.flag=0
print('线程退出了') def run(self):
if self.flag==1:
try:
musicfile=musicpath[0].replace(r'/',r'\\')
audio = MP3(musicfile)
musiclen=audio.info.length
playsound=pygame.mixer.music.load(musicfile)
pygame.mixer.music.play()
fenge=("{:.0f}".format(musiclen))
fen=("{:.2f}".float(100/float(fenge)))
for i in (1,101):
self.rsignal.emit(str(float(i)*float(fen)))
except Exception as e:
print(e)
#拖动文件drop类
class Runthreaddrop(QtCore.QThread):
# 通过类成员对象定义信号对象
rsignal = pyqtSignal(str)
def __init__(self):
super(Runthreaddrop, self).__init__()
self.flag = 1 def __del__(self):
self.wait() def stop(self):
self.flag=0
print('线程退出了') def run(self):
if self.flag==1:
try:
print('进入线程')
path=str(droppath)
if path!= '':
try:
im = Image.open(path) # 打开图片
imBytes = im.tobytes() # 把图片转换成bytes流
imBytes = zlib.compress(imBytes, 9) # 对图像字节串进行压缩,第二个参数是压缩率有-1,0-9.
if im.mode == 'RGBA':
im2 = Image.frombytes('RGBA',im.size, zlib.decompress(imBytes)) # 压缩成新的图片
else:
im2 = Image.frombytes('RGB',im.size, zlib.decompress(imBytes))
f=os.path.splitext(path)
newname=f[0] + '-已压缩'
newname=newname+f[1]
im2.save(newname)
self.rsignal.emit(str(int(100)))
except Exception as e:
print(e)
self.stop()
except Exception as e:
print(e) #解密类
class Runthreadjiemi(QtCore.QThread):
# 通过类成员对象定义信号对象
rsignal = pyqtSignal(str)
def __init__(self):
super(Runthreadjiemi, self).__init__()
self.flag = 1 def __del__(self):
self.wait() def stop(self):
self.flag=0
print('线程退出了')
def run(self):
if self.flag==1:
global usedtime4
try:
try:
start=time.time()
watebytes = open(jiemifile[0],'rb').read()
#第一步先AES解密
deaes = AESCrypt()
destring = watebytes.decode()
watebytes = deaes.decrypt(destring)
time.sleep(0.1)
#补等号
missing_padding = len(watebytes) % 4
#print(missing_padding)
if missing_padding != 0:
#print('需要补等号')
#string_new = bytes(file, encoding='utf-8')
watebytes = str(watebytes).replace("b'","").replace("'","")
watebytes += '=' * (4 - missing_padding)
self.rsignal.emit(str(int(33)))
#第二步base64解密
try:
watebytes =bytes(watebytes,encoding='utf-8')
stringbyte = base64.b64decode(watebytes)#.encode('utf-8'))
#print(stringbyte)
file2 = stringbyte
length2 = len(file2)
#print(length2)
default_length2 = 256
rsa_private_key=open(jiemikey[0],'rb').read()
rsakey2=RSA.importKey(rsa_private_key)
self.rsignal.emit(str(int(66)))
except Exception as e:
if e == 'Incorrect padding':
QMessageBox.information(ui,"错误", "请选择正确的加密文件和key密钥!",QMessageBox.Yes)
else:
QMessageBox.information(ui,"错误", "请选择正确的加密文件和key密钥!",QMessageBox.Yes) time.sleep(0.1)
#第三部RSA私钥解密
cipher2 = Cipher_pkcs1_v1_5.new(rsakey2)
#长度不用分段
if length2 < default_length2:
string_write = b''.join(cipher2.decrypt(file2,None))
else:
#需要分段
offset2 = 0
res2 = []
while length2 - offset2 > 0:
if length2 - offset2 > default_length2:
res2.append(cipher2.decrypt(file2[offset2:offset2+default_length2],None))
else:
res2.append(cipher2.decrypt(file2[offset2:],None))
offset2 += default_length2
self.rsignal.emit(str(int(80)))
string_write = b''.join(res2)
jiemipath = jiemifile[0]
f=os.path.splitext(jiemipath)
newname=f[0] + '-已解密'
newname=newname+f[1]
with open(newname,'wb') as f:
f.write(string_write)
print('解密成功')
#信号传给进度条100%了
self.rsignal.emit(str(int(100)))
except Exception as e:
print(e)
end=time.time()
usedtime4=(format(float(end-start),'.2f'))
#print("共耗时: %.02f 秒" %(float(usedtime4)))
self.stop()
except UnicodeError:
QMessageBox.information(ui,"错误", "请选择正确的加密文件和key密钥!",QMessageBox.Yes)
except UnicodeEncodeError:
QMessageBox.information(ui,"错误", "请选择正确的加密文件和key密钥!",QMessageBox.Yes)
except UnicodeDecodeError:
QMessageBox.information(ui,"错误", "请选择正确的加密文件和key密钥!",QMessageBox.Yes)
except UnicodeTranslateError:
QMessageBox.information(ui,"错误", "请选择正确的加密文件和key密钥!",QMessageBox.Yes)
except IOError:
QMessageBox.information(ui,"错误", "不能写入文件,请选择正确的加密文件和key密钥!",QMessageBox.Yes)
except BaseException:
QMessageBox.information(ui,"错误", "请选择正确的加密文件和key密钥!",QMessageBox.Yes)
except Exception as e:
print(e)
if e == "'utf-8' codec can't decode byte 0xff in position 0: invalid start byte":
QMessageBox.information(ui,"错误", "请选择正确的加密文件和key密钥!",QMessageBox.Yes)
else:
QMessageBox.information(ui,"错误", "请选择正确的加密文件和key密钥!",QMessageBox.Yes)
#opendic类
class Runthreaddic(QtCore.QThread):
# 通过类成员对象定义信号对象
rsignal = pyqtSignal(str)
def __init__(self):
super(Runthreaddic, self).__init__()
self.flag = 1 def __del__(self):
self.wait() def stop(self):
self.flag=0
print('线程退出了') def run(self):
if self.flag==1:
global usedtime2
try:
path=dic.replace(r'/',r'\\')
# glob.glob()用来进行模糊查询,增加参数recursive=True后可以使用**/来匹配所有子目录
files = glob( path + "**/*.JPG", recursive=True) + glob(path + "**/*.bmp", recursive=True) + glob(path + "**/*.png", recursive=True)
total = len(files) #总文件数
cur = 1 #当前文件序号
i=1
start=time.time()
for infile in files:
try:
#f, ext = os.path.splitext(infile) # 分离文件名和后缀
#print("进度:" + str(cur) + "/" + str(total) + " " + infile)
img = Image.open(infile) # 打开图片文件
if img.width>5:
width=img.width
height=img.height
size=(width*bs,height*bs)
img.thumbnail(size, Image.ANTIALIAS) # 使用抗锯齿模式生成缩略图(压缩图片)
f=os.path.splitext(infile)
newname=f[0] + '-已压缩'
newname=newname+f[1]
#不指定编码格式
img.save(newname) # , "JPEG"infile保存成与原文件名一致的文件,会自动覆盖源文件
bfb=int(100/total)
if i==total:
self.rsignal.emit(str(int(100)))
self.quit()
else:
self.rsignal.emit(str(bfb*i))
i=i+1
else:
print(infile + "宽度小于1200px,无需处理,已忽略")
cur = cur + 1
except Exception as e:
print(e)
end=time.time()
usedtime2=(format(float(end-start),'.2f'))
#print("共耗时: %.02f 秒" %(float(usedtime2)))
self.stop()
except Exception as e:
print(e) #加密类
class Runthreadjiami(QtCore.QThread):
# 通过类成员对象定义信号对象
rsignal = pyqtSignal(str)
def __init__(self):
super(Runthreadjiami, self).__init__()
self.flag = 1 def __del__(self):
self.wait() def stop(self):
self.flag=0
print('线程退出了') def run(self):
if self.flag==1:
global usedtime3 try:
filepath2 = filepath.replace(r'/',r'\\')
if filepath2 != '':
try:
start=time.time()
file = open(filepath2,'rb').read()
file_len = len(file)
default_length = 200
# 伪随机数生成器
random_generator = Random.new().read
# rsa算法生成实例
rsa = RSA.generate(2048, random_generator)
#公钥加密,也生成文件吧
rsa_public_key = rsa.publickey().exportKey()
#print(rsa_public_key)
#with open('01.pub', 'wb') as f:
# f.write(rsa_public_key)
#公钥加密
rsakey = RSA.importKey(rsa_public_key)
cipher = Cipher_pkcs1_v1_5.new(rsakey)
# 密钥key生成
rsa_private_key = rsa.exportKey()
#print(rsa_private_key)
#f=os.path.splitext(path)
#newname=f[0] + '-已压缩'
#newname=newname+ '.key'
keypath = filepath2
f=os.path.splitext(keypath)
newname = f[0] + 'secure'
newname = newname+ '.key'
with open(newname, 'wb') as f:
f.write(rsa_private_key)
time.sleep(0.1)
self.rsignal.emit(str(int(20)))
#长度不用分段
if file_len < default_length:
stringrsa = base64.b64encode(cipher.encrypt(file))
else:
#需要分段
offset = 0
res = []
count = 0
while file_len - offset > 0:
if file_len - offset > default_length:
res.append(cipher.encrypt(file[offset:offset+default_length]))
else:
res.append(cipher.encrypt(file[offset:]))
offset += default_length
count = count + 1
#print('计数分段次数:'+ str(count))
time.sleep(0.1)
self.rsignal.emit(str(int(60)))
#stringrsa = ''
stringrsa = b''.join(res)
stringrsa = base64.b64encode(stringrsa)
self.rsignal.emit(str(int(80)))
#下面进行AES加密
stringaes = AESCrypt()
stringaes_comp = stringaes.encrypt(str(stringrsa))
defilepath = filepath2
ft=os.path.splitext(defilepath)
newjiami = ft[0] + '-已加密'
newjiami = newjiami+ ft[1]
with open(newjiami,'wb') as f:
f.write(stringaes_comp)
print('加密成功')
time.sleep(0.1)
self.rsignal.emit(str(int(100)))
end=time.time()
usedtime3=(format(float(end-start),'.2f'))
except Exception as e:
print(e)
self.stop()
except Exception as e:
print(e) #opendicno类
class Runthreaddicno(QtCore.QThread):
# 通过类成员对象定义信号对象
rsignal = pyqtSignal(str)
#signal2 = pyqtSignal(str)
def __init__(self):
super(Runthreaddicno, self).__init__()
self.flag = 1 def __del__(self):
self.wait() def stop(self):
self.flag=0
#self.msgbox1=msgbox()
#self.newmsg=msgbox1.msg()
print('线程退出了') def run(self):
global usedtime
if self.flag==1:
try:
path=dic.replace(r'/',r'\\')
if dic != '':
path=dic.replace(r'/',r'\\')
# glob.glob()用来进行模糊查询,增加参数recursive=True后可以使用**/来匹配所有子目录
files = glob( path + "**/*.JPG", recursive=True) + glob(path + "**/*.bmp", recursive=True) + glob(path + "**/*.png", recursive=True)
total = len(files) #总文件数
print(total)
cur = 1 #当前文件序号
i=1
print(files)
start=time.time()
for infile in files:
try:
#print("进度:" + str(cur) + "/" + str(total) + " " + infile)
im = Image.open(infile) # 打开图片文件
if im.width>5:
imBytes = im.tobytes()
imBytes = zlib.compress(imBytes, 9)
if im.mode == 'RGBA':
im2 = Image.frombytes('RGBA', im.size, zlib.decompress(imBytes)) # 压缩成新的图片
else:
im2 = Image.frombytes('RGB', im.size, zlib.decompress(imBytes))
#改名------------------------
f=os.path.splitext(infile)
newname=f[0] + '-已压缩'
newname=newname+f[1]
#改名------------------------
im2.save(newname) # 保存成与原文件名一致的文件,会自动覆盖源文件
bfb=int(100/total)
if i==total:
self.rsignal.emit(str(int(100)))
#os._exit(0)退出整个程序,不好
self.quit()
else:
self.rsignal.emit(str(bfb*i))
i=i+1
else:
print(infile + "宽度小于1200px,无需处理,已忽略")
cur = cur + 1
except Exception as e:
print(e)
end=time.time()
usedtime=(format(float(end-start),'.2f'))
#print("共耗时: %.02f 秒" %(float(usedtime)))
self.stop()
except Exception as e:
print(e) class Ui_Form(QWidget): # QMainWindow QWidget def __init__(self):
super(QWidget,self).__init__() #QtWidgets.QMainWindow
self.setupUi(self)
self.retranslateUi(self)
# 鼠标拖入事件
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(368, 290)
Form.setFixedSize(368, 260)
Form.setWindowTitle('文件加密解密')
Form.setWindowIcon(QIcon(':/1.png')) self.tabWidget = QtWidgets.QTabWidget(Form)
self.tabWidget.setGeometry(QtCore.QRect(10, 10, 351, 271))
self.tabWidget.setObjectName("tabWidget")
self.tab = QtWidgets.QWidget()
#指定显示特定页面
#self.tab.setCurrentIndex(0)
self.tab.setObjectName("tab")
self.pushButton_4 = QtWidgets.QPushButton(self.tab)
self.pushButton_4.setGeometry(QtCore.QRect(100, 120, 141, 41))
self.pushButton_4.setObjectName("pushButton_4")
self.pushButton_4.clicked.connect(self.opendicno)
self.pushButton_4.setVisible(False)
#加密文件
self.pushButton_3 = Button("pushButton_3", self.tab)
#self.pushButton_3 = QtWidgets.QPushButton(self.tab)
self.pushButton_3.setGeometry(QtCore.QRect(120, 110, 101, 41))
self.pushButton_3.setObjectName("pushButton_3")
self.pushButton_3.clicked.connect(self.jiami)
self.label = QtWidgets.QLabel(self.tab)
self.label.setGeometry(QtCore.QRect(20, 0, 281, 81))
self.label.setTextFormat(QtCore.Qt.AutoText)
self.label.setWordWrap(True)
self.label.setObjectName("label")
#进度条1
self.progressBar = QtWidgets.QProgressBar(self.tab)
self.progressBar.setGeometry(QtCore.QRect(90, 190, 171, 26))
self.progressBar.setObjectName("progressBar")
self.progressBar.setProperty("value", 0)
self.progressBar.setStyleSheet("QProgressBar{border:0px solid #00A0E6;"
"height:50;"
"background:#191C21;"
"text-align:right;"
"color:white;"
#"color:rgb(245,220,0);"
"border-radius:2px;}" "QProgressBar::chunk{"
#"border-radius:5px;"
#"border:1px solid black;"rgb(167,210,102) rgb(245,220,0)
"background-color:rgb(150,196,64);"
"width:1px;margin:0.5px;}"
)
#隐藏进度条
self.progressBar.setVisible(False) self.tabWidget.addTab(self.tab, "")
self.tab_2 = QtWidgets.QWidget()
self.tab_2.setObjectName("tab_2")
#self.tab_2.setStyleSheet('background-color:#FAEBD7;')
#隐藏的Qlineedit
self.lineEdit = QtWidgets.QLineEdit(self.tab)
self.lineEdit.setGeometry(QtCore.QRect(0, 10, 351, 241))
self.lineEdit.setObjectName("lineEdit")
self.lineEdit.setVisible(False)
#有损压缩选择文件按钮
self.pushButton = Button2("pushButton", self.tab_2)
#self.pushButton = QtWidgets.QPushButton(self.tab_2)
self.pushButton.setGeometry(QtCore.QRect(120, 70, 101, 41))
self.pushButton.setCheckable(False)
self.pushButton.setObjectName("pushButton")
#选择key支持拖动
self.pushButton.clicked.connect(self.openfile)
self.pushButton_2 = Button3("pushButton_2", self.tab_2)
#self.pushButton_2 = QtWidgets.QPushButton(self.tab_2)
self.pushButton_2.setGeometry(QtCore.QRect(120, 120, 101, 41))
self.pushButton_2.setCheckable(False)
self.pushButton_2.setObjectName("pushButton_2")
#有损压缩打开文件夹
self.pushButton_2.clicked.connect(self.opendic)
#解密文件按钮
#self.pushButton_6 = Button3("pushButton_6", self.tab_2)
self.pushButton_6 = QtWidgets.QPushButton(self.tab_2)
self.pushButton_6.setGeometry(QtCore.QRect(110, 170, 121, 41))
self.pushButton_6.setCheckable(False)
self.pushButton_6.setObjectName("pushButton_6")
self.pushButton_6.clicked.connect(self.jiemi)
######停止线程
self.pushButton_7 = QtWidgets.QPushButton(self.tab_2)
self.pushButton_7.setGeometry(QtCore.QRect(250, 120, 91, 41))
self.pushButton_7.setCheckable(False)
self.pushButton_7.setObjectName("pushButton_7")
self.pushButton_7.clicked.connect(self.stopjiemi)
self.pushButton_7.setVisible(False)
self.pushButton_7.setStyleSheet("color:red;""background:#191C21;""font:微软雅黑;")
self.tabWidget.addTab(self.tab_2, "")
#label4
self.label_4 = QtWidgets.QLabel(self.tab)
self.label_4.setGeometry(QtCore.QRect(20, 170, 161, 16))
font4 = QtGui.QFont()
font4.setFamily("微软雅黑")
font4.setPointSize(10)
self.label_4.setFont(font4)
self.label_4.setObjectName("label_4")
self.label_4.setVisible(False)
#label5
self.label_5 = QtWidgets.QLabel(self.tab_2)
self.label_5.setGeometry(QtCore.QRect(20, 160, 151, 16))
font5 = QtGui.QFont()
font5.setFamily("微软雅黑")
font5.setPointSize(10)
self.label_5.setFont(font5)
self.label_5.setObjectName("label_5")
self.label_5.setVisible(False)
#label6,7
self.label_6 = QtWidgets.QLabel(self.tab_2)
self.label_6.setGeometry(QtCore.QRect(0, 50, 341, 16))
self.label_6.setObjectName("label_6")
self.label_6.setVisible(True)
self.label_7 = QtWidgets.QLabel(self.tab_2)
self.label_7.setGeometry(QtCore.QRect(0, 110, 341, 16))
self.label_7.setObjectName("label_7")
self.label_7.setVisible(True)
#label红色字
font8 = QtGui.QFont()
font8.setFamily("微软雅黑")
font8.setPointSize(10)
self.label_8 = QtWidgets.QLabel(self.tab_2)
self.label_8.setGeometry(QtCore.QRect(0, 80, 331, 20))
self.label_8.setObjectName("label_8")
self.label_8.setFont(font8)
self.label_8.setStyleSheet("color:red;")
self.label_8.setVisible(False)
#进度条2
self.progressBar_2 = QtWidgets.QProgressBar(self.tab_2)
self.progressBar_2.setGeometry(QtCore.QRect(100, 210, 171, 26))
self.progressBar_2.setObjectName("progressBar_2")
self.progressBar_2.setProperty("value", 0)
self.progressBar_2.setStyleSheet("QProgressBar{border:0px solid #00A0E6;"
"height:50;"
"background:#191C21;"
"text-align:right;"
"color:white;"
#"color:rgb(245,220,0);"
"border-radius:2px;}"
"QProgressBar::chunk{"
#"border-radius:5px;"
#"border:1px solid black;"rgb(167,210,102) rgb(245,220,0)
"background-color:rgb(150,196,64);"
"width:1px;margin:0.5px;}"
)
#隐藏进度条2
self.progressBar_2.setVisible(False)
self.label_2 = QtWidgets.QLabel(self.tab_2)
self.label_2.setGeometry(QtCore.QRect(20, 10, 281, 51))
self.label_2.setTextFormat(QtCore.Qt.AutoText)
self.label_2.setWordWrap(True)
self.label_2.setObjectName("label_2")
self.tabWidget.addTab(self.tab_2, "")
self.tabWidget.setCurrentIndex(0)
self.retranslateUi(Form)
#原来是你
QtCore.QMetaObject.connectSlotsByName(Form) def jiemi(self):
try:
if jiemifile[0] !='' and jiemikey[0] !='':
self.thread = Runthreadjiemi()
self.thread.rsignal.connect(self.call_backlogjiemi) # 进程连接回传到GUI的事件
#子进程开始前让进度条可见
self.progressBar_2.setVisible(True)
#label5显示
self.label_5.setVisible(True)
self.label_8.setVisible(True)
self.thread.start()
#避免重复点击,按钮置为不可用
self.pushButton_3.setEnabled(False)
self.pushButton_4.setEnabled(False)
self.pushButton.setEnabled(False)
self.pushButton_2.setEnabled(False)
self.pushButton_6.setEnabled(False)
self.pushButton_7.setVisible(True)
else:
QMessageBox.information(self,"错误", "请先选择好加密文件和key后再点击解密文件!",QMessageBox.Yes)
except Exception as e:
pass
def call_backlogjiemi(self, msg):
self.progressBar_2.setValue(int(msg)) # 将线程的参数传入进度条
#结束了顺带传给消息框
try:
if int(msg)==100:
time.sleep(0.1)
QMessageBox.information(self,"已完成!", "已成功解密文件到原有目录。" + '\n' +'共耗时:'+str(usedtime4)+' '+'秒',QMessageBox.Yes)
#QMessageBox.information(self,"已完成!", "已成功压缩图片到原有目录",QMessageBox.Yes)
#子线程结束后执行以下
#设计进度条隐藏
self.progressBar_2.setValue(0)
self.progressBar_2.setVisible(False)
#设置按钮可用
self.pushButton_3.setEnabled(True)
self.pushButton_4.setEnabled(True)
self.pushButton.setEnabled(True)
self.pushButton_2.setEnabled(True)
#label5隐藏
self.label_5.setVisible(False)
self.pushButton_6.setEnabled(True)
jiemifile = ''
jiemikey = ''
self.label_6.setText("")
self.label_7.setText("")
self.label_8.setVisible(False)
self.pushButton_7.setVisible(False)
except Exception as e:
print(e)
def stopjiemi(self):
try:
reply = QMessageBox.information(self,"询问", "确定要停止解密吗?",QMessageBox.Yes | QMessageBox.No)
if reply == QMessageBox.Yes:
#QMessageBox.information(self,"已完成!", "已成功压缩图片到原有目录",QMessageBox.Yes)
#子线程结束后执行以下
#设计进度条隐藏
self.progressBar_2.setValue(0)
self.progressBar_2.setVisible(False)
#设置按钮可用
self.pushButton_3.setEnabled(True)
self.pushButton_4.setEnabled(True)
self.pushButton.setEnabled(True)
self.pushButton_2.setEnabled(True)
#label5隐藏
self.label_5.setVisible(False)
self.pushButton_6.setEnabled(True)
jiemifile = ''
jiemikey = ''
self.label_6.setText("")
self.label_7.setText("")
self.label_8.setVisible(False)
self.pushButton_7.setVisible(False)
else:
pass
except Exception as e:
print(e)
def openfile(self):
try:
global jiemifile
jiemifile = QFileDialog.getOpenFileName(self,"选择文件","./","All Files (*.*)")
self.label_6.setText(jiemifile[0])
except Exception as e:
print(e) def opendic(self):
try:
global jiemikey
jiemikey = QFileDialog.getOpenFileName(self,"选择文件","./","All Files (*.key)")
self.label_7.setText(jiemikey[0])
except Exception as e:
print(e) def call_backlogdic(self, msg):
self.progressBar_2.setValue(int(msg)) # 将线程的参数传入进度条
#结束了顺带传给消息框
try:
if int(msg)==100:
QMessageBox.information(self,"已完成!", "已成功解密文件到原有目录。" + '\n' +'共耗时:'+str(usedtime2)+' '+'秒',QMessageBox.Yes)
#QMessageBox.information(self,"已完成!", "已成功压缩图片到原有目录",QMessageBox.Yes)
#子线程结束后执行以下
#设计进度条隐藏
self.progressBar_2.setValue(0)
self.progressBar_2.setVisible(False)
#设置按钮可用
self.pushButton_3.setEnabled(True)
self.pushButton_4.setEnabled(True)
self.pushButton.setEnabled(True)
self.pushButton_2.setEnabled(True) #label5隐藏
self.label_5.setVisible(False)
except Exception as e:
print(e) def jiami(self):
global filepath
fileselect = QFileDialog.getOpenFileName(self,"选择文件","./","All Files (*.*)")
filepath = fileselect[0]
print(filepath)
if filepath!='':
self.thread = Runthreadjiami()
self.thread.rsignal.connect(self.call_backlogjiami) # 进程连接回传到GUI的事件
#子进程开始前让进度条可见
self.progressBar.setVisible(True)
#label4显示
self.label_4.setVisible(True)
self.thread.start()
#避免重复点击,按钮置为不可用
self.pushButton_3.setEnabled(False)
self.pushButton_4.setEnabled(False)
self.pushButton.setEnabled(False)
self.pushButton_2.setEnabled(False)
self.pushButton_6.setEnabled(False) def call_backlogjiami(self, msg):
self.progressBar.setValue(int(msg)) # 将线程的参数传入进度条
#结束了顺带传给消息框
try:
if int(msg)==100:
QMessageBox.information(self,"已完成!", "已成功加密文件到原有目录。" + '\n' +'共耗时:'+str(usedtime3)+' '+'秒',QMessageBox.Yes)
#QMessageBox.information(self,"已完成!", "已成功压缩图片到原有目录",QMessageBox.Yes)
#子线程结束后执行以下
#设计进度条隐藏
self.progressBar.setValue(0)
self.progressBar.setVisible(False)
#设置按钮可用
self.pushButton_3.setEnabled(True)
self.pushButton_4.setEnabled(True)
self.pushButton.setEnabled(True)
self.pushButton_2.setEnabled(True) #label4隐藏
self.label_4.setVisible(False)
#self.pushButton_4.setVisible(False)
self.pushButton_6.setEnabled(True)
except Exception as e:
print(e) def opendicno(self):
global dic
dic = QFileDialog.getExistingDirectory(self,"选择文件夹", "./")
if dic!='':
self.thread = Runthreaddicno()
self.thread.rsignal.connect(self.call_backlogdicno) # 进程连接回传到GUI的事件
#子进程开始前让进度条可见
self.progressBar.setVisible(True)
#label4显示
self.label_4.setVisible(True)
self.thread.start()
self.pushButton_3.setEnabled(False)
self.pushButton_4.setEnabled(False)
self.pushButton.setEnabled(False)
self.pushButton_2.setEnabled(False)
self.radioButton.setEnabled(False)
self.radioButton_2.setEnabled(False)
self.radioButton_3.setEnabled(False)
self.radioButton_4.setEnabled(False) def call_backlogdicno(self, msg):
self.progressBar.setValue(int(msg)) # 将线程的参数传入进度条
#结束了顺带传给消息框
try:
if int(msg)==100:
#usedtime
QMessageBox.information(self,"已完成!", "已成功加密文件到原有目录。" + '\n' +'共耗时:'+str(usedtime)+' '+'秒',QMessageBox.Yes)
#子线程结束后执行以下
#设计进度条隐藏
self.progressBar.setValue(0)
self.progressBar.setVisible(False)
#设置按钮可用
self.pushButton_3.setEnabled(True)
self.pushButton_4.setEnabled(True)
self.pushButton.setEnabled(True)
self.pushButton_2.setEnabled(True)
self.radioButton.setEnabled(True)
self.radioButton_2.setEnabled(True)
self.radioButton_3.setEnabled(True)
self.radioButton_4.setEnabled(True)
#label4隐藏
self.label_4.setVisible(False)
except Exception as e:
print(e) def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "文件加密解密"))
#self.pushButton_5.setText(_translate("Form", "播放歌曲"))
self.pushButton_4.setText(_translate("Form", "选择文件夹"))
self.pushButton_3.setText(_translate("Form", "选择文件"))
self.label.setText(_translate("Form", "注:本程序采用AES+RSA等算法加密。请保存好加密所生成的key文件,丢失后文件不可恢复!本程序仅供学习使用,若造成任何文件损坏或遗失,本人概不负责。可直接拖拽至按钮加密文件。"))
self.label_2.setText(_translate("Form", "注:请先选择文件和对应的key来解密文件。"))
self.label_4.setText(_translate("Form", "正在加密,请勿关闭程序:"))
self.label_5.setText(_translate("Form", "正在解密,请勿关闭程序"))
self.label_6.setText(_translate("Form", ""))
self.label_7.setText(_translate("Form", ""))
self.label_8.setText(_translate("Form", "如果进度始终未动,请确保选择了正确的加密文件和key。"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("Form", "加密文件"))
self.pushButton.setText(_translate("Form", "选择文件"))
self.pushButton_2.setText(_translate("Form", "选择key"))
self.pushButton_6.setText(_translate("Form", "解密文件"))
self.pushButton_7.setText(_translate("Form", "点击停止解密"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("Form", "解密文件")) if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QMainWindow()
ui = Ui_Form()
ui.setupUi(ui)
Form.show()
sys.exit(app.exec_())
python-GUI-pyqt5之文件加密解密工具的更多相关文章
- pyDes 实现 Python 版的 DES 对称加密/解密--转
https://my.oschina.net/leejun2005/blog/586451 手头有个 Java 版的 DES 加密/解密程序,最近想着将其 Python 重构下,方便后续脚本解析,捣鼓 ...
- linux环境下给文件加密/解密的方法
原文地址:linix环境下给文件加密/解密的方法 作者:oracunix 一. 利用 vim/vi 加密:优点:加密后,如果不知道密码,就看不到明文,包括root用户也看不了:缺点:很明显让别人知 ...
- 齐博软件(地方门户系统) 文件加密破解工具
原文:齐博软件(地方门户系统) 文件加密破解工具 本程序为针对"齐博软件地方门户系统5.0官方原版"的破解工具,一个垃圾系统居然弄出这么恶心的加密方式,有个鸟用!以后见一个破一个! ...
- 使用jframe编写一个base64加密解密工具
该工具可以使用exe4j来打包成exe工具(如何打包自己百度) 先上截图功能 运行main方法后,会弹出如下窗口 输入密文 然后点击解密,在点格式化 代码分享 package tools;import ...
- Base64加密解密工具类
使用Apache commons codec类Base64进行加密解密 maven依赖 <dependency> <groupId>commons-codec</grou ...
- Java AES加密解密工具 -- GUI 、在线传输文件
原理 对于任意长度的明文,AES首先对其进行分组,每组的长度为128位.分组之后将分别对每个128位的明文分组进行加密. 对于每个128位长度的明文分组的加密过程如下: (1)将128位AES ...
- DES带IV向量加密解密工具
链接:http://pan.baidu.com/s/1kVAV80J 密码:sgys 鉴于网上的DES加密解密都是不带IV向量的 我就自制了一个带IV向量的DES加密解密的小工具 © 2016-20 ...
- 自己写的AES和RSA加密解密工具
package com.sdyy.common.utils; import java.security.Key; import java.security.KeyFactory; import jav ...
- android 中文件加密 解密 算法实战
现在项目里面有一个需求,本项目里面下载的视频和文档都不允许通过其他的播放器播放,在培训机构里面这样的需求很多.防止有人交一份钱,把所有的课件就拷给了别人.这样的事情培训机构肯定是不愿意的.现在我项目里 ...
- 加密解密工具类(Java,DES)
一个Java版的DES加密工具类,能够用来进行网络传输数据加密,保存password的时候进行加密. import java.security.Key; import java.security.sp ...
随机推荐
- java三级菜单遍历
java 三级菜单遍历 @Override public List<YjztCity> getYjzt(){ List<YjztCity> yjztCities = yjztC ...
- JS学习-常用的Web API
web API web-api 分类 链接 描述 操作文档的API 操作document dom,html,svg 从服务器获取数据的API XMLHttpRequest XMLHttpRequest ...
- 利用Comparator对枚举类型进行排序的实现
1. 利用BeanComparator对List<Object>根据属性进行排序 String daXiaoOrder[] = {"很小","小", ...
- 记一次SpringBoot整合Redis的Bug
SpringBoot整合Redis遇见的坑 <!--Redis配置开始--> <dependency> <groupId>org.springframework.b ...
- jmeter非GUI模式运行-单节点
jmeter有自己的GUI页面,但是当线程数很多或者现在有很多的测试场景都是基于linux下进行压测,这时我们可以使用jmeter的命令行方式来执行测试,该篇文章介绍jmeter单节点命令运行方式. ...
- Docker部署Nastool(含jellyfin、transmission)
先弄清楚原理 首先从[资源搜索]或者[推荐栏目]寻找自己想看的电影,执行订阅或者搜索资源启动下载,下载电影存放在downloads/mov目录下,[媒体整理]就是将mov子目录下电影文件复制到down ...
- element 换肤
官网操作 https://element.eleme.cn/#/zh-CN/component/custom-theme 然后 执行 et -i 报错了!!! 查了一下,说的是node版本过高?那我就 ...
- React-Native笔记--node_modules删除
在开发RN项目过程中,经常会用到删除node_modules文件夹的命令,现总结如下: 方式1: npm install rimraf -g rimraf node_modules方式2: rmdir ...
- A Super Hero
DP? QwQ这题似乎不能直接贪心2333-- 阶段 很明显的阶段性,\(n\)关便为\(n\)个阶段, 状态 分好阶段后,容易构造出状态的表达: \(f[i,j]\)表示Ma5termind在最开始 ...
- iOS OC开发,文件的下载、预览
/// 下载/打开 - (void)downloadActionWithDownloadString:(NSString *)downloadString{ //url : 下载地址 NSString ...