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