You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
190 lines
7.2 KiB
190 lines
7.2 KiB
import sys
|
|
from PyQt5.QtWidgets import QMainWindow,QApplication,QFileDialog
|
|
import os
|
|
import socket
|
|
from Ui_untitled import Ui_MainWindow
|
|
from A_private_public import *
|
|
from digital_signature import *
|
|
from encrypt_message import *
|
|
from encrypt_decrypt_key import *
|
|
from B_private_public import *
|
|
from decrypt_ciphertext import *
|
|
from verify_digital_signature import *
|
|
from tcp_client import *
|
|
from tcp_server import *
|
|
|
|
class MyMainWindow(QMainWindow,Ui_MainWindow):
|
|
def __init__(self,parent =None):
|
|
super(MyMainWindow,self).__init__(parent)
|
|
self.setupUi(self)
|
|
|
|
self.send_file_path = None #初始化传输文件路径
|
|
self.host = None#初始化ip和端口
|
|
self.port = None
|
|
self.host2 = None#初始化ip和端口
|
|
self.port2 = None
|
|
|
|
self.textEdit_2.setFontPointSize(20)
|
|
self.textEdit_3.setFontPointSize(20)
|
|
|
|
self.pushButton_9.clicked.connect(self.receive_BpubKey) #建立连接
|
|
self.toolButton.clicked.connect(self.choose_file) #选择文件
|
|
self.pushButton_3.clicked.connect(self.encrypt_message) #生成对称密钥并加密原文
|
|
self.pushButton_8.clicked.connect(self.A_key) #生成A的密钥对
|
|
self.pushButton_2.clicked.connect(self.digital_signature) # 执行数字签名
|
|
self.pushButton.clicked.connect(self.encrypt_key) # 加密对称密钥
|
|
self.pushButton_10.clicked.connect(self.update_zip) #发送加密包
|
|
|
|
self.pushButton_12.clicked.connect(self.send_BpubKey) #等待连接
|
|
self.pushButton_4.clicked.connect(self.B_key) # 生成B的密钥对
|
|
self.pushButton_11.clicked.connect(self.download_zip) #下载加密包
|
|
self.pushButton_5.clicked.connect(self.decrypt_key) # 解密对称密钥
|
|
self.pushButton_6.clicked.connect(self.decrypt_ciphertext) # 解密密文
|
|
self.pushButton_7.clicked.connect(self.verify_signature) # 验证数字签名
|
|
|
|
def receive_BpubKey(self):
|
|
try:
|
|
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
|
s.connect(('8.8.8.8', 80))
|
|
ip = s.getsockname()[0]
|
|
finally:
|
|
s.close()
|
|
try:
|
|
self.text = self.plainTextEdit.toPlainText()
|
|
self.host, self.port = self.text.split(':')
|
|
except:
|
|
# self.textEdit_2.setText('请输入正确的ip和端口')
|
|
self.textEdit_2.setText("请输入正确的ip和端口")
|
|
|
|
self.host = ip
|
|
|
|
try:
|
|
receive_Bpubkey(self.host,int(self.port))
|
|
self.textEdit_2.setText('接收成功')
|
|
except:
|
|
self.textEdit_2.setText('接收失败')
|
|
|
|
def update_zip(self):
|
|
try:
|
|
self.text = self.plainTextEdit.toPlainText()
|
|
self.host, self.port = self.text.split(':')
|
|
except:
|
|
self.textEdit_2.setText('请输入正确的ip和端口')
|
|
try:
|
|
send_zip(self.host,int(self.port))
|
|
self.textEdit_2.setText('发送成功')
|
|
except:
|
|
self.textEdit_2.setText('发送失败')
|
|
|
|
|
|
def choose_file(self):
|
|
file_dialog = QFileDialog()
|
|
file_dialog.setFileMode(QFileDialog.AnyFile)
|
|
file_dialog.setNameFilter("Text files (*.txt)") # 过滤只显示文本文件
|
|
file_dialog.setViewMode(QFileDialog.Detail)
|
|
|
|
if file_dialog.exec_():
|
|
file_paths = file_dialog.selectedFiles()
|
|
self.textEdit_2.setText('\n'.join(file_paths))
|
|
if file_paths:
|
|
selected_file_path = file_paths[0]
|
|
self.send_file_path = selected_file_path
|
|
|
|
def encrypt_message(self):
|
|
if self.send_file_path:
|
|
current_directory = os.path.dirname(__file__)
|
|
key_file_path = os.path.join(current_directory, 'symmetric_key.key')
|
|
|
|
key = generate_and_save_key(key_file_path)
|
|
encrypt_file(self.send_file_path, key)
|
|
self.textEdit_2.setText('加密成功')
|
|
else:
|
|
self.textEdit_2.setText("请先选择文件进行加密")
|
|
|
|
def A_key(self):
|
|
A_key()
|
|
self.textEdit_2.setText('成功生成发送方密钥对')
|
|
|
|
def digital_signature(self):
|
|
if self.send_file_path != None: # 检查是否选择了文件
|
|
hash_value = digital_signature(self.send_file_path)
|
|
self.textEdit_2.setText(f"SHA-256摘要值: {hash_value}")
|
|
self.textEdit_2.setText("数字签名已生成并保存!")
|
|
else:
|
|
self.textEdit_2.setText("请先选择文件进行数字签名")
|
|
|
|
def encrypt_key(self):
|
|
try:
|
|
encrypt_key()
|
|
self.textEdit_2.setText('对称密钥加密成功')
|
|
except:
|
|
self.textEdit_2.setText('加密失败,请检查公钥是否正确')
|
|
|
|
|
|
def B_key(self):
|
|
B_key()
|
|
self.textEdit_3.setText('成功生成接收方密钥对')
|
|
|
|
def decrypt_key(self):
|
|
try:
|
|
decrypt_key()
|
|
self.textEdit_3.setText('对称密钥解密成功')
|
|
except:
|
|
self.textEdit_3.setText('解密失败,请检查私钥是否正确')
|
|
|
|
def decrypt_ciphertext(self):
|
|
try:
|
|
current_directory = os.path.dirname(__file__)
|
|
key_file_path = os.path.join(current_directory, 'decrypt_symmetric_key.key')
|
|
encrypted_file_path = os.path.join(current_directory, 'file.txt.encrypted')
|
|
|
|
key = load_key(key_file_path)
|
|
decrypt_file(encrypted_file_path, key)
|
|
self.textEdit_3.setText('密文解密成功')
|
|
except:
|
|
self.textEdit_3.setText('解密失败,请检查对称密钥是否正确')
|
|
|
|
def verify_signature(self):
|
|
try:
|
|
verify_digital_signature()
|
|
self.textEdit_3.setText('数字签名验证成功')
|
|
except:
|
|
self.textEdit_3.setText('请检查文件是否齐全且正确:发送方公钥、数字签名、对称密钥、密钥密文')
|
|
|
|
def send_BpubKey(self):
|
|
try:
|
|
self.text = self.plainTextEdit_2.toPlainText()
|
|
self.host2, self.port2 = self.text.split(':')
|
|
except:
|
|
self.textEdit_3.setText('请输入正确的ip和端口')
|
|
try:
|
|
send_Bpubkey(self.host2,int(self.port2))
|
|
self.textEdit_3.setText('发送成功')
|
|
except:
|
|
self.textEdit_3.setText('发送失败')
|
|
|
|
def download_zip(self):
|
|
try:
|
|
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
|
s.connect(('8.8.8.8', 80))
|
|
ip = s.getsockname()[0]
|
|
finally:
|
|
s.close()
|
|
try:
|
|
self.text = self.plainTextEdit_2.toPlainText()
|
|
self.host2, self.port2 = self.text.split(':')
|
|
self.host2 = ip
|
|
# self.textEdit_3.setText(self.host2,self.port2)
|
|
except:
|
|
self.textEdit_3.setText('请输入正确的ip和端口')
|
|
try:
|
|
receive_zip(self.host2,int(self.port2))
|
|
self.textEdit_3.setText('接收成功')
|
|
except:
|
|
self.textEdit_3.setText('接收失败')
|
|
|
|
if __name__ == "__main__":
|
|
app = QApplication(sys.argv)
|
|
myWin = MyMainWindow()
|
|
myWin.show()
|
|
sys.exit(app.exec_()) |