diff --git a/sender_ui.py b/sender_ui.py index fe63c15..160c621 100644 --- a/sender_ui.py +++ b/sender_ui.py @@ -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_()) \ No newline at end of file