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

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_())