# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'sender_ui.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 import sys from PyQt5.QtWidgets import QFileDialog,QMainWindow from gmssl import sm4, func import json import socket from Crypto.Cipher import AES from binascii import b2a_hex, a2b_hex import random import string import tkinter as tk from tkinter import filedialog from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_OAEP from Crypto.Signature import PKCS1_v1_5 from OpenSSL import crypto from OpenSSL.crypto import PKey from OpenSSL.crypto import TYPE_RSA, FILETYPE_PEM, FILETYPE_ASN1 from OpenSSL.crypto import dump_privatekey, dump_publickey import hashlib from Crypto.Hash import SHA512 #导入加密算法的类 class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(839, 600) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.enbutton = QtWidgets.QPushButton(self.centralwidget) self.enbutton.setGeometry(QtCore.QRect(560, 240, 121, 51)) self.enbutton.setObjectName("enbutton") self.textBrowser = QtWidgets.QTextBrowser(self.centralwidget) self.textBrowser.setGeometry(QtCore.QRect(10, 10, 541, 501)) self.textBrowser.setObjectName("textBrowser") self.choose_button = QtWidgets.QPushButton(self.centralwidget) self.choose_button.setGeometry(QtCore.QRect(560, 110, 121, 51)) self.choose_button.setObjectName("choose_button") self.algorithm_box = QtWidgets.QComboBox(self.centralwidget) self.algorithm_box.setGeometry(QtCore.QRect(560, 160, 121, 41)) self.algorithm_box.setObjectName("algorithm_box") self.mode_box = QtWidgets.QComboBox(self.centralwidget) self.mode_box.setGeometry(QtCore.QRect(560, 200, 121, 41)) self.mode_box.setObjectName("mode_box") self.key_generate_button = QtWidgets.QPushButton(self.centralwidget) self.key_generate_button.setGeometry(QtCore.QRect(560, 10, 121, 51)) self.key_generate_button.setAutoDefault(False) self.key_generate_button.setObjectName("key_generate_button") self.send_public_button = QtWidgets.QPushButton(self.centralwidget) self.send_public_button.setGeometry(QtCore.QRect(560, 60, 121, 51)) self.send_public_button.setObjectName("send_public_button") self.envelope_button = QtWidgets.QPushButton(self.centralwidget) self.envelope_button.setGeometry(QtCore.QRect(560, 290, 121, 51)) self.envelope_button.setObjectName("envelope_button") MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 839, 23)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) self.key_generate_button.clicked.connect(self.key_generate) # type: ignore self.send_public_button.clicked.connect(self.send_publickey) # type: ignore self.choose_button.clicked.connect(self.choose_file) # type: ignore self.enbutton.clicked.connect(self.encrypt) # type: ignore self.envelope_button.clicked.connect(self.send) # type: ignore QtCore.QMetaObject.connectSlotsByName(MainWindow) #新增属性 """ self.file_path 文件路径 self.mode 加密模式 self.algorithm 选择的加密算法 self.encrypted_text 加密后的文本 self.public_key 自己的公钥 self.private_key 自己的私钥 self.public_key_other 对方的公钥 self.key 对称密钥 self.sender 连接实例 self.envelope 信封 """ self.file_path= "" self.mode="" self.algorithm="" self.encrypted_text="" with open("public_key.pem","rb") as f: self.public_key=crypto.load_publickey(crypto.FILETYPE_PEM,f.read(),password=None) with open("private_key.pem","rb") as f: self.private_key=crypto.load_privatekey(crypto.FILETYPE_PEM,f.read(),password=None) with open("public_key_other.pem","rb") as f: self.public_key_other=crypto.load_publickey(crypto.FILETYPE_PEM,f.read(),password=None) self.key="" self.envelope={} #等待接收方连接 self.sender=socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.sender.bind(("127.0.0.1", 5555)) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) self.enbutton.setText(_translate("MainWindow", "加密并封装")) self.choose_button.setText(_translate("MainWindow", "选择文件")) self.key_generate_button.setText(_translate("MainWindow", "生成公私钥")) self.send_public_button.setText(_translate("MainWindow", "发送公钥")) self.envelope_button.setText(_translate("MainWindow", "发送")) self.mode_box.addItems(["ECB", "CBC"]) self.algorithm_box.addItems(["AES","SM4"]) def choose_file(self): #打开文件选择对话框 self.file_path, _ = QFileDialog.getOpenFileName(MainWindow, '请选择要进行加密的文件', '', 'All Files (*);;Text Files (*.txt)') # 检查文件路径是否为空 if self.file_path: self.textBrowser.append(self.file_path) else: self.textBrowser.append("no file selected") self.textBrowser.append("choose_file") def encrypt(self): # 获取用户选择的加密算法 self.algorithm = self.algorithm_box.currentText() self.mode = self.mode_box.currentText() with open(self.file_path, 'r') as f: plaintext = f.read() # #A随机生成16字节的数字和字母组合的字符串 with open("aeskey.txt",'wb') as f: self.key = ''.join(random.choices(string.ascii_letters + string.digits, k=16)).encode() f.write(self.key) if self.algorithm=="AES": if self.mode=="ECB": mode = AES.MODE_ECB cryptor = AES.new(self.key, mode) text = plaintext.encode("utf-8") length = 16 count = len(text) add = length - (count % length) text = text + (b'\0' * add) encrypted_text = cryptor.encrypt(text) self.encrypted_text = b2a_hex(encrypted_text).decode("utf-8") self.textBrowser.append(encrypted_text+"\n") elif self.mode=="CBC": mode = AES.MODE_CBC cryptor = AES.new(self.key, mode, self.key)#iv = self.key text = plaintext.encode("utf-8") length = 16 count = len(text) add = length - (count % length) text = text + (b'\0' * add) encrypted_text = cryptor.encrypt(text) self.encrypted_text = b2a_hex(encrypted_text).decode("utf-8") self.textBrowser.append(encrypted_text+"\n") else: self.textBrowser.append("mode error") elif self.algorithm=="SM4": if self.mode=="ECB": # 生成sm4的密钥和偏移量 sm4_key = func.random_hex(16) with open(self.file_path, 'rb') as f: file_content = f.read() print("file_content:",file_content) sm4Alg = sm4.CryptSM4() sm4Alg.set_key(sm4_key.encode(), sm4.SM4_ENCRYPT) encrypted_data = sm4Alg.crypt_ecb(file_content) self.encrypted_text = encrypted_data.hex() elif self.mode=="CBC": # 生成sm4的密钥和偏移量 sm4_key = func.random_hex(16) sm4_iv = func.random_hex(16) with open(self.file_path, 'rb') as f: file_content = f.read() sm4Alg = sm4.CryptSM4() sm4Alg.set_key(sm4_key.encode(), sm4.SM4_ENCRYPT) encrypted_data = sm4Alg.crypt_cbc(sm4_iv.encode(),file_content) self.encrypted_text = encrypted_data.hex() else: self.textBrowser.append("mode error") else: self.textBrowser.append("algorithm error") #对称密钥加密 recipient_key = RSA.importKey(self.public_key_other) cipher_rsa = PKCS1_OAEP.new(recipient_key) enc_key = cipher_rsa.encrypt(self.key) enc_key = b2a_hex(enc_key).decode("utf-8") self.textBrowser.append(enc_key+"\n") #签名 key = RSA.importKey(self.private_key) sha512_hash = hashlib.sha256(plaintext.encode('utf-8')).hexdigest() h = SHA512.new(sha512_hash.encode("utf-8")) signer = PKCS1_v1_5.new(key) signature = b2a_hex(signer.sign(h)).decode("utf-8") self.textBrowser.append(signature) self.envelope={"algorithm":self.algorithm,"mode":self.mode,"ciphertext":self.encrypted_text,"key":enc_key,"signature":signature,"publick_key":self.public_key} self.textBrowser.append("pack successfully") def send(self): pass if __name__ == "__main__": app = QtWidgets.QApplication(sys.argv) MainWindow = QtWidgets.QMainWindow() ui = Ui_MainWindow() ui.setupUi(MainWindow) MainWindow.show() sys.exit(app.exec_())