验证成功

main
ps5antq2e 7 months ago
parent d53dc714df
commit 7484fd3999

@ -9,7 +9,7 @@
import base64
from PyQt5.QtWidgets import QFileDialog,QMainWindow
from PyQt5.QtWidgets import QFileDialog, QMainWindow
import socket
from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex
@ -21,14 +21,16 @@ 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
from gmssl import sm4, func, sm2, sm3
from PyQt5.QtWidgets import QMessageBox, QFileDialog,QMainWindow
import rsa
#import sm2random
# 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)
@ -36,7 +38,7 @@ class Ui_MainWindow(object):
self.textBrowser = QtWidgets.QTextBrowser(self.centralwidget)
self.textBrowser.setGeometry(QtCore.QRect(10, 10, 541, 501))
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.setObjectName("connect_button")
self.receive_button = QtWidgets.QPushButton(self.centralwidget)
@ -56,7 +58,7 @@ class Ui_MainWindow(object):
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
#新增属性
# 新增属性
"""
self.file_path 明文的保存路径
self.mode 加密模式
@ -70,155 +72,137 @@ class Ui_MainWindow(object):
self.encrypted_text 密文
self.key 对称密钥
"""
self.file_path= ""
self.file_path = ""
self.mode = ""
self.algorithm = ""
self.enc_key = ""
#继承连接实例
self.receiver = receiver
#打开文件选择对话框
self.signature=""
# 打开文件选择对话框
QMessageBox.information(MainWindow, "提示", "请选择你的私钥文件")
path=QFileDialog.getOpenFileName()[0]
#弹出消息框
path = QFileDialog.getOpenFileName()[0]
# 弹出消息框
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, "提示", "请选择你的公钥文件")
path=QFileDialog.getOpenFileName()[0]
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]
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.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
self.connect_button.clicked.connect(self.connect) # 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"))
self.connect_button.setText(_translate("MainWindow", "连接发送端"))
self.connect_button.setText(_translate("MainWindow", "连接发送端"))
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 # 继承连接实例
QMessageBox.information(QMainWindow(), '提示', "已连接到服务端")
# 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""
data = b""
# while True:
# sender_socket,addr = self.client.accept()
# while True:
# envelope_dict = sender_socket.recv(1024)
# if not envelope_dict:
# break
# data += envelope_dict
# break
envelope_dict = self.receiver_conn.recv(88888)
# if not envelope_dict:
# break
data += envelope_dict
# #将字节流转换为字典
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()
print(envelope_dict)
self.signature = envelope_dict['signature']
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.receiver_conn.close()
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)
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"
if self.algorithm=="AES":
if 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)
elif self.mode=="ECB":
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")
elif self.algorithm=="SM4":
if self.mode=="CBC":
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)
elif self.mode=="ECB":
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("验证失败")
if __name__ == "__main__":
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