【问题标题】:Key length issue: AES encryption on phpseclib and decryption on PyCrypto密钥长度问题:phpseclib 上的 AES 加密和 PyCrypto 上的解密
【发布时间】:2013-02-15 09:22:24
【问题描述】:

我正在从事一个数据密集型项目,我一直在使用 PHP 获取数据并使用 phpseclib 对其进行加密。部分数据已在 AES 中使用 ECB 模式进行加密,但密钥长度仅为 10。我能够成功解密数据。

但是,我需要在项目的后期使用 Python,因此需要使用它来解密我的数据。我尝试使用 PyCrypto,但它告诉我密钥长度必须是 16、24 或 32 字节长,但事实并非如此。根据 phpseclib 文档,“键被空填充到最接近的有效大小”,但我不确定如何在 Python 中实现它。简单地用 6 个空格扩展字符串的长度是行不通的。

我该怎么办?

【问题讨论】:

  • 根据 phpseclib 文档,“键被空填充到最接近的有效大小” > 哇。
  • @Duncan Jones - 听起来你在批评 phpseclib?您会提出什么替代方案?如果您想使用 PBKDF2,请使用 setPassword()。 setKey() 适用于 phpseclib 的 SSH2 实现之类的东西,并且不使用 PBKDF2。密钥是通过 diffie-hellman 密钥交换导出的。如果您对通过该密钥派生的密钥执行 PBKDF2,您的实现将无法与任何其他 SSH 实现互操作。至于空填充与为 setKey() 引发错误.. 该行为与 PHP 的 API tbh 一致。静默调整数据,而不是抛出错误。
  • @neubert "该行为与 PHP 的 API tbh 一致" > 好的,那是有道理的。尽管如此,我还是担心有多少 PHP 应用程序有一个小的编码错误,导致使用短/弱键而无人问津!
  • phpseclib 的作者插话:github.com/phpseclib/phpseclib/issues/135 基本上,据他说,phpseclib 的做事方式不仅与 neubert 的 PHP 一致,而且与其他加密库一致像 mcrypt 和 OpenSSL。

标签: php python aes pycrypto phpseclib


【解决方案1】:

我强烈建议您调整您的 PHP 代码以使用(至少)16 字节的密钥,否则您的加密系统会比其他方式弱得多。

我还建议您切换到 CBC 模式,因为 ECB 模式可能会揭示您输入数据中的模式。确保每次加密时使用随机 IV 并将其与密文一起存储。

最后,解决您最初的问题:

根据 phpseclib 文档,“键被空填充到最接近的有效大小”,但我不确定如何在 Python 中实现它。简单地用 6 个空格扩展字符串的长度是行不通的。

空格字符0x20与空字符0x00不同。

【讨论】:

  • 对这个答案投了两次反对票 - 如果有人能建议我在哪里犯了错误,我将不胜感激?
猜你喜欢
  • 2012-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-24
  • 1970-01-01
  • 2011-04-11
相关资源
最近更新 更多