From 7ea485a30d6a59ab88a5f5b0dcf73d3a650c0f3f Mon Sep 17 00:00:00 2001 From: pvc6hnqgo <1961804136@qq.com> Date: Tue, 24 Dec 2024 18:59:18 +0800 Subject: [PATCH] Update receiver_ui.py --- receiver_ui.py | 408 ++++++++++++++++++++++++++++--------------------- 1 file changed, 235 insertions(+), 173 deletions(-) diff --git a/receiver_ui.py b/receiver_ui.py index 4629b23..847da35 100644 --- a/receiver_ui.py +++ b/receiver_ui.py @@ -1,174 +1,236 @@ -# -*- 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() +# -*- 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. + +import base64 + +from PyQt5.QtWidgets import QFileDialog,QMainWindow +import socket +from Crypto.Cipher import AES +from binascii import b2a_hex, a2b_hex +from Crypto.PublicKey import RSA +from Crypto.Cipher import PKCS1_OAEP +from Crypto.Signature import PKCS1_v1_5 +import hashlib +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 +#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 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() + def decrypt_key(self): + #使用rsa私钥解密对称密钥self.enc_key,赋给self.key + cipher_rsa = PKCS1_OAEP.new(self.private_key) + self.key = cipher_rsa.decrypt(f.read()) + def decrypt(self): + #根据模式和加密算法解密 + # self.algorithm = self.algorithm_box.currentText() + # self.mode = self.mode_box.currentText() + self.algorithm = "AES" + self.mode = "CBC" + with open("aeskey.txt",'rb') as f: + self.key = "1234567890abcdef".encode("utf-8") + 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) + 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) + + 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) + 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) + + 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): + #使用对方公钥验证签名 + 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 __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