【问题标题】:Porting AES code from M2Crypto to pycrypto将 AES 代码从 M2Crypto 移植到 pycrypto
【发布时间】:2013-01-16 10:41:49
【问题描述】:

我想将一些现有的 AES 代码从 M2Crypto 转换为等效的 pycrypto,但文档很薄,尤其是对于 M2Crypto。我已将相关代码缩减为gist。主要问题是:

  • Pycrypto 要求输入长度为 16 的倍数,而 m2crypto 则不需要。
  • 即使输入长度是 16 的倍数,密文也不同。在对 M2Crypto 密码参数进行实验后,发现将 paddingkey_as_bytes 设置为 false 会与 pycrypto 加密到相同的密文。所以我需要在纯python中模拟padding=Truekey_as_bytes=True

任何帮助将不胜感激。

编辑:已解决 - 要点已使用等效的 M2Crypto/pycrypto 代码和测试进行了更新,我将把它留在那里,以防将来有人发现它有用。

【问题讨论】:

    标签: encryption aes pycrypto m2crypto


    【解决方案1】:

    您必须实现 PKCS#7 填充/取消填充,这很简单,并且在 RSA 实验室的公开可用标准中指定,当然在 Wikipedia 上也有。另请参阅此答案:

    AES 256 Encryption with PyCrypto using CBC mode - any weaknesses?

    请注意,PKCS#7 填充和 PKCS#5 填充是相同的,尽管后者正式仅适用于 8 字节块密码(例如 DES/TDEA)。 OpenSSL 默认使用 PKCS#7 填充。

    【讨论】:

    • 谢谢,解决了填充问题!我更新了要点并验证了将 KEY_AS_BYTES 更改为 false 时密文匹配。现在需要弄清楚key_as_bytes 做了什么。
    • 如果你不是那么幸运,那是一个错误的EVP_BytesToKey(3)。我说不幸是因为 OpenSSL 使用专有的密钥派生函数,这可能意味着在 Python 中实现它。这是可行的,如果你测试得好,这不是一个真正的安全问题,但它确实需要一些密码知识。
    • 主要感谢this answer,我最终弄明白了这一点,并通过更广泛的测试更新了要点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-30
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多