【问题标题】:Decrypting AES GCM with Python without Authentication Tag使用没有身份验证标签的 Python 解密 AES GCM
【发布时间】: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 解密时需要生成一个标签。我最终希望明确以下内容:

  1. 如果我只能访问密钥、随机数和加密数据,是否可以使用 Anaconda PyCA/cryptography 包实现 AES/GCM 解密?

  2. 为什么我需要为解密提供一个身份验证标签而不是另一个实现?

  3. pycryptodomex 是否在做一些事情来确定标签?

【问题讨论】:

  • 您可能对我的回答here 感兴趣。它是用 Java 编写的,但原理相同。

标签: aes google-cloud-messaging


【解决方案1】:
  1. 不带身份验证标签的 GCM 相当于 CTR 模式。 (除了起始计数器值的+1差异)

  2. 调用解密不会验证标签(据我所知)。您可以通过仅将密文更改一个字节来自行测试。它将很好地解密(解密为一个字节的明文)。使用decrypt_and_verify(参见test_invalid_mac 测试)。

  3. 见 2。

【讨论】:

  • 你能解释一下+1差异对起始计数器值的影响吗?我可以使用mode.CTR(nonce) 并获得准确的解密吗?乍一看,PyCA/cryptography 似乎不允许使用未经验证的身份验证标签。
  • 我无法编辑我的帖子,但想注意我的同事提到加密文件包含一些初始填充、随机数、加密数据和最后的一些填充。这些填充值中是否包含身份验证标签?再次,不深入所以感谢任何反馈。
  • 我认为#1 没有完全捕捉到全部差异,请参阅我的回答 here,至少注意扩展为 16 字节和 +2 而不是 +1。
【解决方案2】:

抱歉,我无法回复 cmets。解密后是否可以从解密后的数据中导出标签?与PyCA/cryptography 关联的This PR 似乎暗示了这里考虑的确切情况。

根据 GCM 规范(第 7.2 节:“算法 Authenticated Decryption Function”),不需要标签本身 直到密文被解密。

调用d.update(encrypted_data)是否成功解密数据和d.finalize()只需要验证数据的完整性?

【讨论】:

    猜你喜欢
    • 2018-08-20
    • 2013-07-17
    • 2014-07-14
    • 2016-08-24
    • 1970-01-01
    • 2022-01-04
    • 2015-10-29
    • 2017-11-09
    • 2019-01-31
    相关资源
    最近更新 更多