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.
FileSecureTransfer/recv/recv.py

54 lines
1.6 KiB

import base64
from config import config
from entity.Letter import Letter
from tool import PriKeyHelper
from tool.asymmetric import RSA
from tool.symmetric import SM4
def getLetter():
# 阻塞自身 从指定端口获取信件
#
# 解析信件
letter = None
handleLetter(letter)
pass
def handleLetter(letter:Letter):
# 解析信件 确认收信人
# 获取自身key
pki = PriKeyHelper.getUserKey()
if pki[1] != letter.recvPubKey:
raise Exception("信件不属于自己")
# 用自己的私钥解密key 获得对称加密秘钥。
key = RSA.decrypt_message(letter.encryptKey,pki[0])
# 根据不同的对称加密算法
try:
type = config.getEncryptType(letter.encryptType)
except KeyError:
raise KeyError("不支持的对称加密算法")
# 进行解密fileBase64
data = None
if type == config.EncryptType.SM4_ECB:
SM4.decrypt_ecb(base64.b64decode(letter.fileBase64),key)
elif type == config.EncryptType.SM4_CBC:
SM4.decrypt_cbc_with_iv(base64.b64decode(letter.fileBase64),key)
elif type == config.EncryptType.AES_ECB:
raise NotImplementedError("未实现")
elif type == config.EncryptType.AES_CBC:
raise NotImplementedError("未实现")
else:
raise KeyError("不支持的对称加密算法")
# 用发信人的公钥验签摘要
result = RSA.verify_signature(data,letter.sign,letter.senderPubKey)
if not result:
raise Exception("签名验证失败,文件不可信")
# 保存文件
with open(f"./{letter.fileName}","wb") as f:
f.write(data)
return