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.
43 lines
1.4 KiB
43 lines
1.4 KiB
import os
|
|
import json
|
|
from utils import aes_encrypt, rsa_encrypt, generate_signature, load_key
|
|
import base64
|
|
def send_file(filename, receiver_public_key, sender_private_key):
|
|
# 读取文件内容
|
|
with open(filename, 'rb') as f:
|
|
file_data = f.read()
|
|
|
|
# 生成随机AES密钥
|
|
aes_key = os.urandom(16)
|
|
|
|
# 加密文件
|
|
nonce, ciphertext, tag = aes_encrypt(file_data, aes_key)
|
|
|
|
# 使用接收方公钥加密AES密钥
|
|
encrypted_aes_key = rsa_encrypt(aes_key, receiver_public_key)
|
|
|
|
# 生成数字签名(针对原始文件内容)
|
|
signature = generate_signature(sender_private_key, file_data)
|
|
|
|
# 封装数据包
|
|
data_packet = {
|
|
'nonce': base64.b64encode(nonce).decode(),
|
|
'ciphertext': base64.b64encode(ciphertext).decode(),
|
|
'tag': base64.b64encode(tag).decode(),
|
|
'encrypted_key': base64.b64encode(encrypted_aes_key).decode(),
|
|
'signature': base64.b64encode(signature).decode(),
|
|
'filename': os.path.basename(filename)
|
|
}
|
|
|
|
# 保存数据包到文件
|
|
with open('data_packet.json', 'w') as f:
|
|
json.dump(data_packet, f)
|
|
|
|
print("文件已加密并发送。")
|
|
|
|
if __name__ == "__main__":
|
|
receiver_public_key = load_key('receiver_public.pem')
|
|
sender_private_key = load_key('sender_private.pem')
|
|
send_file('1.txt', receiver_public_key, sender_private_key)
|
|
|