python加解密小软件

随便用PyQt5写的包含AES,DES,RC4,3DES对称加密算法的加解密小软件,能对任意格式的文件进行加解密操作。

初次写PyQt,想不到不用多线程的话,软件总是卡死,程序遇到了一丁点的异常都卡死闪退,改了好长时间,也算是能运行了嘿嘿。

这里面不是我不想模块化,只是不知道为什么在类中调用self自己的方法总是卡死,并且在类外面再次实例化对象也会卡死,怎么接收线程的返回值也不会写(;′⌒`),所以直接用的全局变量标志。线程这块涉及的东西感觉太复杂了,以后有机会多学学吧。

效果如图:

4c7d3287b1c4424a8740e09a7364b024.png

代码如下:

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", "加解密软件"))

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值