# -*- 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. # -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'sender_ui.ui' # 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,sender): 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=sender 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): #发送数据 envelope = json.dumps(self.envelope) self.sender.send(envelope.encode('utf-8')) if __name__ == "__main__": #连接接收端 准备发送数据 sender_conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sender_conn.connect(('localhost', 8888)) #创建窗口 app = QtWidgets.QApplication(sys.argv) MainWindow = QtWidgets.QMainWindow() ui = Ui_MainWindow() ui.setupUi(MainWindow,sender_conn) MainWindow.show() sys.exit(app.exec_())