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_GCM: 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