随便用PyQt5写的包含AES,DES,RC4,3DES对称加密算法的加解密小软件,能对任意格式的文件进行加解密操作。
初次写PyQt,想不到不用多线程的话,软件总是卡死,程序遇到了一丁点的异常都卡死闪退,改了好长时间,也算是能运行了嘿嘿。
这里面不是我不想模块化,只是不知道为什么在类中调用self自己的方法总是卡死,并且在类外面再次实例化对象也会卡死,怎么接收线程的返回值也不会写(;′⌒`),所以直接用的全局变量标志。线程这块涉及的东西感觉太复杂了,以后有机会多学学吧。
效果如图:
代码如下:
main.py
import sys
from apps import *
from PyQt5 import QtCore, QtGui, QtWidgets, Qt
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from Crypto.Cipher import AES,ARC4,DES3
import base64
from pyDes import des, CBC, PAD_PKCS5
import binascii
import threading
flag=0
def add_to_16(value):
while len(value) % 16 != 0:
value += '\0'.encode()
return value
def add_to_16s(value):
while len(value)%16!=0:
value+=b'a'
return value
def add_to_8(value):
while len(value)%8!=0:
value+='\0'.encode()
return value
class MyApp(QMainWindow,Ui_MainWindow,QThread):
def __init__(self,parent=None):
super(MyApp, self).__init__()
self.setupUi(self)
self.setWindowTitle("Python对称算法加解密")
self.initUi()
def initUi(self):
self.openfile_enc.clicked.connect(self.openfile1)
self.openfile_dec.clicked.connect(self.openfile2)
self.AES_ENC.clicked.connect(self.AESEncryption)
self.AES_DEC.clicked.connect(self.AESDecryption)
self.DES_ENC.clicked.connect(self.DESEncryption)
self.DES_DEC.clicked.connect(self.DESDecryption)
self.RC4_ENC.clicked.connect(self.RC4Encryption)
self.RC4_DEC.clicked.connect(self.RC4Decryption)
self.DES3_ENC.clicked.connect(self.DEC3Encryption)
self.DES3_DEC.clicked.connect(self.DEC3Decryption)
def openfile1(self):
openfile_name = QFileDialog.getOpenFileName(self,"请选择需要加密的文件",'./')
self.enc_filepath.setText(openfile_name[0])
def openfile2(self):
openfile_name = QFileDialog.getOpenFileName(self,"请选择需要解密的文件",'./')
self.dec_filepath.setText(openfile_name[0])
def AESEncryption(self):
filepath=self.enc_filepath.text()
if(filepath==''):
self.state.setText("请选择文件!!!")
else:
filepos=filepath.rfind(r'/') + 1
filename = filepath[filepos:]
key1 = self.inputkey.text()
if key1=='':
self.state.setText("请输入密钥!!!")
else:
key=key1.encode()
file1=open(filepath, "rb")
text = file1.read()
file1.close()
try:
aes = AES.new(add_to_16(key), AES.MODE_ECB)
encrypt_aes = aes.encrypt(add_to_16(text))
encrypted_text = base64.encodebytes(encrypt_aes)
new1=filename.split(".")
new_name=new1[0]+"_加密."+new1[1]
new_path=filepath[:filepos]+new_name
file=open(new_path,"wb")
file.write(encrypted_text)
file.close()
self.state.setText("明文AES加密成功,结果保存在"+new_path+"中")
except:
self.state.setText("ERROE!")
def AESDecryption(self):
filepath=self.dec_filepath.text()
if(filepath==''):
self.state.setText("请选择文件!!!")
else:
filepos=filepath.rfind(r'/') + 1
filename = filepath[filepos:]
key = self.inputkey.text()
if key=='':
self.state.setText("请输入密钥!!!")
else:
file1 = open(filepath, "rb")
text = file1.read()
file1.close()
try:
aes = AES.new(add_to_16(key.encode()), AES.MODE_ECB)
base64_decrypted = base64.decodebytes(text)
decrypted_text = aes.decrypt(base64_decrypted)
new1=filename.split(".")
new_name=new1[0]+"_解密."+new1[1]
new_path=filepath[:filepos]+new_name
file=open(new_path,"wb")
file.write(decrypted_text)
file.close()
self.state.setText("密文AES解密成功,结果保存在"+new_path+"中")
except:
self.state.setText("ERROR!")
def DESEncryption(self):
filepath = self.enc_filepath.text()
if(filepath==''):
self.state.setText("请选择文件!!!")
else:
filepos = filepath.rfind(r'/') + 1
filename = filepath[filepos:]
file1 = open(filepath, "rb")
text = file1.read()
file1.close()
key1=self.inputkey.text()
if key1=='':
self.state.setText("请输入密钥!!!")
else:
key = add_to_8(key1.encode())
self.thread_1= threading.Thread(target=desenc, args=(key,text,filename,filepath,filepos))
self.thread_1.start()
if flag == 0:
new1 = filename.split(".")
new_name = new1[0] + "_加密." + new1[1]
new_path = filepath[:filepos] + new_name
self.state.setText("明文DES加密成功,结果保存在" + new_path + "中")
elif flag==1:
self.state.setText("ERROR!")
def DESDecryption(self):
filepath = self.dec_filepath.text()
if (filepath == ''):
self.state.setText("请选择文件!!!")
else:
key1 = self.inputkey.text()
if key1 == '':
self.state.setText("请输入密钥!!!")
else:
key = add_to_8(key1.encode())
filepath = self.dec_filepath.text()
filepos = filepath.rfind(r'/') + 1
filename = filepath[filepos:]
file1 = open(filepath, "rb")
text = file1.read()
file1.close()
self.thread_2=threading.Thread(target=desdec, args=(key,text,filename,filepath,filepos))
self.thread_2.start()
if flag == 0:
new1 = filename.split(".")
new_name = new1[0] + "_解密." + new1[1]
new_path = filepath[:filepos] + new_name
self.state.setText("密文DES解密成功,结果保存在" + new_path + "中")
elif flag == 1:
self.state.setText("ERROR!")
def RC4Encryption(self):
filepath = self.enc_filepath.text()
if (filepath == ''):
self.state.setText("请选择文件!!!")
else:
key1=self.inputkey.text()
if key1=='':
self.state.setText("请输入密钥!!!")
else:
filepath = self.enc_filepath.text()
filepos = filepath.rfind(r'/') + 1
filename = filepath[filepos:]
file1 = open(filepath, "rb")
text = file1.read()
file1.close()
try:
key = bytes(key1, encoding='utf-8')
enc = ARC4.new(key)
res = enc.encrypt(text)
res = base64.b64encode(res)
new1 = filename.split(".")
new_name = new1[0] + "_加密." + new1[1]
new_path = filepath[:filepos] + new_name
file = open(new_path, "wb")
file.write(res)
file.close()
self.state.setText("明文RC4加密成功,结果保存在" + new_path + "中")
except:
self.state.setText("ERROR!")
def RC4Decryption(self):
filepath=self.dec_filepath.text()
if(filepath==''):
self.state.setText("请选择文件!!!")
else:
filepos=filepath.rfind(r'/') + 1
filename = filepath[filepos:]
key1 = self.inputkey.text()
if key1=='':
self.state.setText("请输入密钥!!!")
else:
file1 = open(filepath, "rb")
text = file1.read()
file1.close()
try:
data = base64.b64decode(text)
key = bytes(key1, encoding='utf-8')
enc = ARC4.new(key)
res = enc.decrypt(data)
new1 = filename.split(".")
new_name = new1[0] + "_解密." + new1[1]
new_path = filepath[:filepos] + new_name
file = open(new_path, "wb")
file.write(res)
file.close()
self.state.setText("密文RC4解密成功,结果保存在" + new_path + "中")
except:
self.state.setText("ERROR!")
def DEC3Encryption(self):
key1=self.inputkey.text()
filepath = self.enc_filepath.text()
if(filepath==''):
self.state.setText("请选择文件!!!")
else:
if key1=='':
self.state.setText("请输入密钥!!!")
else:
filepos = filepath.rfind(r'/') + 1
filename = filepath[filepos:]
file1 = open(filepath, "rb")
text = file1.read()
file1.close()
key = add_to_16s((key1.encode('utf-8')))
length = 8 - (len(text) % 8)
text += bytes([length]) * length
self.thread_3 = threading.Thread(target=des3enc, args=(key, text, filename, filepath, filepos))
self.thread_3.start()
if flag == 0:
new1 = filename.split(".")
new_name = new1[0] + "_加密." + new1[1]
new_path = filepath[:filepos] + new_name
self.state.setText("明文DES3加密成功,结果保存在" + new_path + "中")
elif flag==1:
self.state.setText("ERROR!")
def DEC3Decryption(self):
filepath=self.dec_filepath.text()
if(filepath==''):
self.state.setText("请选择文件!!!")
else:
filepos=filepath.rfind(r'/') + 1
filename = filepath[filepos:]
key1 = self.inputkey.text()
if key1=='':
self.state.setText("请输入密钥!!!")
else:
file1 = open(filepath, "rb")
text = file1.read()
file1.close()
key = add_to_16s(key1.encode('utf-8'))
self.thread_4 = threading.Thread(target=des3dec, args=(key, text, filename, filepath, filepos))
self.thread_4.start()
if flag == 0:
new1 = filename.split(".")
new_name = new1[0] + "_解密." + new1[1]
new_path = filepath[:filepos] + new_name
self.state.setText("密文DES3解密成功,结果保存在" + new_path + "中")
elif flag==1:
self.state.setText("ERROR!")
def desdec(key,text,filename,filepath,filepos):
global flag
flag = 0
try:
iv = key
k = des(key, CBC, iv, pad=None, padmode=PAD_PKCS5)
de = k.decrypt(binascii.a2b_hex(text), padmode=PAD_PKCS5)
new1=filename.split(".")
new_name=new1[0]+"_解密."+new1[1]
new_path=filepath[:filepos]+new_name
file=open(new_path,"wb")
file.write(de)
file.close()
except:
flag=1
def desenc(key,text,filename,filepath,filepos):
global flag
flag=0
try:
iv = key
k = des(key, CBC, iv, pad=None, padmode=PAD_PKCS5)
en = binascii.b2a_hex(k.encrypt(text, padmode=PAD_PKCS5))
new1=filename.split(".")
new_name=new1[0]+"_加密."+new1[1]
new_path=filepath[:filepos]+new_name
file=open(new_path,"wb")
file.write(en)
file.close()
except:
flag=1
def des3enc(key,plaintext,filename,filepath,filepos):
global flag
flag=0
try:
cipher = DES3.new(key, DES3.MODE_CBC, b'\0' * 8)
ciphertext = cipher.encrypt(plaintext)
new1 = filename.split(".")
new_name = new1[0] + "_加密." + new1[1]
new_path = filepath[:filepos] + new_name
file = open(new_path, "wb")
file.write(binascii.b2a_hex(ciphertext))
file.close()
except:
flag=1
def des3dec(key,text,filename,filepath,filepos):
global flag
flag=0
try:
cipher = DES3.new(key, DES3.MODE_CBC, b'\0' * 8)
plaintext1=binascii.a2b_hex(text)
plaintext = cipher.decrypt(plaintext1)
plaintext = plaintext[:-plaintext[-1]]
new1 = filename.split(".")
new_name = new1[0] + "_解密." + new1[1]
new_path = filepath[:filepos] + new_name
file = open(new_path, "wb")
file.write(plaintext)
file.close()
except:
flag=1
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
myapp = MyApp()
myapp.show()
sys.exit(app.exec_())
apps.py
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'apps.ui'
#
# Created by: PyQt5 UI code generator 5.15.9
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.setEnabled(True)
MainWindow.resize(695, 600)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.centralwidget)
self.verticalLayout_3.setObjectName("verticalLayout_3")
self.gridLayout_2 = QtWidgets.QGridLayout()
self.gridLayout_2.setObjectName("gridLayout_2")
spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.gridLayout_2.addItem(spacerItem, 6, 0, 1, 1)
self.horizontalLayout = QtWidgets.QHBoxLayout()
self.horizontalLayout.setObjectName("horizontalLayout")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setObjectName("label")
self.horizontalLayout.addWidget(self.label)
self.enc_filepath = QtWidgets.QLineEdit(self.centralwidget)
self.enc_filepath.setEnabled(True)
self.enc_filepath.setReadOnly(True)
self.enc_filepath.setObjectName("enc_filepath")
self.horizontalLayout.addWidget(self.enc_filepath)
self.openfile_enc = QtWidgets.QPushButton(self.centralwidget)
self.openfile_enc.setObjectName("openfile_enc")
self.horizontalLayout.addWidget(self.openfile_enc)
self.gridLayout_2.addLayout(self.horizontalLayout, 1, 0, 1, 1)
self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
self.horizontalLayout_3.setObjectName("horizontalLayout_3")
self.label_5 = QtWidgets.QLabel(self.centralwidget)
self.label_5.setObjectName("label_5")
self.horizontalLayout_3.addWidget(self.label_5)
self.dec_filepath = QtWidgets.QLineEdit(self.centralwidget)
self.dec_filepath.setEnabled(True)
self.dec_filepath.setReadOnly(True)
self.dec_filepath.setObjectName("dec_filepath")
self.horizontalLayout_3.addWidget(self.dec_filepath)
self.openfile_dec = QtWidgets.QPushButton(self.centralwidget)
self.openfile_dec.setObjectName("openfile_dec")
self.horizontalLayout_3.addWidget(self.openfile_dec)
self.label_4 = QtWidgets.QLabel(self.centralwidget)
self.label_4.setText("")
self.label_4.setObjectName("label_4")
self.horizontalLayout_3.addWidget(self.label_4)
self.gridLayout_2.addLayout(self.horizontalLayout_3, 5, 0, 1, 1)
spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.gridLayout_2.addItem(spacerItem1, 2, 0, 1, 1)
self.verticalLayout_3.addLayout(self.gridLayout_2)
self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.label_3 = QtWidgets.QLabel(self.centralwidget)
self.label_3.setObjectName("label_3")
self.horizontalLayout_2.addWidget(self.label_3)
self.inputkey = QtWidgets.QLineEdit(self.centralwidget)
self.inputkey.setReadOnly(False)
self.inputkey.setObjectName("inputkey")
self.horizontalLayout_2.addWidget(self.inputkey)
self.verticalLayout_3.addLayout(self.horizontalLayout_2)
self.gridLayout = QtWidgets.QGridLayout()
self.gridLayout.setObjectName("gridLayout")
spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.gridLayout.addItem(spacerItem2, 1, 3, 1, 1)
spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.gridLayout.addItem(spacerItem3, 0, 3, 1, 1)
self.DES3_ENC = QtWidgets.QPushButton(self.centralwidget)
self.DES3_ENC.setObjectName("DES3_ENC")
self.gridLayout.addWidget(self.DES3_ENC, 0, 6, 1, 1)
self.DES_DEC = QtWidgets.QPushButton(self.centralwidget)
self.DES_DEC.setObjectName("DES_DEC")
self.gridLayout.addWidget(self.DES_DEC, 1, 2, 1, 1)
self.DES_ENC = QtWidgets.QPushButton(self.centralwidget)
self.DES_ENC.setObjectName("DES_ENC")
self.gridLayout.addWidget(self.DES_ENC, 0, 2, 1, 1)
self.AES_DEC = QtWidgets.QPushButton(self.centralwidget)
self.AES_DEC.setObjectName("AES_DEC")
self.gridLayout.addWidget(self.AES_DEC, 1, 0, 1, 1)
self.AES_ENC = QtWidgets.QPushButton(self.centralwidget)
self.AES_ENC.setObjectName("AES_ENC")
self.gridLayout.addWidget(self.AES_ENC, 0, 0, 1, 1)
self.RC4_ENC = QtWidgets.QPushButton(self.centralwidget)
self.RC4_ENC.setObjectName("RC4_ENC")
self.gridLayout.addWidget(self.RC4_ENC, 0, 4, 1, 1)
self.RC4_DEC = QtWidgets.QPushButton(self.centralwidget)
self.RC4_DEC.setObjectName("RC4_DEC")
self.gridLayout.addWidget(self.RC4_DEC, 1, 4, 1, 1)
self.DES3_DEC = QtWidgets.QPushButton(self.centralwidget)
self.DES3_DEC.setObjectName("DES3_DEC")
self.gridLayout.addWidget(self.DES3_DEC, 1, 6, 1, 1)
spacerItem4 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.gridLayout.addItem(spacerItem4, 0, 1, 1, 1)
spacerItem5 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.gridLayout.addItem(spacerItem5, 1, 1, 1, 1)
spacerItem6 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.gridLayout.addItem(spacerItem6, 0, 5, 1, 1)
spacerItem7 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.gridLayout.addItem(spacerItem7, 1, 5, 1, 1)
self.verticalLayout_3.addLayout(self.gridLayout)
self.verticalLayout_2 = QtWidgets.QVBoxLayout()
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.label_2 = QtWidgets.QLabel(self.centralwidget)
self.label_2.setObjectName("label_2")
self.verticalLayout_2.addWidget(self.label_2)
self.state = QtWidgets.QTextBrowser(self.centralwidget)
self.state.setObjectName("state")
self.verticalLayout_2.addWidget(self.state)
self.verticalLayout_3.addLayout(self.verticalLayout_2)
MainWindow.setCentralWidget(self.centralwidget)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 695, 26))
self.menubar.setObjectName("menubar")
self.menu = QtWidgets.QMenu(self.menubar)
self.menu.setObjectName("menu")
MainWindow.setMenuBar(self.menubar)
self.menubar.addAction(self.menu.menuAction())
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.label.setText(_translate("MainWindow", "请选择需要加密的文件:"))
self.openfile_enc.setText(_translate("MainWindow", "打开文件"))
self.label_5.setText(_translate("MainWindow", "请选择需要解密的文件:"))
self.openfile_dec.setText(_translate("MainWindow", "打开文件"))
self.label_3.setText(_translate("MainWindow", "请输入密钥:"))
self.DES3_ENC.setText(_translate("MainWindow", "3DES加密"))
self.DES_DEC.setText(_translate("MainWindow", "DES解密"))
self.DES_ENC.setText(_translate("MainWindow", "DES加密"))
self.AES_DEC.setText(_translate("MainWindow", "AES解密"))
self.AES_ENC.setText(_translate("MainWindow", "AES加密"))
self.RC4_ENC.setText(_translate("MainWindow", "RC4加密"))
self.RC4_DEC.setText(_translate("MainWindow", "RC4解密"))
self.DES3_DEC.setText(_translate("MainWindow", "3DES解密"))
self.label_2.setText(_translate("MainWindow", "加解密状态:"))
self.menu.setTitle(_translate("MainWindow", "加解密软件"))