From ef1ceccb5fa9e9637e33f3412a40b6f75432ed76 Mon Sep 17 00:00:00 2001 From: Qowq4bf7s <1981920847@qq.com> Date: Wed, 24 Nov 2021 22:42:57 +0800 Subject: [PATCH] ADD file via upload --- main.py | 112 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 main.py diff --git a/main.py b/main.py new file mode 100644 index 0000000..b89766b --- /dev/null +++ b/main.py @@ -0,0 +1,112 @@ +import base64 +import json +import socket +import sys +import tkinter.filedialog + +import EncryptUtil + + +# 传输文件的入口 +def transfer_file(): + my_username = input("请输入你的用户名:") + target_username = input("请输入对端用户名:") + # 生成对话框,询问需要传输的文件 + root = tkinter.Tk() + root.withdraw() + filename = tkinter.filedialog.askopenfilename() + # 使用二进制打开文件 + with open(filename, "rb") as fp: + file_data = fp.read() + # 计算文件摘要 + hash_md5 = EncryptUtil.cal_md5(file_data) + # 生成用于加密文件的公钥 + des_key = EncryptUtil.generate_des_key() + # 使用des加密文件 + encrypt_data = EncryptUtil.des_encrypt(des_key, file_data) + # 使用对方公钥对des密钥进行加密 + encrypt_des_key = EncryptUtil.rsa_encrypt(des_key, target_username) + # 对文件摘要进行签名 + file_sign = EncryptUtil.rsa_sign(hash_md5.encode(), my_username) + # 使用base64编码 + encrypt_data_b64 = base64.b64encode(encrypt_data).decode() + encrypt_des_key_b64 = base64.b64encode(encrypt_des_key).decode() + file_sign_b64 = base64.b64encode(file_sign).decode() + # 使用json打包 + total_data = { + "encrypt_data_b64": encrypt_data_b64, + "encrypt_des_key_b64": encrypt_des_key_b64, + "file_sign_b64": file_sign_b64 + } + # json转json string + total_data_json_str = json.dumps(total_data) + # 发送打包的数据 + client = socket.socket() + ip = input("请输入要发送的ip: ") + client.connect((ip, 8787)) + client.sendall(total_data_json_str.encode()) + client.close() + + +# 接受文件入口 +def receive_file(): + my_username = input("请输入你的用户名:") + target_username = input("请输入对端用户名: ") + # 建立服务器socket + server = socket.socket() + port = 8787 + # 监听8787端口 + server.bind(("0.0.0.0", port)) + server.listen() + # 接收连接 + client, address = server.accept() + # 获取打包的json数据 + client_data = client.recv(10240).decode() + total_data = json.loads(client_data) + # 解包 + encrypt_data_b64 = total_data["encrypt_data_b64"] + encrypt_des_key_b64 = total_data["encrypt_des_key_b64"] + file_sign_b64 = total_data["file_sign_b64"] + # 解base64 + encrypt_data = base64.b64decode(encrypt_data_b64) + encrypt_des_key = base64.b64decode(encrypt_des_key_b64) + file_sign = base64.b64decode(file_sign_b64) + # 解密获取des密钥 + des_key = EncryptUtil.rsa_decrypt(encrypt_des_key, my_username) + # 解密文件 + file_data = EncryptUtil.des_decrypt(des_key, encrypt_data) + # 计算文件散列值 + hash_md5 = EncryptUtil.cal_md5(file_data) + file_md5 = EncryptUtil.rsa_verify(file_sign, target_username).decode() + if hash_md5 == file_md5: + print("签名和哈希验证成功!") + else: + print("签名和哈希验证失败,文件可能被篡改!") + sys.exit() + # 验证成功后保存文件 + with open("recv_file", "wb") as fp: + fp.write(file_data) + + +# 初始化生成密钥 +def generate_key(): + # 在本地生成rsa公私钥对 + username = input("请输入用户名:") + EncryptUtil.generate_keypair(username) + print("生成成功!") + + +if __name__ == '__main__': + print("请选择操作:") + print("1.生成密钥") + print("2.接受文件") + print("3.传输文件") + mode = input("请选择:") + if mode == "1": + generate_key() + elif mode == "2": + receive_file() + elif mode == "3": + transfer_file() + else: + print("仅可以选择1,2,3")