验证成功

main
ps5antq2e 7 months ago
parent d53dc714df
commit 7484fd3999

@ -9,7 +9,7 @@
import base64 import base64
from PyQt5.QtWidgets import QFileDialog,QMainWindow from PyQt5.QtWidgets import QFileDialog, QMainWindow
import socket import socket
from Crypto.Cipher import AES from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex from binascii import b2a_hex, a2b_hex
@ -21,14 +21,16 @@ from Crypto.Hash import SHA512
from PyQt5 import QtCore, QtGui, QtWidgets 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)
@ -36,7 +38,7 @@ class Ui_MainWindow(object):
self.textBrowser = QtWidgets.QTextBrowser(self.centralwidget) self.textBrowser = QtWidgets.QTextBrowser(self.centralwidget)
self.textBrowser.setGeometry(QtCore.QRect(10, 10, 541, 501)) self.textBrowser.setGeometry(QtCore.QRect(10, 10, 541, 501))
self.textBrowser.setObjectName("textBrowser") 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.setGeometry(QtCore.QRect(560, 60, 121, 51))
self.connect_button.setObjectName("connect_button") self.connect_button.setObjectName("connect_button")
self.receive_button = QtWidgets.QPushButton(self.centralwidget) self.receive_button = QtWidgets.QPushButton(self.centralwidget)
@ -56,7 +58,7 @@ class Ui_MainWindow(object):
self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar") self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar) MainWindow.setStatusBar(self.statusbar)
#新增属性 # 新增属性
""" """
self.file_path 明文的保存路径 self.file_path 明文的保存路径
self.mode 加密模式 self.mode 加密模式
@ -70,155 +72,137 @@ class Ui_MainWindow(object):
self.encrypted_text 密文 self.encrypted_text 密文
self.key 对称密钥 self.key 对称密钥
""" """
self.file_path= "" self.file_path = ""
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]
#弹出消息框 # 弹出消息框
with open(path, "rb") as f: 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, "提示", "请选择你的公钥文件") QMessageBox.information(MainWindow, "提示", "请选择你的公钥文件")
path=QFileDialog.getOpenFileName()[0] path = QFileDialog.getOpenFileName()[0]
with open(path, "rb") as f: with open(path, "rb") as f:
self.public_key = rsa.PublicKey.load_pkcs1_openssl_pem(f.read()) self.public_key = rsa.PublicKey.load_pkcs1_openssl_pem(f.read())
QMessageBox.information(MainWindow, "提示", "请选择对方的公钥文件") QMessageBox.information(MainWindow, "提示", "请选择对方的公钥文件")
path=QFileDialog.getOpenFileName()[0] path = QFileDialog.getOpenFileName()[0]
with open(path, "rb") as f: with open(path, "rb") as f:
self.public_key_other = rsa.PublicKey.load_pkcs1_openssl_pem(f.read()) self.public_key_other = rsa.PublicKey.load_pkcs1_openssl_pem(f.read())
self.iv = "" self.iv = ""
self.encrypted_text = "" self.encrypted_text = ""
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"))
self.connect_button.setText(_translate("MainWindow", "连接发送端")) self.connect_button.setText(_translate("MainWindow", "连接发送端"))
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: # while True:
# sender_socket,addr = self.client.accept() envelope_dict = self.receiver_conn.recv(88888)
# while True: # if not envelope_dict:
# envelope_dict = sender_socket.recv(1024) # break
# if not envelope_dict: data += envelope_dict
# break
# data += envelope_dict
# break
# #将字节流转换为字典 # #将字节流转换为字典
print(data)
envelope_dict = pickle.loads(data) envelope_dict = pickle.loads(data)
self.signature= envelope_dict['signature'] print(envelope_dict)
self.encrypted_text = envelope_dict['encrypted_text'] self.signature = envelope_dict['signature']
self.enc_key = envelope_dict['enc_key'] self.encrypted_text = envelope_dict['ciphertext']
self.mode= envelope_dict['mode'] self.enc_key = envelope_dict['key']
self.algorithm= envelope_dict['algorithm'] self.mode = envelope_dict['mode']
if self.mode=="CBC": self.algorithm = envelope_dict['algorithm']
self.iv= envelope_dict['iv'] if self.mode == "CBC":
self.decrypt_key() self.iv = envelope_dict['iv']
self.decrypt() self.receiver_conn.close()
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() if self.algorithm == "AES":
self.algorithm = "AES" if self.mode == "CBC":
self.mode = "CBC"
if self.algorithm=="AES":
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("验证失败")
if __name__ == "__main__": 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