使用 PyCrypto 进行 AES 加密并使用 mcrypt 进行解密

Posted

技术标签:

【中文标题】使用 PyCrypto 进行 AES 加密并使用 mcrypt 进行解密【英文标题】:AES encryption with PyCrypto and decryption with mcrypt 【发布时间】:2011-01-31 10:52:30 【问题描述】:

对于一些敏感数据,我决定将其以 AES 加密方式存储在磁盘上。我已经使用PyCrypto 实现了加密。

此外,数据很重要,存储的加密数据将是我唯一的副本(备份除外),因此我寻找了一些不使用 PyCrypto 来检索数据的方法,以便考虑到 PyCrypto 的可能性我不再可用(无论出于何种原因)。

我认为mcrypt 可能是一个选择。

这是我编写密文的测试用例:

import Crypto.Cipher.AES
import sys

pwd  = 'qwertzuiopasdfgh'
mode = Crypto.Cipher.AES.MODE_CBC
aes  = Crypto.Cipher.AES.new( pwd, mode )
text = 'asdfghjklyxcvbnm'
sys.stdout.write( aes.encrypt( text ) )

我将输出重定向到文件out.nc 并尝试通过

mcrypt -d -b -k qwertzuiopasdfgh -a rijndael-128 -m CBC out.nc

但不幸的是,生成的文件 out 的字节大小为零。

我希望 mcrypt 有多种选择来完成这项工作……

【问题讨论】:

如果将 aes.encrypt(text) 的结果写入文件而不是标准输出会发生什么?使用 diff 确保它们相同。将密文传送到标准输出很奇怪,因为它永远不会是可打印的数据。如果你不走运,重定向它甚至都行不通。 重定向甚至不起作用?奇怪的想法,乍一看。你有任何关于为什么会这样的参考吗?不过,我只是尝试直接写入文件。这会产生相同的文件。 【参考方案1】:

我认为问题可能在于您没有为 CBC 模式提供 IV,并且没有 IV,mCrypt 和 PyCrypto 可能通过使用不同的默认 IV 以不同方式处理它。我已经看到一些实现(例如 phpseclib)默认使用 16 个空字节的 IV。 mcrypt 可能不会这样做。

【讨论】:

知道当未指定 IV 时 PyCrypto 对 IV 使用什么?【参考方案2】:

为什么能够在没有 PyCrypto 的情况下进行恢复很重要?您可以简单地使用旧操作系统和旧版本 PyCrypto 启动 VM,导出数据,然后使用不同的算法和实现重新加密。

【讨论】:

好吧,让我们假设我的 Linux 发行版不再支持 PyCrypto,相关的网站已关闭,我无法在我的系统上获取源代码进行编译。我宝贵但加密的数据的情况很糟糕。此外,我想验证我的加密是否按预期工作。我已经看到有很多组合可以做 AES,所以我不能认为这是理所当然的。关于其他解决方案:是的,OpenSSL 看起来是一个不错的候选者。我还没有找到一个可以访问加密功能的 python 绑定。 当然。这就是为什么您需要保留一份解密工具的副本。您不需要 Python 有趣的 OpenSSL;你可以使用命令行界面和Popen。 我必须从一个 >15 年历史的数据库中迁移一些数据。它具有使用 PyCrypto、AES、ECB 加密的值。无法用任何东西解密,我需要原始源代码(以及一些早已死去的 Linux 来运行它)。 AES 是一个标准的东西,为什么人们要做非标准的东西(比如在一些编译的 AES.so 中混淆一些密钥派生机制?)。 PyCrypto 关于堆栈溢出的一半答案只是教人们做一些奇怪的事情。 好的,如果您的 Linux 发行版不再支持 PyCrypto,最好的办法是在 VM 中运行旧的 Linux 发行版,解密数据,然后将其转换为更标准的格式。跨度>

以上是关于使用 PyCrypto 进行 AES 加密并使用 mcrypt 进行解密的主要内容,如果未能解决你的问题,请参考以下文章

python AES加密/解密器使用PyCrypto

使用AES + CTR的PyCrypto问题

python 利用Crypto进行ECB 加密

python怎么对文件进行加密解密

https学习笔记二----基础密码学知识和python pycrypto库的介绍使用

使用 AES-256 和 PKCS7 填充加密