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.

218 lines
10 KiB

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