You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

113 lines
3.7 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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")