首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用不带身份验证标签的Python解密AES GCM

用不带身份验证标签的Python解密AES GCM
EN

Stack Overflow用户
提问于 2020-02-13 21:00:35
回答 2查看 3.4K关注 0票数 2

我将从一个免责声明开始,我已经超出了我在这里的深度。一位同事给我看了他用pycryptodomex写的解密程序。他有一个加密的文件,一个密钥,和一个现在(从文件中提取)。他能够非常直截了当地解密文件内容。

代码语言:javascript
复制
c = Crypto.Cipher.AES.new(key, AES.MODE_GCM, nonce)
c.decrypt(encrypted_data)

在用于GCM的pycryptodome 测试中可以看到类似的实现:

代码语言:javascript
复制
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/密码学包。看来pycryptodomex是pyCrytpo的一个分支,它一开始就没有一个稳定的GCM实现。当我查看PyCA/cryptography的实现时,它直接向前看:

代码语言:javascript
复制
cipher = Cipher(algorithms.AES(key), modes.GCM(nonce), backend=default_backend())
d = cipher.decryptor()

但是,当我们想解密内容时,我们必须调用finalize_with_tag并生成一个身份验证标记:

代码语言:javascript
复制
d.update(encrypted_data) + d.finalize_with_tag(tag)

不幸的是,我没有身份验证标记,也不知道在哪里可以找到它。我不能将值设置为None,因为有最小长度要求。我也不知道为什么我首先需要生成一个身份验证标记,用于使用PyCA/Cryptography解密AES GCM,但是我不需要在使用pycryptodomex解密时生成一个标记。我最终想要弄清楚以下几点:

  1. 如果我只能访问密钥、当前和加密的数据,那么可以使用Anaconda PyCA/cryptography包实现AES/GCM解密吗?
  2. 为什么我需要提供一个身份验证标记来解密一个实现而不是另一个实现?
  3. pycryptodomex是在幕后做什么来确定标签吗?
EN

回答 2

Stack Overflow用户

发布于 2020-02-13 22:13:39

  1. 没有身份验证标记的GCM等价于CTR模式。(启动计数器值的+1差除外)
  2. 调用解密并不会验证标记(据我所知)。您可以自己测试,只需修改一个字节的密文即可。它将很好地解密(以一个字节为单位的明文)。使用decrypt_and_verify (参见test_invalid_mac测试)。
  3. 见2。
票数 3
EN

Stack Overflow用户

发布于 2020-02-14 07:11:20

抱歉,因为我不能回复评论。解密后可以从解密后的数据派生标记吗?与这个公关关联的PyCA/cryptography似乎意味着这里考虑的确切场景。

根据GCM规范(7.2节:“认证解密函数的算法”),在加密文本被解密之前,不需要标记本身。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60217831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档