验证成功

main
ps5antq2e 7 months ago
parent d53dc714df
commit 7484fd3999

@ -22,13 +22,15 @@ from PyQt5 import QtCore, QtGui, QtWidgets
import sys
import json
from gmssl import sm4, func, sm2, sm3
from PyQt5.QtWidgets import QMessageBox,QFileDialog
from PyQt5.QtWidgets import QMessageBox, QFileDialog,QMainWindow
import rsa
# 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)
@ -74,8 +76,7 @@ class Ui_MainWindow(object):
self.mode = ""
self.algorithm = ""
self.enc_key = ""
#继承连接实例
self.receiver = receiver
self.signature=""
# 打开文件选择对话框
QMessageBox.information(MainWindow, "提示", "请选择你的私钥文件")
path = QFileDialog.getOpenFileName()[0]
@ -95,11 +96,13 @@ class Ui_MainWindow(object):
self.key = ""
self.plaintext = ''
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.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"))
@ -107,111 +110,92 @@ class Ui_MainWindow(object):
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 # 继承连接实例
# 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""
# while True:
# sender_socket,addr = self.client.accept()
data = b""
# while True:
# envelope_dict = sender_socket.recv(1024)
envelope_dict = self.receiver_conn.recv(88888)
# if not envelope_dict:
# break
# data += envelope_dict
# break
data += envelope_dict
# #将字节流转换为字典
print(data)
envelope_dict = pickle.loads(data)
print(envelope_dict)
self.signature = envelope_dict['signature']
self.encrypted_text = envelope_dict['encrypted_text']
self.enc_key = envelope_dict['enc_key']
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.decrypt_key()
self.decrypt()
self.receiver.close()
self.receiver_conn.close()
def decrypt_key(self):
# 使用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"
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)
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")
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)
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("验证失败")
@ -219,6 +203,6 @@ 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_())
Loading…
Cancel
Save