From 7484fd399939411fc322b58c224f762550596611 Mon Sep 17 00:00:00 2001 From: ps5antq2e <1819276859@qq.com> Date: Wed, 25 Dec 2024 21:43:16 +0800 Subject: [PATCH] =?UTF-8?q?=E9=AA=8C=E8=AF=81=E6=88=90=E5=8A=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- receiver_ui.py | 188 ++++++++++++++++++++++--------------------------- 1 file changed, 86 insertions(+), 102 deletions(-) diff --git a/receiver_ui.py b/receiver_ui.py index e7eb417..ce4f861 100644 --- a/receiver_ui.py +++ b/receiver_ui.py @@ -9,7 +9,7 @@ import base64 -from PyQt5.QtWidgets import QFileDialog,QMainWindow +from PyQt5.QtWidgets import QFileDialog, QMainWindow import socket from Crypto.Cipher import AES from binascii import b2a_hex, a2b_hex @@ -21,14 +21,16 @@ from Crypto.Hash import SHA512 from PyQt5 import QtCore, QtGui, QtWidgets import sys import json -from gmssl import sm4, func,sm2,sm3 -from PyQt5.QtWidgets import QMessageBox,QFileDialog +from gmssl import sm4, func, sm2, sm3 +from PyQt5.QtWidgets import QMessageBox, QFileDialog,QMainWindow import rsa -#import sm2random +# import sm2random from OpenSSL import crypto import pickle +import threading + class Ui_MainWindow(object): - def setupUi(self, MainWindow,receiver): + def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(800, 602) self.centralwidget = QtWidgets.QWidget(MainWindow) @@ -36,7 +38,7 @@ class Ui_MainWindow(object): self.textBrowser = QtWidgets.QTextBrowser(self.centralwidget) self.textBrowser.setGeometry(QtCore.QRect(10, 10, 541, 501)) self.textBrowser.setObjectName("textBrowser") - self.connect_button = QtWidgets.QPushButton(self.centralwidget) + self.connect_button = QtWidgets.QPushButton(self.centralwidget) self.connect_button.setGeometry(QtCore.QRect(560, 60, 121, 51)) self.connect_button.setObjectName("connect_button") self.receive_button = QtWidgets.QPushButton(self.centralwidget) @@ -56,7 +58,7 @@ class Ui_MainWindow(object): self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) - #新增属性 + # 新增属性 """ self.file_path 明文的保存路径 self.mode 加密模式 @@ -70,155 +72,137 @@ class Ui_MainWindow(object): self.encrypted_text 密文 self.key 对称密钥 """ - self.file_path= "" + self.file_path = "" self.mode = "" self.algorithm = "" self.enc_key = "" - #继承连接实例 - self.receiver = receiver - #打开文件选择对话框 + self.signature="" + # 打开文件选择对话框 QMessageBox.information(MainWindow, "提示", "请选择你的私钥文件") - path=QFileDialog.getOpenFileName()[0] - #弹出消息框 + path = QFileDialog.getOpenFileName()[0] + # 弹出消息框 with open(path, "rb") as f: - self.private_key = rsa.PrivateKey.load_pkcs1(f.read(),'DER') + self.private_key = rsa.PrivateKey.load_pkcs1(f.read(), 'DER') QMessageBox.information(MainWindow, "提示", "请选择你的公钥文件") - path=QFileDialog.getOpenFileName()[0] + path = QFileDialog.getOpenFileName()[0] with open(path, "rb") as f: self.public_key = rsa.PublicKey.load_pkcs1_openssl_pem(f.read()) QMessageBox.information(MainWindow, "提示", "请选择对方的公钥文件") - path=QFileDialog.getOpenFileName()[0] + path = QFileDialog.getOpenFileName()[0] with open(path, "rb") as f: self.public_key_other = rsa.PublicKey.load_pkcs1_openssl_pem(f.read()) self.iv = "" self.encrypted_text = "" - self.key="" - self.plaintext='' + self.key = "" + self.plaintext = '' 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 - self.connect_button.clicked.connect(self.connect) # type: ignore + self.receive_button.clicked.connect(self.receive) # type: ignore #原文为self.receive + self.decrypt_button.clicked.connect(self.decrypt) # type: ignore + self.verify_button.clicked.connect(self.verify) # type: ignore + self.connect_button.clicked.connect(self.connect) # type: ignore QtCore.QMetaObject.connectSlotsByName(MainWindow) + + def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) - self.connect_button.setText(_translate("MainWindow", "连接发送端")) + self.connect_button.setText(_translate("MainWindow", "连接发送端")) self.receive_button.setText(_translate("MainWindow", "接收文件")) self.decrypt_button.setText(_translate("MainWindow", "解密")) self.verify_button.setText(_translate("MainWindow", "验证签名")) - # 连接发送端 准备接收数据 + + + # 连接发送端 准备接收数据 def connect(self): self.receiver_conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.receiver_conn.connect(('localhost', 8888)) - QMessageBox.information(QMainWindow(), '提示', "已连接到服务端") - self.client = self.receiver_conn # 继承连接实例 - + QMessageBox.information(QMainWindow(), '提示', "已连接到服务端") + # self.client = self.receiver_conn # 继承连接实例 + + # 创建接收消息的线程 + # def thread_create(self): + # receive_thread = threading.Thread(target=self.receive) + # receive_thread.daemon = True + # receive_thread.start() + # 接收信封并解封保存,加密后的对称密钥,密文,签名 def receive(self): - #接收信封并解封保存,加密后的对称密钥,密文,签名 - # data = b"" + data = b"" # while True: - # sender_socket,addr = self.client.accept() - # while True: - # envelope_dict = sender_socket.recv(1024) - # if not envelope_dict: - # break - # data += envelope_dict - # break + envelope_dict = self.receiver_conn.recv(88888) + # if not envelope_dict: + # break + data += envelope_dict # #将字节流转换为字典 - print(data) envelope_dict = pickle.loads(data) - 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.receiver.close() + print(envelope_dict) + self.signature = envelope_dict['signature'] + self.encrypted_text = envelope_dict['ciphertext'] + self.enc_key = envelope_dict['key'] + self.mode = envelope_dict['mode'] + self.algorithm = envelope_dict['algorithm'] + if self.mode == "CBC": + self.iv = envelope_dict['iv'] + self.receiver_conn.close() def decrypt_key(self): - #使用rsa私钥解密对称密钥self.enc_key,赋给self.key + # 使用rsa私钥解密对称密钥self.enc_key,赋给self.key + if type(self.enc_key) != bytes: + self.enc_key = bytes(self.enc_key, 'utf-8') self.key = rsa.decrypt(self.enc_key, self.private_key) + print("key:",self.key) def decrypt(self): - #根据模式和加密算法解密 - # self.algorithm = self.algorithm_box.currentText() - # self.mode = self.mode_box.currentText() - self.algorithm = "AES" - self.mode = "CBC" - if self.algorithm=="AES": - if self.mode=="CBC": + # 根据模式和加密算法解密 + self.decrypt_key() + if self.algorithm == "AES": + if self.mode == "CBC": self.mode = AES.MODE_CBC - with open("ciphertext.bin", "rb") as f: - self.encrypted_text = f.read() - cryptor = AES.new(self.key, self.mode, self.key) self.plain_text = cryptor.decrypt(a2b_hex(self.encrypted_text)) - #print(plain_text) + print(self.plain_text) plaintext = b2a_hex(self.plain_text.rstrip(b'\0')).decode("utf-8") - self.textBrowser.append(plaintext) - - elif self.mode=="ECB": + self.textBrowser.append(bytes.fromhex(plaintext).decode("utf-8")) + elif self.mode == "ECB": self.mode = AES.MODE_ECB - with open("ciphertext.bin", "rb") as f: - self.encrypted_text = f.read() cryptor = AES.new(self.key, self.mode) self.plain_text = cryptor.decrypt(a2b_hex(self.encrypted_text)) - #print(plain_text) - plaintext = b2a_hex(plain_text.rstrip(b'\0')).decode("utf-8") - self.textBrowser.append(plaintext) - + plaintext = b2a_hex(self.plain_text.rstrip(b'\0')).decode("utf-8") + self.textBrowser.append(bytes.fromhex(plaintext).decode("utf-8")) else: - print("error") - elif self.algorithm=="SM4": - if self.mode=="CBC": + print("mode error") + elif self.algorithm == "SM4": + if self.mode == "CBC": sm4_crypt = sm4.CryptSM4() sm4_crypt.set_key(self.key, sm4.SM4_DECRYPT) - self.plaintext=sm4_crypt.crypt_cbc(self.iv,self.encrypted_text) - save_path= QFileDialog.saveFileContent(MainWindow, "Save File", "default.txt", "All Files (*);;Text Files (*.txt)") + self.plaintext = sm4_crypt.crypt_cbc(self.iv.encode(), bytes.fromhex(self.encrypted_text)) + #打开文件保存对话框 + QMessageBox.information(QMainWindow(), '提示',"选择文件保存路径") + save_path, _ = QFileDialog.getSaveFileName() with open(save_path, "wb") as f: - f.write(plaintext) - self.textBrowser.append("解密文件已保存至",save_path) - elif self.mode=="ECB": + f.write(self.plaintext) + self.textBrowser.append(self.plaintext.decode()) + elif self.mode == "ECB": sm4_crypt = sm4.CryptSM4() + print(self.key) sm4_crypt.set_key(self.key, sm4.SM4_DECRYPT) - self.plaintext=sm4_crypt.crypt_ecb(self.encrypted_text) - save_path= QFileDialog.saveFileContent(MainWindow, "Save File", "default.txt", "All Files (*);;Text Files (*.txt)") + self.plaintext = sm4_crypt.crypt_ecb(bytes.fromhex(self.encrypted_text)) + QMessageBox.information(QMainWindow(), '提示',"选择文件保存路径") + save_path, _ = QFileDialog.getSaveFileName() with open(save_path, "wb") as f: - f.write(plaintext) - self.textBrowser.append("解密文件已保存至",save_path) + f.write(self.plaintext) + self.textBrowser.append(self.plaintext.decode()) else: - print("error") + print("mode,error") else: - print("error") + print("algorithm,error") def verify(self): - #使用对方公钥验证签名 - # plaintext = """zhangruixiazhangruixiazhangruixia - # helloguet - # hellopython - # helloworld""" - # key = RSA.importKey(self.private_key) - # data = hashlib.sha512(plaintext.encode("utf-8")).hexdigest() - # h = SHA512.new(data.encode("utf-8")) - # #print(h) - # verifier = PKCS1_v1_5.new(key) - # with open("digitalsign.bin", "rb") as f: - # signature = f.read() - # signature = signature.decode("utf-8") - # if verifier.verify(h, base64.b64decode(signature)): - # self.textBrowser.append("验证成功") - # else: - # self.textBrowser.append("验证失败") - if rsa.verify(self.plaintext, self.signature,self.public_key): + if rsa.verify(self.plaintext,self.signature, self.public_key_other): self.textBrowser.append("验证成功") else: self.textBrowser.append("验证失败") -if __name__ == "__main__": +if __name__ == "__main__": app = QtWidgets.QApplication(sys.argv) window = QtWidgets.QMainWindow() ui = Ui_MainWindow() - ui.setupUi(window,receiver_conn) + ui.setupUi(window) window.show() sys.exit(app.exec_()) \ No newline at end of file