Update sender_ui.py

main
poriwfmve 2 months ago
parent 61f351562b
commit c0043851c8

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