Update sender_ui.py

main
poriwfmve 2 months ago
parent 61f351562b
commit c0043851c8

@ -1,209 +1,218 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'sender_ui.ui' # Form implementation generated from reading ui file 'sender_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.
# -*- coding: utf-8 -*-
from PyQt5 import QtCore, QtGui, QtWidgets
import sys # Form implementation generated from reading ui file 'sender_ui.ui'
from PyQt5.QtWidgets import QFileDialog,QMainWindow #
from gmssl import sm4, func from PyQt5 import QtCore, QtGui, QtWidgets
import json import sys
import socket from PyQt5.QtWidgets import QFileDialog,QMainWindow
from Crypto.Cipher import AES from gmssl import sm4, func
from binascii import b2a_hex, a2b_hex import json
import random import socket
import string from Crypto.Cipher import AES
import tkinter as tk from binascii import b2a_hex, a2b_hex
from tkinter import filedialog import random
from Crypto.PublicKey import RSA import string
from Crypto.Cipher import PKCS1_OAEP import tkinter as tk
from Crypto.Signature import PKCS1_v1_5 from tkinter import filedialog
from OpenSSL import crypto from Crypto.PublicKey import RSA
from OpenSSL.crypto import PKey from Crypto.Cipher import PKCS1_OAEP
from OpenSSL.crypto import TYPE_RSA, FILETYPE_PEM, FILETYPE_ASN1 from Crypto.Signature import PKCS1_v1_5
from OpenSSL.crypto import dump_privatekey, dump_publickey from OpenSSL import crypto
import hashlib from OpenSSL.crypto import PKey
from Crypto.Hash import SHA512 from OpenSSL.crypto import TYPE_RSA, FILETYPE_PEM, FILETYPE_ASN1
#导入加密算法的类 from OpenSSL.crypto import dump_privatekey, dump_publickey
class Ui_MainWindow(object): import hashlib
def setupUi(self, MainWindow): from Crypto.Hash import SHA512
MainWindow.setObjectName("MainWindow") #导入加密算法的类
MainWindow.resize(839, 600) class Ui_MainWindow(object):
self.centralwidget = QtWidgets.QWidget(MainWindow) def setupUi(self, MainWindow,sender):
self.centralwidget.setObjectName("centralwidget") MainWindow.setObjectName("MainWindow")
self.enbutton = QtWidgets.QPushButton(self.centralwidget) MainWindow.resize(839, 600)
self.enbutton.setGeometry(QtCore.QRect(560, 240, 121, 51)) self.centralwidget = QtWidgets.QWidget(MainWindow)
self.enbutton.setObjectName("enbutton") self.centralwidget.setObjectName("centralwidget")
self.textBrowser = QtWidgets.QTextBrowser(self.centralwidget) self.enbutton = QtWidgets.QPushButton(self.centralwidget)
self.textBrowser.setGeometry(QtCore.QRect(10, 10, 541, 501)) self.enbutton.setGeometry(QtCore.QRect(560, 240, 121, 51))
self.textBrowser.setObjectName("textBrowser") self.enbutton.setObjectName("enbutton")
self.choose_button = QtWidgets.QPushButton(self.centralwidget) self.textBrowser = QtWidgets.QTextBrowser(self.centralwidget)
self.choose_button.setGeometry(QtCore.QRect(560, 110, 121, 51)) self.textBrowser.setGeometry(QtCore.QRect(10, 10, 541, 501))
self.choose_button.setObjectName("choose_button") self.textBrowser.setObjectName("textBrowser")
self.algorithm_box = QtWidgets.QComboBox(self.centralwidget) self.choose_button = QtWidgets.QPushButton(self.centralwidget)
self.algorithm_box.setGeometry(QtCore.QRect(560, 160, 121, 41)) self.choose_button.setGeometry(QtCore.QRect(560, 110, 121, 51))
self.algorithm_box.setObjectName("algorithm_box") self.choose_button.setObjectName("choose_button")
self.mode_box = QtWidgets.QComboBox(self.centralwidget) self.algorithm_box = QtWidgets.QComboBox(self.centralwidget)
self.mode_box.setGeometry(QtCore.QRect(560, 200, 121, 41)) self.algorithm_box.setGeometry(QtCore.QRect(560, 160, 121, 41))
self.mode_box.setObjectName("mode_box") self.algorithm_box.setObjectName("algorithm_box")
self.key_generate_button = QtWidgets.QPushButton(self.centralwidget) self.mode_box = QtWidgets.QComboBox(self.centralwidget)
self.key_generate_button.setGeometry(QtCore.QRect(560, 10, 121, 51)) self.mode_box.setGeometry(QtCore.QRect(560, 200, 121, 41))
self.key_generate_button.setAutoDefault(False) self.mode_box.setObjectName("mode_box")
self.key_generate_button.setObjectName("key_generate_button") self.key_generate_button = QtWidgets.QPushButton(self.centralwidget)
self.send_public_button = QtWidgets.QPushButton(self.centralwidget) self.key_generate_button.setGeometry(QtCore.QRect(560, 10, 121, 51))
self.send_public_button.setGeometry(QtCore.QRect(560, 60, 121, 51)) self.key_generate_button.setAutoDefault(False)
self.send_public_button.setObjectName("send_public_button") self.key_generate_button.setObjectName("key_generate_button")
self.envelope_button = QtWidgets.QPushButton(self.centralwidget) self.send_public_button = QtWidgets.QPushButton(self.centralwidget)
self.envelope_button.setGeometry(QtCore.QRect(560, 290, 121, 51)) self.send_public_button.setGeometry(QtCore.QRect(560, 60, 121, 51))
self.envelope_button.setObjectName("envelope_button") self.send_public_button.setObjectName("send_public_button")
MainWindow.setCentralWidget(self.centralwidget) self.envelope_button = QtWidgets.QPushButton(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow) self.envelope_button.setGeometry(QtCore.QRect(560, 290, 121, 51))
self.menubar.setGeometry(QtCore.QRect(0, 0, 839, 23)) self.envelope_button.setObjectName("envelope_button")
self.menubar.setObjectName("menubar") MainWindow.setCentralWidget(self.centralwidget)
MainWindow.setMenuBar(self.menubar) self.menubar = QtWidgets.QMenuBar(MainWindow)
self.statusbar = QtWidgets.QStatusBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 839, 23))
self.statusbar.setObjectName("statusbar") self.menubar.setObjectName("menubar")
MainWindow.setStatusBar(self.statusbar) MainWindow.setMenuBar(self.menubar)
self.retranslateUi(MainWindow) self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.key_generate_button.clicked.connect(self.key_generate) # type: ignore self.statusbar.setObjectName("statusbar")
self.send_public_button.clicked.connect(self.send_publickey) # type: ignore MainWindow.setStatusBar(self.statusbar)
self.choose_button.clicked.connect(self.choose_file) # type: ignore self.retranslateUi(MainWindow)
self.enbutton.clicked.connect(self.encrypt) # type: ignore self.key_generate_button.clicked.connect(self.key_generate) # type: ignore
self.envelope_button.clicked.connect(self.send) # type: ignore self.send_public_button.clicked.connect(self.send_publickey) # type: ignore
QtCore.QMetaObject.connectSlotsByName(MainWindow) self.choose_button.clicked.connect(self.choose_file) # type: ignore
#新增属性 self.enbutton.clicked.connect(self.encrypt) # type: ignore
""" self.envelope_button.clicked.connect(self.send) # type: ignore
self.file_path 文件路径 QtCore.QMetaObject.connectSlotsByName(MainWindow)
self.mode 加密模式 #新增属性
self.algorithm 选择的加密算法 """
self.encrypted_text 加密后的文本 self.file_path 文件路径
self.public_key 自己的公钥 self.mode 加密模式
self.private_key 自己的私钥 self.algorithm 选择的加密算法
self.public_key_other 对方的公钥 self.encrypted_text 加密后的文本
self.key 对称密钥 self.public_key 自己的公钥
self.sender 连接实例 self.private_key 自己的私钥
self.envelope 信封 self.public_key_other 对方的公钥
""" self.key 对称密钥
self.file_path= "" self.sender 连接实例
self.mode="" self.envelope 信封
self.algorithm="" """
self.encrypted_text="" self.file_path= ""
with open("public_key.pem","rb") as f: self.mode=""
self.public_key=crypto.load_publickey(crypto.FILETYPE_PEM,f.read(),password=None) self.algorithm=""
with open("private_key.pem","rb") as f: self.encrypted_text=""
self.private_key=crypto.load_privatekey(crypto.FILETYPE_PEM,f.read(),password=None) with open("public_key.pem","rb") as f:
with open("public_key_other.pem","rb") as f: self.public_key=crypto.load_publickey(crypto.FILETYPE_PEM,f.read(),password=None)
self.public_key_other=crypto.load_publickey(crypto.FILETYPE_PEM,f.read(),password=None) with open("private_key.pem","rb") as f:
self.key="" self.private_key=crypto.load_privatekey(crypto.FILETYPE_PEM,f.read(),password=None)
self.envelope={} with open("public_key_other.pem","rb") as f:
#等待接收方连接 self.public_key_other=crypto.load_publickey(crypto.FILETYPE_PEM,f.read(),password=None)
self.sender=socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.key=""
self.sender.bind(("127.0.0.1", 5555)) self.envelope={}
def retranslateUi(self, MainWindow): #等待接收方连接
_translate = QtCore.QCoreApplication.translate self.sender=sender
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) def retranslateUi(self, MainWindow):
self.enbutton.setText(_translate("MainWindow", "加密并封装")) _translate = QtCore.QCoreApplication.translate
self.choose_button.setText(_translate("MainWindow", "选择文件")) MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.key_generate_button.setText(_translate("MainWindow", "生成公私钥")) self.enbutton.setText(_translate("MainWindow", "加密并封装"))
self.send_public_button.setText(_translate("MainWindow", "发送公钥")) self.choose_button.setText(_translate("MainWindow", "选择文件"))
self.envelope_button.setText(_translate("MainWindow", "发送")) self.key_generate_button.setText(_translate("MainWindow", "生成公私钥"))
self.mode_box.addItems(["ECB", "CBC"]) self.send_public_button.setText(_translate("MainWindow", "发送公钥"))
self.algorithm_box.addItems(["AES","SM4"]) self.envelope_button.setText(_translate("MainWindow", "发送"))
def choose_file(self): self.mode_box.addItems(["ECB", "CBC"])
#打开文件选择对话框 self.algorithm_box.addItems(["AES","SM4"])
self.file_path, _ = QFileDialog.getOpenFileName(MainWindow, '请选择要进行加密的文件', '', 'All Files (*);;Text Files (*.txt)') def choose_file(self):
# 检查文件路径是否为空 #打开文件选择对话框
if self.file_path: self.file_path, _ = QFileDialog.getOpenFileName(MainWindow, '请选择要进行加密的文件', '', 'All Files (*);;Text Files (*.txt)')
self.textBrowser.append(self.file_path) # 检查文件路径是否为空
else: if self.file_path:
self.textBrowser.append("no file selected") self.textBrowser.append(self.file_path)
self.textBrowser.append("choose_file") else:
self.textBrowser.append("no file selected")
def encrypt(self): self.textBrowser.append("choose_file")
# 获取用户选择的加密算法
self.algorithm = self.algorithm_box.currentText() def encrypt(self):
self.mode = self.mode_box.currentText() # 获取用户选择的加密算法
with open(self.file_path, 'r') as f: self.algorithm = self.algorithm_box.currentText()
plaintext = f.read() self.mode = self.mode_box.currentText()
# #A随机生成16字节的数字和字母组合的字符串 with open(self.file_path, 'r') as f:
with open("aeskey.txt",'wb') as f: plaintext = f.read()
self.key = ''.join(random.choices(string.ascii_letters + string.digits, k=16)).encode() # #A随机生成16字节的数字和字母组合的字符串
f.write(self.key) with open("aeskey.txt",'wb') as f:
if self.algorithm=="AES": self.key = ''.join(random.choices(string.ascii_letters + string.digits, k=16)).encode()
if self.mode=="ECB": f.write(self.key)
mode = AES.MODE_ECB if self.algorithm=="AES":
cryptor = AES.new(self.key, mode) if self.mode=="ECB":
text = plaintext.encode("utf-8") mode = AES.MODE_ECB
length = 16 cryptor = AES.new(self.key, mode)
count = len(text) text = plaintext.encode("utf-8")
add = length - (count % length) length = 16
text = text + (b'\0' * add) count = len(text)
encrypted_text = cryptor.encrypt(text) add = length - (count % length)
self.encrypted_text = b2a_hex(encrypted_text).decode("utf-8") text = text + (b'\0' * add)
self.textBrowser.append(encrypted_text+"\n") encrypted_text = cryptor.encrypt(text)
elif self.mode=="CBC": self.encrypted_text = b2a_hex(encrypted_text).decode("utf-8")
mode = AES.MODE_CBC self.textBrowser.append(encrypted_text+"\n")
cryptor = AES.new(self.key, mode, self.key)#iv = self.key elif self.mode=="CBC":
text = plaintext.encode("utf-8") mode = AES.MODE_CBC
length = 16 cryptor = AES.new(self.key, mode, self.key)#iv = self.key
count = len(text) text = plaintext.encode("utf-8")
add = length - (count % length) length = 16
text = text + (b'\0' * add) count = len(text)
encrypted_text = cryptor.encrypt(text) add = length - (count % length)
self.encrypted_text = b2a_hex(encrypted_text).decode("utf-8") text = text + (b'\0' * add)
self.textBrowser.append(encrypted_text+"\n") encrypted_text = cryptor.encrypt(text)
else: self.encrypted_text = b2a_hex(encrypted_text).decode("utf-8")
self.textBrowser.append("mode error") self.textBrowser.append(encrypted_text+"\n")
elif self.algorithm=="SM4": else:
if self.mode=="ECB": self.textBrowser.append("mode error")
# 生成sm4的密钥和偏移量 elif self.algorithm=="SM4":
sm4_key = func.random_hex(16) if self.mode=="ECB":
with open(self.file_path, 'rb') as f: # 生成sm4的密钥和偏移量
file_content = f.read() sm4_key = func.random_hex(16)
print("file_content:",file_content) with open(self.file_path, 'rb') as f:
sm4Alg = sm4.CryptSM4() file_content = f.read()
sm4Alg.set_key(sm4_key.encode(), sm4.SM4_ENCRYPT) print("file_content:",file_content)
encrypted_data = sm4Alg.crypt_ecb(file_content) sm4Alg = sm4.CryptSM4()
self.encrypted_text = encrypted_data.hex() sm4Alg.set_key(sm4_key.encode(), sm4.SM4_ENCRYPT)
elif self.mode=="CBC": encrypted_data = sm4Alg.crypt_ecb(file_content)
# 生成sm4的密钥和偏移量 self.encrypted_text = encrypted_data.hex()
sm4_key = func.random_hex(16) elif self.mode=="CBC":
sm4_iv = func.random_hex(16) # 生成sm4的密钥和偏移量
with open(self.file_path, 'rb') as f: sm4_key = func.random_hex(16)
file_content = f.read() sm4_iv = func.random_hex(16)
sm4Alg = sm4.CryptSM4() with open(self.file_path, 'rb') as f:
sm4Alg.set_key(sm4_key.encode(), sm4.SM4_ENCRYPT) file_content = f.read()
encrypted_data = sm4Alg.crypt_cbc(sm4_iv.encode(),file_content) sm4Alg = sm4.CryptSM4()
self.encrypted_text = encrypted_data.hex() sm4Alg.set_key(sm4_key.encode(), sm4.SM4_ENCRYPT)
else: encrypted_data = sm4Alg.crypt_cbc(sm4_iv.encode(),file_content)
self.textBrowser.append("mode error") self.encrypted_text = encrypted_data.hex()
else: else:
self.textBrowser.append("algorithm error") self.textBrowser.append("mode error")
#对称密钥加密 else:
recipient_key = RSA.importKey(self.public_key_other) self.textBrowser.append("algorithm error")
cipher_rsa = PKCS1_OAEP.new(recipient_key) #对称密钥加密
enc_key = cipher_rsa.encrypt(self.key) recipient_key = RSA.importKey(self.public_key_other)
enc_key = b2a_hex(enc_key).decode("utf-8") cipher_rsa = PKCS1_OAEP.new(recipient_key)
self.textBrowser.append(enc_key+"\n") enc_key = cipher_rsa.encrypt(self.key)
#签名 enc_key = b2a_hex(enc_key).decode("utf-8")
key = RSA.importKey(self.private_key) self.textBrowser.append(enc_key+"\n")
sha512_hash = hashlib.sha256(plaintext.encode('utf-8')).hexdigest() #签名
h = SHA512.new(sha512_hash.encode("utf-8")) key = RSA.importKey(self.private_key)
signer = PKCS1_v1_5.new(key) sha512_hash = hashlib.sha256(plaintext.encode('utf-8')).hexdigest()
signature = b2a_hex(signer.sign(h)).decode("utf-8") h = SHA512.new(sha512_hash.encode("utf-8"))
self.textBrowser.append(signature) signer = PKCS1_v1_5.new(key)
self.envelope={"algorithm":self.algorithm,"mode":self.mode,"ciphertext":self.encrypted_text,"key":enc_key,"signature":signature,"publick_key":self.public_key} signature = b2a_hex(signer.sign(h)).decode("utf-8")
self.textBrowser.append("pack successfully") self.textBrowser.append(signature)
def send(self): self.envelope={"algorithm":self.algorithm,"mode":self.mode,"ciphertext":self.encrypted_text,"key":enc_key,"signature":signature,"publick_key":self.public_key}
pass self.textBrowser.append("pack successfully")
if __name__ == "__main__": def send(self):
app = QtWidgets.QApplication(sys.argv) #发送数据
MainWindow = QtWidgets.QMainWindow() envelope = json.dumps(self.envelope)
ui = Ui_MainWindow() self.sender.send(envelope.encode('utf-8'))
ui.setupUi(MainWindow)
MainWindow.show() if __name__ == "__main__":
#连接接收端 准备发送数据
sender_conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sender_conn.connect(('localhost', 8888))
#创建窗口
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow,sender_conn)
MainWindow.show()
sys.exit(app.exec_()) sys.exit(app.exec_())
Loading…
Cancel
Save