Ruby-OpenSSL、PyCrypto 之间的 AES 加密/解密
我必须使用 Ruby 加密一段文本。为此,我使用了 Ruby-Openssl gem。这个加密的文本被传递给一个 python 程序,我必须使用它来解密它。我为此目的使用了 Pycrypto。
问题是,在 Pycrypto 中我们必须手动指定填充约定。在 Ruby 中,填充是自动完成的。我正在使用 AES-CBC 分组密码模式。这种填充会导致问题,因为它的剥离无法在 Python 中正确执行。例如,这些是 Ruby 和 Python 中加密文本的 Base64 编码:
Python: aENJY28lvE89yY2T/te8vWwdeoeSqSwwlrOAv7b3AWw=
Ruby: aENJY28lvE89yY2T/te8vVoQE6JNxdSRgYXC8mqF3nI=
请帮忙...
I have to encrypt a piece of text using Ruby. I've used the Ruby-Openssl gem for that purpose. This encrypted text is them passed to a python program using which I have to decrypt it. I've used Pycrypto for the purpose.
The problem is, in Pycrypto we have to specify the padding convention manually. In Ruby, the padding is done automatically. I'm using AES-CBC block cipher mode. This padding causes problems as its stripping cannot be performed properly in Python. As an example, these are the base64 encodings of an encrypted text in both Ruby and Python:
Python: aENJY28lvE89yY2T/te8vWwdeoeSqSwwlrOAv7b3AWw=
Ruby: aENJY28lvE89yY2T/te8vVoQE6JNxdSRgYXC8mqF3nI=
Please help...
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
OpenSSL 默认情况下应用 PKCS#5Padding,因此在 AES-CBC 模式下使用
OpenSSL::Cipher
加密数据时也会自动使用它(参见 OpenSSL 文档)。因此,使用 Ruby 时无需执行手动填充。使用 PyCrypto 时,必须在 Python 中手动完成填充。
在 Python 中应用此填充方案后,两个加密的 Base64 字符串应该匹配。
OpenSSL applies PKCS#5Padding by default, so this is also used automatically when encrypting data with
OpenSSL::Cipher
in AES-CBC mode (cf. OpenSSL docs). So there's no need to perform manual padding when using Ruby.The padding has to be done manually in Python when using PyCrypto.
Once you apply this padding scheme in Python, both encrypted Base64 strings should match.
看来您需要指定在这两种情况下使用的正确填充模式 - 填充是密码流的基本属性,并且必须在接收器和发送器上匹配。
It appears you need to be specifying the correct padding mode to use in both cases - padding is a fundamental property of a cipher stream, and must be matched on both receiver and sender.