ADD file via upload

master
Qowq4bf7s 3 years ago
parent 539e2d39e6
commit ef1ceccb5f

@ -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("仅可以选择123")
Loading…
Cancel
Save