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…
Reference in new issue