# -*- 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 rsa #import sm2random from OpenSSL import crypto import pickle class Ui_MainWindow(object): def setupUi(self, MainWindow,receiver): 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 = "" #继承连接实例 self.receiver = receiver #打开文件选择对话框 QMessageBox.information(MainWindow, "提示", "请选择你的私钥文件") path=QFileDialog.getOpenFileName()[0] #弹出消息框 with open(path, "rb") as f: self.private_key = rsa.PrivateKey.load_pkcs1(f.read(),'DER') QMessageBox.information(MainWindow, "提示", "请选择你的公钥文件") 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] 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.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) 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: sender_socket,addr = self.receiver.accept() while True: envelope_dict = sender_socket.recv(1024) if not envelope_dict: break data += envelope_dict break #将字节流转换为字典 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() def decrypt_key(self): #使用rsa私钥解密对称密钥self.enc_key,赋给self.key self.key = rsa.decrypt(self.enc_key, self.private_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.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) plaintext = b2a_hex(self.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) 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) else: print("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)") 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) self.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("验证失败") digest= hashlib.sha256(self.plaintext.encode("utf-8")).digest() if rsa.verify(self.public_key, digest, self.signature): self.textBrowser.append("验证成功") else: self.textBrowser.append("验证失败") if __name__ == "__main__": app = QtWidgets.QApplication(sys.argv) window = QtWidgets.QMainWindow() ui = Ui_MainWindow() #接收方建立连接 等待发送方连接 receiver_conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM) receiver_conn.bind(('localhost', 8888)) receiver_conn.listen(5) ui.setupUi(window,receiver_conn) window.show() sys.exit(app.exec_())