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

3

为了存储一些敏感数据,我决定在磁盘上使用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正常工作...

1
如果你将aes.encrypt(text)的结果写入文件而不是标准输出,会发生什么?使用diff命令确保它们是相同的。将密文传输到标准输出是奇怪的,因为它永远不会是可打印的数据。如果你运气不好,重定向可能甚至都不起作用。 - ojrac
重定向甚至不起作用?乍一看很奇怪。你有关于为什么会这样的任何参考资料吗?尽管如此,我刚刚尝试直接写入文件。结果得到了相同的文件。 - mkluwe
2个回答

1

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


PyCrypto在未指定IV时使用什么作为IV? - oxygen

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

3
假设我的Linux发行版不再支持PyCrypto,相关网站也已关闭,并且我无法在我的系统上编译源代码。这对于我宝贵但加密的数据来说是个糟糕的情况。此外,我想要验证我的加密是否按照我的预期进行。我看到有很多组合可以实现AES,所以我不能把这当做理所当然。关于其他解决方案:是的,OpenSSL看起来是一个不错的选择。我还没有找到一个Python绑定,可以让我访问加密功能。 - mkluwe
当然。这就是为什么您需要保留解密工具的副本。您不需要一个Python有趣的OpenSSL;您可以使用命令行界面和Popen。 - vy32
我必须迁移一些数据从一个超过15年的数据库。它有使用PyCrypto,AES,ECB加密的值。无法使用任何东西解密它,我需要原始源代码(和一些已经死亡的Linux来运行它)。AES是一个标准的东西,为什么人们要做非标准的事情(比如在一些编译后的AES.so中混淆一些关键派生机制)?Stack Overflow上一半的PyCrypto答案只是教人们做一些奇怪的事情。 - oxygen
好的,如果你的Linux发行版不再支持PyCrypto,那么最好的选择是在虚拟机中运行旧的Linux发行版,解密数据,并将其转换为更标准的格式。 - vy32

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接