diff --git a/entity/Letter.py b/entity/Letter.py index 5f57d59..32676b0 100644 --- a/entity/Letter.py +++ b/entity/Letter.py @@ -1,9 +1,41 @@ +import json + + class Letter: sign = "计算得到" encryptType = "SM4_GCM" - encryptKey = "计算获得" # recvPubKey 加密后的 对称加密秘钥 数据 + encryptKey = "计算获得" # recvPubKey 加密后的 对称加密秘钥 数据 recvPubKey = "" senderPubKey = "" fileName = "" fileBase64 = "" + + def to_dict(self): + return { + "sign": self.sign, + "encryptType": self.encryptType, + "encryptKey": self.encryptKey, + "recvPubKey": self.recvPubKey, + "senderPubKey": self.senderPubKey, + "fileName": self.fileName, + "fileBase64": self.fileBase64 + } + +def json_to_obj(json_str): + new_obj= Letter() + new_obj.sign = json_str["sign"] + new_obj.encryptType = json_str["encryptType"] + new_obj.encryptKey = json_str["encryptKey"] + new_obj.recvPubKey = json_str["recvPubKey"] + new_obj.senderPubKey = json_str["senderPubKey"] + new_obj.fileName = json_str["fileName"] + new_obj.fileBase64 = json_str["fileBase64"] + return new_obj + +# test code +if __name__ == '__main__': + letter = Letter() + # print(json.dumps(letter.to_dict(), indent=1)) + json_dict = json.loads(json.dumps(letter.to_dict())) + print(json_dict.__dir__) diff --git a/recv/recv.py b/recv/recv.py index ee4a775..2c5acf5 100644 --- a/recv/recv.py +++ b/recv/recv.py @@ -23,6 +23,8 @@ def handleLetter(letter: Letter): # 解析信件 确认收信人 # 获取自身key pki = PriKeyHelper.getUserKey() + print("pki is: ",pki[1]) + print("letter.recvPubKey is: ",letter.recvPubKey) if pki[1] != letter.recvPubKey: raise Exception("信件不属于自己") # 用自己的私钥解密key 获得对称加密秘钥。 diff --git a/recv/recv_net.py b/recv/recv_net.py new file mode 100644 index 0000000..0498554 --- /dev/null +++ b/recv/recv_net.py @@ -0,0 +1,141 @@ +import hashlib +import json +import selectors +import socket +import threading +from time import sleep + +import select + +from entity.Letter import Letter, json_to_obj +import recv +from sender import sender + + +# from entity.Letter import Letter + + +# def main(): +# # 用户输入各种数据填充letter字段 +# # 获取用户的公私钥对进行签名 +# # 使用对方的公钥进行加密 +# # 发送信件 +# pass +# +# +# def sendLetter(letter: Letter, target="192.168.195.162:8426"): +# # 向目标ip和端口发送指定的信件 +# pass + +class recver_net(): + def __init__(self, port, client_host, client_port): + self.client_host = client_host + self.client_port = client_port + self.letter = Letter() + self.port = port + self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.server.bind(('0.0.0.0', self.port)) + self.server.listen(10) + + def recver_thread(self): + while True: + conn, addr = self.server.accept() + data = conn.recv(10240) + msg = json.loads(data.decode()) + if int(msg['flag']) == 0: + print("[+] haved received data:" + msg["data"]) + elif int(msg['flag']) == 1: + self.recv_file(msg['data']) + else: + print("[x] Error") + + def send_thread(self, conn): + while True: + try: + flag: int = int(input()) + if flag == 0: + data = input("[-] Enter data to send: ") + msg = {"flag": 0, "data": data} + msg = json.dumps(msg).encode("utf-8") + self.send_data(conn, msg) + elif flag == 1: + print("[+] Calling file transfer module...") + # file_name = input("Enter file name to send: ") + self.send_file(conn) + else: + print("[x] Error,plesae enter 0 to send data, or 1 to send file.") + except ValueError: + print("[x] Error, please enter a valid number.") + + def send_data(self, conn, data): + conn.sendall(data) + + def send_file(self, conn): + self.letter: Letter = sender.main() + letter = self.letter.to_dict() + msg = {"flag": 1, "data": letter} + msg = json.dumps(msg).encode("utf-8") + conn.sendall(msg) + + def recv_data(self, conn): + con, addr = conn.accept() + data = con.recv(1024) + if not data: + return None + # print(data.decode()) + return data.decode() + + def recv_file(self, data): + letter: Letter = json_to_obj(data) + recv.handleLetter(letter) + + def main(self): + + while True: + try: + client = socket.socket() # 定义协议类型,相当于生命socket类型,同时生成socket连接对象 + client.connect((self.client_host, self.client_port)) + print("[*] Connected...") + print("[*] if you want to send data, enter 0, if you want to send file, enter 1.") + sleep(1) + break + except socket.error: + print("[*] Waiting for ...") + # 加入线程 + threading.Thread(target=self.recver_thread, ).start() + threading.Thread(target=self.send_thread, args=(client,)).start() + + def run(self): + threading.Thread(target=self.main).start() + + +def input_verify(): + while True: + try: + port = int(input("[*] Enter to the listen port: ")) + break + except ValueError: + print("[x] Error, please enter a valid port number.") + + while True: + addr = input("[*] Enter the address to connect to(127.0.0.1:8424): ") + if ':' in addr: + client_host, client_port = addr.split(":") + if client_host and client_port.isdigit(): + client_port = int(client_port) + if 0 <= client_port <= 65535: # 检查端口范围 + break # 输入有效,跳出循环 + else: + print("Port must be between 0 and 65535.") + else: + print("Invalid address format. Please enter in the format 'host:port'.") + else: + print("Invalid address format. Please enter in the format 'host:port'.") + return port, client_host, client_port + + +# test +if __name__ == '__main__': + port, client_host, client_port = input_verify() + a = recver_net(port, client_host, client_port) + a.run() diff --git a/sender/sender.py b/sender/sender.py index 4f02093..71b5142 100644 --- a/sender/sender.py +++ b/sender/sender.py @@ -6,12 +6,11 @@ import os from entity.Letter import Letter -from itsdangerous import base64_encode from tool import PriKeyHelper from tool.PriKeyHelper import getUserKey from tool.asymmetric import RSA from tool.symmetric.AES import AESUtils -from tool.symmetric.SM4 import encrypt_ecb, decrypt_cbc_with_iv, encrypt_cbc_with_iv +from tool.symmetric.SM4 import encrypt_ecb, encrypt_cbc_with_iv from Crypto.Random import get_random_bytes @@ -43,7 +42,7 @@ def main(): letter.fileName = getFileName(path) letter.recvPubKey = getRecvPubKey() letter.senderPubKey = getSenderPubKey() - letter.fileBase64, akey = SymEncryption(base64_encode(data).decode("utf-8"),letterSymKey) + letter.fileBase64, akey = SymEncryption(base64.b64encode(data).decode("utf-8"),letterSymKey) letter.encryptKey = getEncryptKey() letter.encryptType = getEncryptType() diff --git a/sender/sender_net.py b/sender/sender_net.py new file mode 100644 index 0000000..60a2af7 --- /dev/null +++ b/sender/sender_net.py @@ -0,0 +1,143 @@ +import hashlib +import json +import selectors +import socket +import threading +from time import sleep +from entity.Letter import Letter,json_to_obj +import select +import sender +from recv import recv + + +# from entity.Letter import Letter + + +# def main(): +# # 用户输入各种数据填充letter字段 +# # 获取用户的公私钥对进行签名 +# # 使用对方的公钥进行加密 +# # 发送信件 +# pass +# +# +# def sendLetter(letter: Letter, target="192.168.195.162:8426"): +# # 向目标ip和端口发送指定的信件 +# pass + +class sender_net(): + def __init__(self,port=8424,client_host='127.0.0.1',client_port=8424): + self.client_host = client_host + self.client_port = client_port + self.letter = Letter() + self.port=port + self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.server.bind(('0.0.0.0', self.port)) + self.server.listen(10) + + + def recver_thread(self): + while True: + conn, addr = self.server.accept() + data = conn.recv(10240) + msg = json.loads(data.decode()) + if int(msg['flag']) == 0: + print("[+] haved received data:" + msg["data"]) + elif int(msg['flag']) == 1: + self.recv_file(msg['data']) + else: + print("[x] Error") + + def send_thread(self, conn): + while True: + try: + flag: int = int(input()) + if flag == 0: + data = input("[-] Enter data to send: ") + msg = {"flag": 0, "data": data} + msg = json.dumps(msg).encode("utf-8") + self.send_data(conn, msg) + elif flag == 1: + print("[+] Calling file transfer module...") + # file_name = input("Enter file name to send: ") + self.send_file(conn) + else: + print("[x] Error,plesae enter 0 to send data, or 1 to send file.") + except ValueError: + print("[x] Error, please enter a valid number.") + + + def send_data(self, conn, msg): + conn.sendall(msg) + + def send_file(self, conn): + self.letter: Letter = sender.main() + letter = self.letter.to_dict() + msg = {"flag": 1, "data": letter} + print(letter) + msg = json.dumps(msg).encode("utf-8") + conn.sendall(msg) + + def recv_data(self, conn): + con, addr = conn.accept() + data = con.recv(1024) + if not data: + return None + # print(data.decode()) + return data.decode() + + def recv_file(self, data): + letter: Letter = json_to_obj(data) + recv.handleLetter(letter) + + + def run(self): + threading.Thread(target=self.main).start() + + def main(self): + while True: + try: + client = socket.socket() # 定义协议类型,相当于生命socket类型,同时生成socket连接对象 + client.connect((self.client_host, self.client_port)) + print(" [*] Connected...") + print("[*] if you want to send data, enter 0, if you want to send file, enter 1.") + sleep(1) + break + except socket.error: + print("[*] Waiting for ...") + #加入线程 + threading.Thread(target=self.recver_thread, ).start() + threading.Thread(target=self.send_thread, args=(client,)).start() + + + +def input_verify(): + while True: + try: + port = int(input("[*] Enter to the listen port: ")) + break + except ValueError: + print("[x] Error, please enter a valid port number.") + + while True: + addr = input("[*] Enter the address to connect to(127.0.0.1:8424): ") + if ':' in addr: + client_host, client_port = addr.split(":") + if client_host and client_port.isdigit(): + client_port = int(client_port) + if 0 <= client_port <= 65535: # 检查端口范围 + break # 输入有效,跳出循环 + else: + print("Port must be between 0 and 65535.") + else: + print("Invalid address format. Please enter in the format 'host:port'.") + else: + print("Invalid address format. Please enter in the format 'host:port'.") + return port, client_host, client_port + + +#test +if __name__ == '__main__': + port, client_host, client_port = input_verify() + a = sender_net(port, client_host, client_port) + a.run() diff --git a/tool/PriKeyHelper.py b/tool/PriKeyHelper.py index 63b12d3..9fc0a53 100644 --- a/tool/PriKeyHelper.py +++ b/tool/PriKeyHelper.py @@ -10,7 +10,6 @@ def getUserKey() -> (str, str): # 返回base64编码 if not os.path.exists(config.priKeySavePath) or not os.path.exists(config.pubKeySavePath): # 生成新的密钥对 RSA.generate_keys(config.priKeySavePath,config.pubKeySavePath) - # 读取私钥 with open(config.priKeySavePath, "rb") as f: data = f.read()