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…
Reference in new issue