【发布时间】:2020-05-29 18:02:26
【问题描述】:
我将首先声明我在这里超出了我的深度。一位同事向我展示了他用pycryptodomex 编写的解密程序。他有一个加密文件、一个密钥和一个随机数(从文件中提取)。他能够以非常直接的方式解密文件内容。
c = Crypto.Cipher.AES.new(key, AES.MODE_GCM, nonce)
c.decrypt(encrypted_data)
您可以在 GCM 的 pycryptodome test 中看到类似的实现:
cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96)
pt = get_tag_random("plaintext", 16 * 100)
ct = cipher.encrypt(pt)
cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96)
pt2 = cipher.decrypt(ct)
不幸的是,pycryptdomex 是一个额外的依赖项,我需要随身携带,我希望避免这种情况。我有一个 Anaconda 的基本安装,它带有 pyCrypto 和 pyCA/cryptography 包。 pycryptodomex 似乎是 pyCrytpo 的一个分支,它一开始就没有稳定的 GCM 实现。当我查看PyCA/cryptography 的实现时,它看起来很简单:
cipher = Cipher(algorithms.AES(key), modes.GCM(nonce), backend=default_backend())
d = cipher.decryptor()
但是当我们想要解密内容时,我们必须调用finalize_with_tag 并生成一个身份验证标签:
d.update(encrypted_data) + d.finalize_with_tag(tag)
很遗憾,我没有身份验证标签,也不知道在哪里可以找到它。我无法将该值设置为 None 因为有最小长度要求。我也不确定为什么我首先需要为使用PyCA/Cryptography 的AES GCM 解密生成一个身份验证标签,但我不需要在使用pycryptodomex 解密时需要生成一个标签。我最终希望明确以下内容:
如果我只能访问密钥、随机数和加密数据,是否可以使用 Anaconda
PyCA/cryptography包实现 AES/GCM 解密?为什么我需要为解密提供一个身份验证标签而不是另一个实现?
pycryptodomex是否在做一些事情来确定标签?
【问题讨论】:
-
您可能对我的回答here 感兴趣。它是用 Java 编写的,但原理相同。
标签: aes google-cloud-messaging