From 04425eeddc23b7259c9a43abd6e4285d3d6c9f87 Mon Sep 17 00:00:00 2001 From: ps5antq2e <1819276859@qq.com> Date: Tue, 24 Dec 2024 17:29:33 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8E=A5=E6=94=B6=E6=96=B9=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=EF=BC=8C=E8=BF=98=E5=B7=AEaes=E8=A7=A3=E5=AF=86=E5=92=8Crsa?= =?UTF-8?q?=E8=A7=A3=E5=AF=86=E9=AA=8C=E8=AF=81=E7=AD=BE=E5=90=8D=EF=BC=8C?= =?UTF-8?q?=E8=BF=9E=E6=8E=A5=E4=BA=A4=E4=BA=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- receiver_ui.py | 174 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 174 insertions(+) create mode 100644 receiver_ui.py diff --git a/receiver_ui.py b/receiver_ui.py new file mode 100644 index 0000000..4629b23 --- /dev/null +++ b/receiver_ui.py @@ -0,0 +1,174 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'receiver_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 +import json +from gmssl import sm4, func,sm2,sm3 +from PyQt5.QtWidgets import QMessageBox,QFileDialog +import socket +import sm2random +from OpenSSL import crypto +class Ui_MainWindow(object): + def setupUi(self, MainWindow,client): + MainWindow.setObjectName("MainWindow") + MainWindow.resize(800, 602) + self.centralwidget = QtWidgets.QWidget(MainWindow) + self.centralwidget.setObjectName("centralwidget") + self.textBrowser = QtWidgets.QTextBrowser(self.centralwidget) + self.textBrowser.setGeometry(QtCore.QRect(10, 10, 541, 501)) + self.textBrowser.setObjectName("textBrowser") + self.receive_button = QtWidgets.QPushButton(self.centralwidget) + self.receive_button.setGeometry(QtCore.QRect(560, 110, 121, 51)) + self.receive_button.setObjectName("receive_button") + self.decrypt_button = QtWidgets.QPushButton(self.centralwidget) + self.decrypt_button.setGeometry(QtCore.QRect(560, 160, 121, 51)) + self.decrypt_button.setObjectName("decrypt_button") + self.verify_button = QtWidgets.QPushButton(self.centralwidget) + self.verify_button.setGeometry(QtCore.QRect(560, 210, 121, 51)) + self.verify_button.setObjectName("verify_button") + MainWindow.setCentralWidget(self.centralwidget) + self.menubar = QtWidgets.QMenuBar(MainWindow) + self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 23)) + self.menubar.setObjectName("menubar") + MainWindow.setMenuBar(self.menubar) + self.statusbar = QtWidgets.QStatusBar(MainWindow) + self.statusbar.setObjectName("statusbar") + MainWindow.setStatusBar(self.statusbar) + #新增属性 + """ + self.file_path 明文的保存路径 + self.mode 加密模式 + self.algorithm 加密算法 + self.enc_key 加密后的对称密钥 + self.private_key 私钥 + self.public_key 公钥 + self.public_key_other 对方的公钥 + self.iv 初始向量iv + self.signature 签名 + self.encrypted_text 密文 + self.key 对称密钥 + """ + self.file_path= "" + self.mode = "" + self.algorithm = "" + self.enc_key = "" + #打开文件选择对话框 + QMessageBox.information(MainWindow, "提示", "请选择你的私钥文件") + path=QFileDialog.getOpenFileName()[0] + #弹出消息框 + with open(path, "rb") as f: + self.private_key = crypto.load_privatekey(crypto.FILETYPE_PEM, f.read()) + QMessageBox.information(MainWindow, "提示", "请选择你的公钥文件") + path=QFileDialog.getOpenFileName()[0] + with open(path, "rb") as f: + self.public_key = crypto.load_publickey(crypto.FILETYPE_PEM, f.read()) + QMessageBox.information(MainWindow, "提示", "请选择对方的公钥文件") + path=QFileDialog.getOpenFileName()[0] + with open(path, "rb") as f: + self.public_key_other = crypto.load_publickey(crypto.FILETYPE_PEM, f.read()) + self.iv = "" + self.encrypted_text = "" + self.key="" + self.retranslateUi(MainWindow) + self.receive_button.clicked.connect(self.receive) # type: ignore + self.decrypt_button.clicked.connect(self.decrypt) # type: ignore + self.verify_button.clicked.connect(self.verify) # type: ignore + QtCore.QMetaObject.connectSlotsByName(MainWindow) + #继承连接实例 + self.client = client + def retranslateUi(self, MainWindow): + _translate = QtCore.QCoreApplication.translate + MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) + self.receive_button.setText(_translate("MainWindow", "接收文件")) + self.decrypt_button.setText(_translate("MainWindow", "解密")) + self.verify_button.setText(_translate("MainWindow", "验证签名")) + def receive(self): + #接收信封并解封保存,加密后的对称密钥,密文,签名 + data = b"" + while True: + envelope_dict = self.client.recv(1024) + if not envelope_dict: + break + data += envelope_dict + # print(data.decode()) + envelope_dict = json.loads(data.decode('utf-8')) + self.signature= envelope_dict['signature'] + self.encrypted_text = envelope_dict['encrypted_text'] + self.enc_key = envelope_dict['enc_key'] + self.mode= envelope_dict['mode'] + self.algorithm= envelope_dict['algorithm'] + if self.mode=="CBC": + self.iv= envelope_dict['iv'] + self.decrypt_key() + self.decrypt() + self.client.close() + def decrypt_key(self): + #使用sm2私钥解密对称密钥self.enc_key,赋给self.key + sm2_crypt = sm2.CryptSM2(private_key=self.private_key,public_key=self.public_key,) + try: + self.key = sm2_crypt.decrypt(self.enc_key) + print("key:",self.key) + except Exception as e: + print(f"[!] Failed to decrypt SM4 key: {e}") + raise + def decrypt(self): + #根据模式和加密算法解密 + if self.algorithm=="AES": + if self.mode=="CBC": + pass + elif self.mode=="ECB": + pass + else: + print("error") + elif self.algorithm=="SM4": + if self.mode=="CBC": + sm4_crypt = sm4.CryptSM4() + sm4_crypt.set_key(self.key, sm4.SM4_DECRYPT) + plaintext=sm4_crypt.crypt_cbc(self.iv,self.encrypted_text) + save_path= QFileDialog.saveFileContent(MainWindow, "Save File", "default.txt", "All Files (*);;Text Files (*.txt)") + with open(save_path, "wb") as f: + f.write(plaintext) + self.textBrowser.append("解密文件已保存至",save_path) + elif self.mode=="ECB": + sm4_crypt = sm4.CryptSM4() + sm4_crypt.set_key(self.key, sm4.SM4_DECRYPT) + plaintext=sm4_crypt.crypt_ecb(self.encrypted_text) + save_path= QFileDialog.saveFileContent(MainWindow, "Save File", "default.txt", "All Files (*);;Text Files (*.txt)") + with open(save_path, "wb") as f: + f.write(plaintext) + self.textBrowser.append("解密文件已保存至",save_path) + else: + print("error") + else: + print("error") + def verify(self): + pass + #使用对方公钥验证签名 +if __name__ == "__main__": + app = QtWidgets.QApplication(sys.argv) + window = QtWidgets.QMainWindow() + ui = Ui_MainWindow() + client= socket.socket(socket.AF_INET,socket.SOCK_STREAM) + ui.setupUi(window,client) + window.show() + #发起连接 + while True: + try: + ui.client.settimeout(5) + ui.client.connect(('127.0.0.1', 5555)) + except socket.timeout: + ui.textBrowser.append("[!] Connection timed out, retrying...") + except socket.error as e: + ui.textBrowser.append(f"[!] Failed to connect to server: {e}") + break + finally: + ui.client.close() + sys.exit(app.exec_()) \ No newline at end of file