Update receiver_ui.py

main
pvc6hnqgo 2 months ago
parent 04425eeddc
commit 7ea485a30d

@ -1,174 +1,236 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'receiver_ui.ui'
#
# Created by: PyQt5 UI code generator 5.15.9
#
# 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.
from PyQt5 import QtCore, QtGui, QtWidgets
import sys
import json
from gmssl import sm4, func,sm2,sm3
from PyQt5.QtWidgets import QMessageBox,QFileDialog
import socket
import sm2random
from OpenSSL import crypto
class Ui_MainWindow(object):
def setupUi(self, MainWindow,client):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 602)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.textBrowser = QtWidgets.QTextBrowser(self.centralwidget)
self.textBrowser.setGeometry(QtCore.QRect(10, 10, 541, 501))
self.textBrowser.setObjectName("textBrowser")
self.receive_button = QtWidgets.QPushButton(self.centralwidget)
self.receive_button.setGeometry(QtCore.QRect(560, 110, 121, 51))
self.receive_button.setObjectName("receive_button")
self.decrypt_button = QtWidgets.QPushButton(self.centralwidget)
self.decrypt_button.setGeometry(QtCore.QRect(560, 160, 121, 51))
self.decrypt_button.setObjectName("decrypt_button")
self.verify_button = QtWidgets.QPushButton(self.centralwidget)
self.verify_button.setGeometry(QtCore.QRect(560, 210, 121, 51))
self.verify_button.setObjectName("verify_button")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 23))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
#新增属性
"""
self.file_path 明文的保存路径
self.mode 加密模式
self.algorithm 加密算法
self.enc_key 加密后的对称密钥
self.private_key 私钥
self.public_key 公钥
self.public_key_other 对方的公钥
self.iv 初始向量iv
self.signature 签名
self.encrypted_text 密文
self.key 对称密钥
"""
self.file_path= ""
self.mode = ""
self.algorithm = ""
self.enc_key = ""
#打开文件选择对话框
QMessageBox.information(MainWindow, "提示", "请选择你的私钥文件")
path=QFileDialog.getOpenFileName()[0]
#弹出消息框
with open(path, "rb") as f:
self.private_key = crypto.load_privatekey(crypto.FILETYPE_PEM, f.read())
QMessageBox.information(MainWindow, "提示", "请选择你的公钥文件")
path=QFileDialog.getOpenFileName()[0]
with open(path, "rb") as f:
self.public_key = crypto.load_publickey(crypto.FILETYPE_PEM, f.read())
QMessageBox.information(MainWindow, "提示", "请选择对方的公钥文件")
path=QFileDialog.getOpenFileName()[0]
with open(path, "rb") as f:
self.public_key_other = crypto.load_publickey(crypto.FILETYPE_PEM, f.read())
self.iv = ""
self.encrypted_text = ""
self.key=""
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
QtCore.QMetaObject.connectSlotsByName(MainWindow)
#继承连接实例
self.client = client
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.receive_button.setText(_translate("MainWindow", "接收文件"))
self.decrypt_button.setText(_translate("MainWindow", "解密"))
self.verify_button.setText(_translate("MainWindow", "验证签名"))
def receive(self):
#接收信封并解封保存,加密后的对称密钥,密文,签名
data = b""
while True:
envelope_dict = self.client.recv(1024)
if not envelope_dict:
break
data += envelope_dict
# print(data.decode())
envelope_dict = json.loads(data.decode('utf-8'))
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.client.close()
def decrypt_key(self):
#使用sm2私钥解密对称密钥self.enc_key,赋给self.key
sm2_crypt = sm2.CryptSM2(private_key=self.private_key,public_key=self.public_key,)
try:
self.key = sm2_crypt.decrypt(self.enc_key)
print("key:",self.key)
except Exception as e:
print(f"[!] Failed to decrypt SM4 key: {e}")
raise
def decrypt(self):
#根据模式和加密算法解密
if self.algorithm=="AES":
if self.mode=="CBC":
pass
elif self.mode=="ECB":
pass
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):
pass
#使用对方公钥验证签名
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()
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'receiver_ui.ui'
#
# Created by: PyQt5 UI code generator 5.15.9
#
# 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.
import base64
from PyQt5.QtWidgets import QFileDialog,QMainWindow
import socket
from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
from Crypto.Signature import PKCS1_v1_5
import hashlib
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
#import sm2random
from OpenSSL import crypto
class Ui_MainWindow(object):
def setupUi(self, MainWindow,client):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 602)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.textBrowser = QtWidgets.QTextBrowser(self.centralwidget)
self.textBrowser.setGeometry(QtCore.QRect(10, 10, 541, 501))
self.textBrowser.setObjectName("textBrowser")
self.receive_button = QtWidgets.QPushButton(self.centralwidget)
self.receive_button.setGeometry(QtCore.QRect(560, 110, 121, 51))
self.receive_button.setObjectName("receive_button")
self.decrypt_button = QtWidgets.QPushButton(self.centralwidget)
self.decrypt_button.setGeometry(QtCore.QRect(560, 160, 121, 51))
self.decrypt_button.setObjectName("decrypt_button")
self.verify_button = QtWidgets.QPushButton(self.centralwidget)
self.verify_button.setGeometry(QtCore.QRect(560, 210, 121, 51))
self.verify_button.setObjectName("verify_button")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 23))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
#新增属性
"""
self.file_path 明文的保存路径
self.mode 加密模式
self.algorithm 加密算法
self.enc_key 加密后的对称密钥
self.private_key 私钥
self.public_key 公钥
self.public_key_other 对方的公钥
self.iv 初始向量iv
self.signature 签名
self.encrypted_text 密文
self.key 对称密钥
"""
self.file_path= ""
self.mode = ""
self.algorithm = ""
self.enc_key = ""
#打开文件选择对话框
QMessageBox.information(MainWindow, "提示", "请选择你的私钥文件")
path=QFileDialog.getOpenFileName()[0]
#弹出消息框
with open(path, "rb") as f:
self.private_key = crypto.load_privatekey(crypto.FILETYPE_PEM, f.read())
QMessageBox.information(MainWindow, "提示", "请选择你的公钥文件")
path=QFileDialog.getOpenFileName()[0]
with open(path, "rb") as f:
self.public_key = crypto.load_publickey(crypto.FILETYPE_PEM, f.read())
QMessageBox.information(MainWindow, "提示", "请选择对方的公钥文件")
path=QFileDialog.getOpenFileName()[0]
with open(path, "rb") as f:
self.public_key_other = crypto.load_publickey(crypto.FILETYPE_PEM, f.read())
self.iv = ""
self.encrypted_text = ""
self.key=""
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
QtCore.QMetaObject.connectSlotsByName(MainWindow)
#继承连接实例
self.client = client
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.receive_button.setText(_translate("MainWindow", "接收文件"))
self.decrypt_button.setText(_translate("MainWindow", "解密"))
self.verify_button.setText(_translate("MainWindow", "验证签名"))
def receive(self):
#接收信封并解封保存,加密后的对称密钥,密文,签名
data = b""
while True:
envelope_dict = self.client.recv(1024)
if not envelope_dict:
break
data += envelope_dict
# print(data.decode())
envelope_dict = json.loads(data.decode('utf-8'))
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.client.close()
def receive(self):
#接收信封并解封保存,加密后的对称密钥,密文,签名
data = b""
while True:
envelope_dict = self.client.recv(1024)
if not envelope_dict:
break
data += envelope_dict
# print(data.decode())
envelope_dict = json.loads(data.decode('utf-8'))
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()
def decrypt_key(self):
#使用rsa私钥解密对称密钥self.enc_key,赋给self.key
cipher_rsa = PKCS1_OAEP.new(self.private_key)
self.key = cipher_rsa.decrypt(f.read())
def decrypt(self):
#根据模式和加密算法解密
# self.algorithm = self.algorithm_box.currentText()
# self.mode = self.mode_box.currentText()
self.algorithm = "AES"
self.mode = "CBC"
with open("aeskey.txt",'rb') as f:
self.key = "1234567890abcdef".encode("utf-8")
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)
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)
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)
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)
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_())
Loading…
Cancel
Save