【问题标题】:AES encryption/decryption between Ruby-OpenSSL, PyCryptoRuby-OpenSSL、PyCrypto 之间的 AES 加密/解密
【发布时间】:2011-10-24 16:26:39
【问题描述】:

我必须使用 Ruby 加密一段文本。为此,我使用了 Ruby-Openssl gem。这个加密的文本是他们传递给一个 python 程序的,我必须使用它来解密它。为此,我使用了 Pycrypto。

问题是,在 Pycrypto 中我们必须手动指定填充约定。在 Ruby 中,填充是自动完成的。我正在使用 AES-CBC 分组密码模式。这种填充会导致问题,因为它的剥离无法在 Python 中正确执行。例如,以下是 Ruby 和 Python 中加密文本的 base64 编码:

Python: aENJY28lvE89yY2T/te8vWwdeoeSqSwwlrOAv7b3AWw=
Ruby:   aENJY28lvE89yY2T/te8vVoQE6JNxdSRgYXC8mqF3nI=

请帮忙...

【问题讨论】:

    标签: python ruby pycrypto


    【解决方案1】:

    OpenSSL 默认应用 PKCS#5Padding,因此在 AES-CBC 模式下使用 OpenSSL::Cipher 加密数据时也会自动使用(参见 OpenSSL docs)。因此在使用 Ruby 时无需执行手动填充。

    使用 PyCrypto 时,必须在 Python 中完成 manually 的填充。

    在 Python 中应用此填充方案后,两个加密的 Base64 字符串应该匹配。

    【讨论】:

    • 我尝试使用 M2Crypto。不幸的是,它似乎不适用于链接中提供的程序。我将尝试应用 PKCS#5 填充。
    【解决方案2】:

    看来您需要指定在这两种情况下使用的正确填充模式 - 填充是密码流的基本属性,并且必须在接收方和发送方上匹配。

    【讨论】:

    • 可以在 PyCrypto 中手动操作填充,即,您正在指定执行填充的逻辑。另一方面,在 Ruby 中,填充是自动完成的,除了复制 Python 中的逻辑之外,我看不到任何配置它的方法。
    • 您要么需要在 Python 中完成在 Ruby 中自动完成的工作,要么在两者中手动完成。
    • 我还没有想出在 Ruby 中手动完成的方法。这让我不得不修改我的 python 程序,除了我不知道如何在 Ruby-Openssl 中完成填充。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多