我正在尝试在 python3 中实现对 pushbullet 临时消息的端到端加密支持。
我正在使用python-cryptography,但InvalidTag
解密时出现 -Exception 。我已经仔细检查了密钥、iv 和标签,但我不知道哪里出了问题。
密钥是这样派生的:
salt = user_ident.encode()
pw = password.encode()
kdf = PBKDF2HMAC(
algorithm=hashes.SHA256(),
length=32,
salt=salt,
iterations=30000,
backend=backend)
dkey = kdf.derive(pw)
然后将其作为 Base64 编码字符串存储在密钥环中,但我仔细检查了加密时是否获得了正确的字节字符串(也可以在 REPL 中手动执行)。
解密:
ciphertxt = a2b_base64(msg['ciphertext'])
version = ciphertxt[0:1]
tag = ciphertxt[1:17]
iv = ciphertxt[17:29]
enc_msg = ciphertxt[29:]
# Construct an AES-GCM Cipher object
decryptor = Cipher(
algorithms.AES(self.dkey_),
modes.GCM(iv, tag),
backend=backend
).decryptor()
cleartxt = decryptor.update(enc_msg) + decryptor.finalize()
所有变量都是字节字符串,这里是 python-cryptography 的相关文档。
澄清一下:我已经尝试过自己的方法来加密和成功解密一些文本。但是,当我在手机和客户端上激活 Pushbullet e2e 加密并收到通知时,我收到上述错误。
加密方法像这样组装加密的消息:
b'1' + encryptor.tag + iv + ciphertxt
我可以破译它。不适用于收到消息中的标签。
有任何想法吗?:/