Update receiver_ui.py

main
pvc6hnqgo 7 months ago
parent 04425eeddc
commit 7ea485a30d

@ -1,174 +1,236 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'receiver_ui.ui' # Form implementation generated from reading ui file 'receiver_ui.ui'
# #
# Created by: PyQt5 UI code generator 5.15.9 # Created by: PyQt5 UI code generator 5.15.9
# #
# WARNING: Any manual changes made to this file will be lost when pyuic5 is # 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. # run again. Do not edit this file unless you know what you are doing.
import base64
from PyQt5 import QtCore, QtGui, QtWidgets
import sys from PyQt5.QtWidgets import QFileDialog,QMainWindow
import json import socket
from gmssl import sm4, func,sm2,sm3 from Crypto.Cipher import AES
from PyQt5.QtWidgets import QMessageBox,QFileDialog from binascii import b2a_hex, a2b_hex
import socket from Crypto.PublicKey import RSA
import sm2random from Crypto.Cipher import PKCS1_OAEP
from OpenSSL import crypto from Crypto.Signature import PKCS1_v1_5
class Ui_MainWindow(object): import hashlib
def setupUi(self, MainWindow,client): from Crypto.Hash import SHA512
MainWindow.setObjectName("MainWindow") from PyQt5 import QtCore, QtGui, QtWidgets
MainWindow.resize(800, 602) import sys
self.centralwidget = QtWidgets.QWidget(MainWindow) import json
self.centralwidget.setObjectName("centralwidget") from gmssl import sm4, func,sm2,sm3
self.textBrowser = QtWidgets.QTextBrowser(self.centralwidget) from PyQt5.QtWidgets import QMessageBox,QFileDialog
self.textBrowser.setGeometry(QtCore.QRect(10, 10, 541, 501)) #import sm2random
self.textBrowser.setObjectName("textBrowser") from OpenSSL import crypto
self.receive_button = QtWidgets.QPushButton(self.centralwidget) class Ui_MainWindow(object):
self.receive_button.setGeometry(QtCore.QRect(560, 110, 121, 51)) def setupUi(self, MainWindow,client):
self.receive_button.setObjectName("receive_button") MainWindow.setObjectName("MainWindow")
self.decrypt_button = QtWidgets.QPushButton(self.centralwidget) MainWindow.resize(800, 602)
self.decrypt_button.setGeometry(QtCore.QRect(560, 160, 121, 51)) self.centralwidget = QtWidgets.QWidget(MainWindow)
self.decrypt_button.setObjectName("decrypt_button") self.centralwidget.setObjectName("centralwidget")
self.verify_button = QtWidgets.QPushButton(self.centralwidget) self.textBrowser = QtWidgets.QTextBrowser(self.centralwidget)
self.verify_button.setGeometry(QtCore.QRect(560, 210, 121, 51)) self.textBrowser.setGeometry(QtCore.QRect(10, 10, 541, 501))
self.verify_button.setObjectName("verify_button") self.textBrowser.setObjectName("textBrowser")
MainWindow.setCentralWidget(self.centralwidget) self.receive_button = QtWidgets.QPushButton(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow) self.receive_button.setGeometry(QtCore.QRect(560, 110, 121, 51))
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 23)) self.receive_button.setObjectName("receive_button")
self.menubar.setObjectName("menubar") self.decrypt_button = QtWidgets.QPushButton(self.centralwidget)
MainWindow.setMenuBar(self.menubar) self.decrypt_button.setGeometry(QtCore.QRect(560, 160, 121, 51))
self.statusbar = QtWidgets.QStatusBar(MainWindow) self.decrypt_button.setObjectName("decrypt_button")
self.statusbar.setObjectName("statusbar") self.verify_button = QtWidgets.QPushButton(self.centralwidget)
MainWindow.setStatusBar(self.statusbar) self.verify_button.setGeometry(QtCore.QRect(560, 210, 121, 51))
#新增属性 self.verify_button.setObjectName("verify_button")
""" MainWindow.setCentralWidget(self.centralwidget)
self.file_path 明文的保存路径 self.menubar = QtWidgets.QMenuBar(MainWindow)
self.mode 加密模式 self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 23))
self.algorithm 加密算法 self.menubar.setObjectName("menubar")
self.enc_key 加密后的对称密钥 MainWindow.setMenuBar(self.menubar)
self.private_key 私钥 self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.public_key 公钥 self.statusbar.setObjectName("statusbar")
self.public_key_other 对方的公钥 MainWindow.setStatusBar(self.statusbar)
self.iv 初始向量iv #新增属性
self.signature 签名 """
self.encrypted_text 密文 self.file_path 明文的保存路径
self.key 对称密钥 self.mode 加密模式
""" self.algorithm 加密算法
self.file_path= "" self.enc_key 加密后的对称密钥
self.mode = "" self.private_key 私钥
self.algorithm = "" self.public_key 公钥
self.enc_key = "" self.public_key_other 对方的公钥
#打开文件选择对话框 self.iv 初始向量iv
QMessageBox.information(MainWindow, "提示", "请选择你的私钥文件") self.signature 签名
path=QFileDialog.getOpenFileName()[0] self.encrypted_text 密文
#弹出消息框 self.key 对称密钥
with open(path, "rb") as f: """
self.private_key = crypto.load_privatekey(crypto.FILETYPE_PEM, f.read()) self.file_path= ""
QMessageBox.information(MainWindow, "提示", "请选择你的公钥文件") self.mode = ""
path=QFileDialog.getOpenFileName()[0] self.algorithm = ""
with open(path, "rb") as f: self.enc_key = ""
self.public_key = crypto.load_publickey(crypto.FILETYPE_PEM, f.read())
QMessageBox.information(MainWindow, "提示", "请选择对方的公钥文件") #打开文件选择对话框
path=QFileDialog.getOpenFileName()[0] QMessageBox.information(MainWindow, "提示", "请选择你的私钥文件")
with open(path, "rb") as f: path=QFileDialog.getOpenFileName()[0]
self.public_key_other = crypto.load_publickey(crypto.FILETYPE_PEM, f.read()) #弹出消息框
self.iv = "" with open(path, "rb") as f:
self.encrypted_text = "" self.private_key = crypto.load_privatekey(crypto.FILETYPE_PEM, f.read())
self.key="" QMessageBox.information(MainWindow, "提示", "请选择你的公钥文件")
self.retranslateUi(MainWindow) path=QFileDialog.getOpenFileName()[0]
self.receive_button.clicked.connect(self.receive) # type: ignore with open(path, "rb") as f:
self.decrypt_button.clicked.connect(self.decrypt) # type: ignore self.public_key = crypto.load_publickey(crypto.FILETYPE_PEM, f.read())
self.verify_button.clicked.connect(self.verify) # type: ignore QMessageBox.information(MainWindow, "提示", "请选择对方的公钥文件")
QtCore.QMetaObject.connectSlotsByName(MainWindow) path=QFileDialog.getOpenFileName()[0]
#继承连接实例 with open(path, "rb") as f:
self.client = client self.public_key_other = crypto.load_publickey(crypto.FILETYPE_PEM, f.read())
def retranslateUi(self, MainWindow): self.iv = ""
_translate = QtCore.QCoreApplication.translate self.encrypted_text = ""
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) self.key=""
self.receive_button.setText(_translate("MainWindow", "接收文件")) self.retranslateUi(MainWindow)
self.decrypt_button.setText(_translate("MainWindow", "解密")) self.receive_button.clicked.connect(self.receive) # type: ignore
self.verify_button.setText(_translate("MainWindow", "验证签名")) self.decrypt_button.clicked.connect(self.decrypt) # type: ignore
def receive(self): self.verify_button.clicked.connect(self.verify) # type: ignore
#接收信封并解封保存,加密后的对称密钥,密文,签名 QtCore.QMetaObject.connectSlotsByName(MainWindow)
data = b"" #继承连接实例
while True: self.client = client
envelope_dict = self.client.recv(1024) def retranslateUi(self, MainWindow):
if not envelope_dict: _translate = QtCore.QCoreApplication.translate
break MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
data += envelope_dict self.receive_button.setText(_translate("MainWindow", "接收文件"))
# print(data.decode()) self.decrypt_button.setText(_translate("MainWindow", "解密"))
envelope_dict = json.loads(data.decode('utf-8')) self.verify_button.setText(_translate("MainWindow", "验证签名"))
self.signature= envelope_dict['signature'] def receive(self):
self.encrypted_text = envelope_dict['encrypted_text'] #接收信封并解封保存,加密后的对称密钥,密文,签名
self.enc_key = envelope_dict['enc_key'] data = b""
self.mode= envelope_dict['mode'] while True:
self.algorithm= envelope_dict['algorithm'] envelope_dict = self.client.recv(1024)
if self.mode=="CBC": if not envelope_dict:
self.iv= envelope_dict['iv'] break
self.decrypt_key() data += envelope_dict
self.decrypt() # print(data.decode())
self.client.close() envelope_dict = json.loads(data.decode('utf-8'))
def decrypt_key(self): self.signature= envelope_dict['signature']
#使用sm2私钥解密对称密钥self.enc_key,赋给self.key self.encrypted_text = envelope_dict['encrypted_text']
sm2_crypt = sm2.CryptSM2(private_key=self.private_key,public_key=self.public_key,) self.enc_key = envelope_dict['enc_key']
try: self.mode= envelope_dict['mode']
self.key = sm2_crypt.decrypt(self.enc_key) self.algorithm= envelope_dict['algorithm']
print("key:",self.key) if self.mode=="CBC":
except Exception as e: self.iv= envelope_dict['iv']
print(f"[!] Failed to decrypt SM4 key: {e}") self.decrypt_key()
raise self.decrypt()
def decrypt(self): self.client.close()
#根据模式和加密算法解密 def receive(self):
if self.algorithm=="AES": #接收信封并解封保存,加密后的对称密钥,密文,签名
if self.mode=="CBC": data = b""
pass while True:
elif self.mode=="ECB": envelope_dict = self.client.recv(1024)
pass if not envelope_dict:
else: break
print("error") data += envelope_dict
elif self.algorithm=="SM4": # print(data.decode())
if self.mode=="CBC": envelope_dict = json.loads(data.decode('utf-8'))
sm4_crypt = sm4.CryptSM4() self.signature= envelope_dict['signature']
sm4_crypt.set_key(self.key, sm4.SM4_DECRYPT) self.encrypted_text = envelope_dict['encrypted_text']
plaintext=sm4_crypt.crypt_cbc(self.iv,self.encrypted_text) self.enc_key = envelope_dict['enc_key']
save_path= QFileDialog.saveFileContent(MainWindow, "Save File", "default.txt", "All Files (*);;Text Files (*.txt)") self.mode= envelope_dict['mode']
with open(save_path, "wb") as f: self.algorithm= envelope_dict['algorithm']
f.write(plaintext) if self.mode=="CBC":
self.textBrowser.append("解密文件已保存至",save_path) self.iv= envelope_dict['iv']
elif self.mode=="ECB": self.decrypt_key()
sm4_crypt = sm4.CryptSM4() self.decrypt()
sm4_crypt.set_key(self.key, sm4.SM4_DECRYPT) def decrypt_key(self):
plaintext=sm4_crypt.crypt_ecb(self.encrypted_text) #使用rsa私钥解密对称密钥self.enc_key,赋给self.key
save_path= QFileDialog.saveFileContent(MainWindow, "Save File", "default.txt", "All Files (*);;Text Files (*.txt)") cipher_rsa = PKCS1_OAEP.new(self.private_key)
with open(save_path, "wb") as f: self.key = cipher_rsa.decrypt(f.read())
f.write(plaintext) def decrypt(self):
self.textBrowser.append("解密文件已保存至",save_path) #根据模式和加密算法解密
else: # self.algorithm = self.algorithm_box.currentText()
print("error") # self.mode = self.mode_box.currentText()
else: self.algorithm = "AES"
print("error") self.mode = "CBC"
def verify(self): with open("aeskey.txt",'rb') as f:
pass self.key = "1234567890abcdef".encode("utf-8")
#使用对方公钥验证签名 if self.algorithm=="AES":
if __name__ == "__main__": if self.mode=="CBC":
app = QtWidgets.QApplication(sys.argv) self.mode = AES.MODE_CBC
window = QtWidgets.QMainWindow() with open("ciphertext.bin", "rb") as f:
ui = Ui_MainWindow() self.encrypted_text = f.read()
client= socket.socket(socket.AF_INET,socket.SOCK_STREAM)
ui.setupUi(window,client) cryptor = AES.new(self.key, self.mode, self.key)
window.show() plain_text = cryptor.decrypt(a2b_hex(self.encrypted_text))
#发起连接 #print(plain_text)
while True: plaintext = b2a_hex(plain_text.rstrip(b'\0')).decode("utf-8")
try: self.textBrowser.append(plaintext)
ui.client.settimeout(5)
ui.client.connect(('127.0.0.1', 5555)) elif self.mode=="ECB":
except socket.timeout: self.mode = AES.MODE_ECB
ui.textBrowser.append("[!] Connection timed out, retrying...") with open("ciphertext.bin", "rb") as f:
except socket.error as e: self.encrypted_text = f.read()
ui.textBrowser.append(f"[!] Failed to connect to server: {e}") cryptor = AES.new(self.key, self.mode)
break plain_text = cryptor.decrypt(a2b_hex(self.encrypted_text))
finally: #print(plain_text)
ui.client.close() 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)
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)
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("验证失败")
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
window = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
client= socket.socket(socket.AF_INET,socket.SOCK_STREAM)
ui.setupUi(window,client)
window.show()
#发起连接
while True:
try:
ui.client.settimeout(5)
ui.client.connect(('127.0.0.1', 5555))
except socket.timeout:
ui.textBrowser.append("[!] Connection timed out, retrying...")
except socket.error as e:
ui.textBrowser.append(f"[!] Failed to connect to server: {e}")
break
finally:
ui.client.close()
sys.exit(app.exec_()) sys.exit(app.exec_())
Loading…
Cancel
Save