验证成功

main
ps5antq2e 7 months ago
parent d53dc714df
commit 7484fd3999

@ -22,13 +22,15 @@ from PyQt5 import QtCore, QtGui, QtWidgets
import sys import sys
import json import json
from gmssl import sm4, func, sm2, sm3 from gmssl import sm4, func, sm2, sm3
from PyQt5.QtWidgets import QMessageBox,QFileDialog from PyQt5.QtWidgets import QMessageBox, QFileDialog,QMainWindow
import rsa import rsa
# import sm2random # import sm2random
from OpenSSL import crypto from OpenSSL import crypto
import pickle import pickle
import threading
class Ui_MainWindow(object): class Ui_MainWindow(object):
def setupUi(self, MainWindow,receiver): def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow") MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 602) MainWindow.resize(800, 602)
self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget = QtWidgets.QWidget(MainWindow)
@ -74,8 +76,7 @@ class Ui_MainWindow(object):
self.mode = "" self.mode = ""
self.algorithm = "" self.algorithm = ""
self.enc_key = "" self.enc_key = ""
#继承连接实例 self.signature=""
self.receiver = receiver
# 打开文件选择对话框 # 打开文件选择对话框
QMessageBox.information(MainWindow, "提示", "请选择你的私钥文件") QMessageBox.information(MainWindow, "提示", "请选择你的私钥文件")
path = QFileDialog.getOpenFileName()[0] path = QFileDialog.getOpenFileName()[0]
@ -95,11 +96,13 @@ class Ui_MainWindow(object):
self.key = "" self.key = ""
self.plaintext = '' self.plaintext = ''
self.retranslateUi(MainWindow) self.retranslateUi(MainWindow)
self.receive_button.clicked.connect(self.receive) # type: ignore self.receive_button.clicked.connect(self.receive) # type: ignore #原文为self.receive
self.decrypt_button.clicked.connect(self.decrypt) # type: ignore self.decrypt_button.clicked.connect(self.decrypt) # type: ignore
self.verify_button.clicked.connect(self.verify) # type: ignore self.verify_button.clicked.connect(self.verify) # type: ignore
self.connect_button.clicked.connect(self.connect) # type: ignore self.connect_button.clicked.connect(self.connect) # type: ignore
QtCore.QMetaObject.connectSlotsByName(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow): def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate _translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
@ -107,111 +110,92 @@ class Ui_MainWindow(object):
self.receive_button.setText(_translate("MainWindow", "接收文件")) self.receive_button.setText(_translate("MainWindow", "接收文件"))
self.decrypt_button.setText(_translate("MainWindow", "解密")) self.decrypt_button.setText(_translate("MainWindow", "解密"))
self.verify_button.setText(_translate("MainWindow", "验证签名")) self.verify_button.setText(_translate("MainWindow", "验证签名"))
# 连接发送端 准备接收数据 # 连接发送端 准备接收数据
def connect(self): def connect(self):
self.receiver_conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.receiver_conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.receiver_conn.connect(('localhost', 8888)) self.receiver_conn.connect(('localhost', 8888))
QMessageBox.information(QMainWindow(), '提示', "已连接到服务端") QMessageBox.information(QMainWindow(), '提示', "已连接到服务端")
self.client = self.receiver_conn # 继承连接实例 # 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): def receive(self):
#接收信封并解封保存,加密后的对称密钥,密文,签名 data = b""
# data = b""
# while True:
# sender_socket,addr = self.client.accept()
# while True: # while True:
# envelope_dict = sender_socket.recv(1024) envelope_dict = self.receiver_conn.recv(88888)
# if not envelope_dict: # if not envelope_dict:
# break # break
# data += envelope_dict data += envelope_dict
# break
# #将字节流转换为字典 # #将字节流转换为字典
print(data)
envelope_dict = pickle.loads(data) envelope_dict = pickle.loads(data)
print(envelope_dict)
self.signature = envelope_dict['signature'] self.signature = envelope_dict['signature']
self.encrypted_text = envelope_dict['encrypted_text'] self.encrypted_text = envelope_dict['ciphertext']
self.enc_key = envelope_dict['enc_key'] self.enc_key = envelope_dict['key']
self.mode = envelope_dict['mode'] self.mode = envelope_dict['mode']
self.algorithm = envelope_dict['algorithm'] self.algorithm = envelope_dict['algorithm']
if self.mode == "CBC": if self.mode == "CBC":
self.iv = envelope_dict['iv'] self.iv = envelope_dict['iv']
self.decrypt_key() self.receiver_conn.close()
self.decrypt()
self.receiver.close()
def decrypt_key(self): 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) self.key = rsa.decrypt(self.enc_key, self.private_key)
print("key:",self.key)
def decrypt(self): def decrypt(self):
# 根据模式和加密算法解密 # 根据模式和加密算法解密
# self.algorithm = self.algorithm_box.currentText() self.decrypt_key()
# self.mode = self.mode_box.currentText()
self.algorithm = "AES"
self.mode = "CBC"
if self.algorithm == "AES": if self.algorithm == "AES":
if self.mode == "CBC": if self.mode == "CBC":
self.mode = AES.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) cryptor = AES.new(self.key, self.mode, self.key)
self.plain_text = cryptor.decrypt(a2b_hex(self.encrypted_text)) 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") plaintext = b2a_hex(self.plain_text.rstrip(b'\0')).decode("utf-8")
self.textBrowser.append(plaintext) self.textBrowser.append(bytes.fromhex(plaintext).decode("utf-8"))
elif self.mode == "ECB": elif self.mode == "ECB":
self.mode = AES.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) cryptor = AES.new(self.key, self.mode)
self.plain_text = cryptor.decrypt(a2b_hex(self.encrypted_text)) 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")
plaintext = b2a_hex(plain_text.rstrip(b'\0')).decode("utf-8") self.textBrowser.append(bytes.fromhex(plaintext).decode("utf-8"))
self.textBrowser.append(plaintext)
else: else:
print("error") print("mode error")
elif self.algorithm == "SM4": elif self.algorithm == "SM4":
if self.mode == "CBC": if self.mode == "CBC":
sm4_crypt = sm4.CryptSM4() sm4_crypt = sm4.CryptSM4()
sm4_crypt.set_key(self.key, sm4.SM4_DECRYPT) sm4_crypt.set_key(self.key, sm4.SM4_DECRYPT)
self.plaintext=sm4_crypt.crypt_cbc(self.iv,self.encrypted_text) self.plaintext = sm4_crypt.crypt_cbc(self.iv.encode(), bytes.fromhex(self.encrypted_text))
save_path= QFileDialog.saveFileContent(MainWindow, "Save File", "default.txt", "All Files (*);;Text Files (*.txt)") #打开文件保存对话框
QMessageBox.information(QMainWindow(), '提示',"选择文件保存路径")
save_path, _ = QFileDialog.getSaveFileName()
with open(save_path, "wb") as f: with open(save_path, "wb") as f:
f.write(plaintext) f.write(self.plaintext)
self.textBrowser.append("解密文件已保存至",save_path) self.textBrowser.append(self.plaintext.decode())
elif self.mode == "ECB": elif self.mode == "ECB":
sm4_crypt = sm4.CryptSM4() sm4_crypt = sm4.CryptSM4()
print(self.key)
sm4_crypt.set_key(self.key, sm4.SM4_DECRYPT) sm4_crypt.set_key(self.key, sm4.SM4_DECRYPT)
self.plaintext=sm4_crypt.crypt_ecb(self.encrypted_text) self.plaintext = sm4_crypt.crypt_ecb(bytes.fromhex(self.encrypted_text))
save_path= QFileDialog.saveFileContent(MainWindow, "Save File", "default.txt", "All Files (*);;Text Files (*.txt)") QMessageBox.information(QMainWindow(), '提示',"选择文件保存路径")
save_path, _ = QFileDialog.getSaveFileName()
with open(save_path, "wb") as f: with open(save_path, "wb") as f:
f.write(plaintext) f.write(self.plaintext)
self.textBrowser.append("解密文件已保存至",save_path) self.textBrowser.append(self.plaintext.decode())
else: else:
print("error") print("mode,error")
else: else:
print("error") print("algorithm,error")
def verify(self): def verify(self):
#使用对方公钥验证签名 if rsa.verify(self.plaintext,self.signature, self.public_key_other):
# 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):
self.textBrowser.append("验证成功") self.textBrowser.append("验证成功")
else: else:
self.textBrowser.append("验证失败") self.textBrowser.append("验证失败")
@ -219,6 +203,6 @@ if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv) app = QtWidgets.QApplication(sys.argv)
window = QtWidgets.QMainWindow() window = QtWidgets.QMainWindow()
ui = Ui_MainWindow() ui = Ui_MainWindow()
ui.setupUi(window,receiver_conn) ui.setupUi(window)
window.show() window.show()
sys.exit(app.exec_()) sys.exit(app.exec_())
Loading…
Cancel
Save