我将从一个免责声明开始,我已经超出了我在这里的深度。一位同事给我看了他用pycryptodomex写的解密程序。他有一个加密的文件,一个密钥,和一个现在(从文件中提取)。他能够非常直截了当地解密文件内容。
c = Crypto.Cipher.AES.new(key, AES.MODE_GCM, nonce)
c.decrypt(encrypted_data)在用于GCM的pycryptodome 测试中可以看到类似的实现:
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的实现时,它直接向前看:
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解密时生成一个标记。我最终想要弄清楚以下几点:
PyCA/cryptography包实现AES/GCM解密吗?pycryptodomex是在幕后做什么来确定标签吗?发布于 2020-02-13 22:13:39
decrypt_and_verify (参见test_invalid_mac测试)。发布于 2020-02-14 07:11:20
抱歉,因为我不能回复评论。解密后可以从解密后的数据派生标记吗?与这个公关关联的PyCA/cryptography似乎意味着这里考虑的确切场景。
根据GCM规范(7.2节:“认证解密函数的算法”),在加密文本被解密之前,不需要标记本身。
调用d.update(encrypted_data)是否成功地解密数据,并且只需要d.finalize()来验证数据的完整性?
https://stackoverflow.com/questions/60217831
复制相似问题