Blowfish 和 Blowfish-compat 有啥区别?

Posted

技术标签:

【中文标题】Blowfish 和 Blowfish-compat 有啥区别?【英文标题】:What's the difference between Blowfish and Blowfish-compat?Blowfish 和 Blowfish-compat 有什么区别? 【发布时间】:2012-07-10 11:19:03 【问题描述】:

我似乎无法找到差异的来源。我在这个在线解密工具中发现了这种差异

http://www.tools4noobs.com/online_tools/decrypt/

我有一些加密的 Blowfish 数据,我正试图通过 Python 的 PyCrypto 模块对其进行解密。然而,问题是数据似乎是用“blowfish-compat”加密的,因为这就是通过在线工具解密它所需要的;我无法通过 PyCrypto 的模块对其进行解密,并且我收集到它使用严格的 Blowfish 解密(而不是 Blowfish-compat,无论如何)。

是否可以通过 Python 以某种方式解密 Blowfish-compat?我不知道两者之间的区别。

【问题讨论】:

【参考方案1】:

好问题。它似乎是 mcrypt/libmcrypt 程序特有的东西。

我找不到任何文档,所以我查看了 libmcrypt 的源代码。它包含两个模块,一个用于河豚,一个用于河豚兼容。当我查看这些时,我能看到的唯一区别(警告:我是软件工程师,但不是加密专家)是交换了字节顺序的逻辑(ifdef WORDS_BIGENDIANifndef WORDS_BIGENDIAN 替换 - 请注意“ n")。

所以我的猜测是,它是用于在 big-endian 机器上解码在 little-endian 机器上编码的数据,反之亦然。或者也许有一些关于字节序的代码应该遵循的约定,但是一些库打破了它,这可以弥补。

更新啊哈!并且知道这一点,谷歌搜索“blowfish-compat big-endian”会出现看起来像是确认的东西。请参阅http://www.spinics.net/lists/crypto/msg00175.html - 它讨论了导致顺序颠倒的错误实现。

所以,简而言之,您的数据编码不正确。 “compat”模式会重现错误,以便对其进行解码。

鉴于此,除非您能找到 mcrypt 的 python 接口,否则您在 python 方面似乎运气不佳。 http://labix.org/python-mcrypt 看起来可能有效(pypi 页面 - http://pypi.python.org/pypi/python-mcrypt)。

(这是长期以来提供的最有趣的答案之一:o)

哦,我通过点击下载按钮下的“浏览所有文件”链接从http://sourceforge.net/projects/mcrypt/ 获得了源代码(该按钮下载的是 mcrypt,而不是 libmcrypt)。

【讨论】:

好东西,谢谢!我刚刚几乎放弃了希望,正准备用 php 重写,但你拯救了这一天!赞一个! 您的答案是正确的:但是对于使用 pycrypto 的每个人都有一点希望:您可以通过在加密之前反转字节顺序(4 字节块)并再次打开来“模拟”blowfish-compat加密结果。一个例子是这个提交github.com/pyropeter/otrtool/commit/… 如果您使用的是 CTR 之类的模式,则该仿真代码无法正常工作。就像如果你有 1234 它返回 4321 但如果你有 12 怎么办?明文不需要是 CTR 中块大小的倍数。您可以将 NULL 填充到最近的 8 个字节,之后它将无法工作

以上是关于Blowfish 和 Blowfish-compat 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

对称加密和非对称加密

几种加密算法的测试,包括对称加密和非对称加密

从使用 Blowfish 和 ECB 的 mcrypt 迁移到 OpenSSL

mcrypt_blowfish 使用的默认密钥大小是多长时间?

iOS blowfish加密解密

与 java 和 .net 相比,mcrypt blowfish php 结果略有不同