2011-08-11 76 views
5

我必须使用Ruby加密一段文本。为此我使用了Ruby-Openssl gem。这个加密文本是他们传递给一个python程序,我必须解密它。我用Pycrypto来达到目的。我们不得不手动指定填充约定。在Ruby中,填充是自动完成的。我正在使用AES-CBC分组密码模式。由于Python的剥离无法在Python中正确执行,因此此填充会导致问题。作为一个例子,这些都是Ruby和Python的加密文本中的Base64编码:Ruby-OpenSSL之间的AES加密/解密,PyCrypto

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

请帮您必须指定正确的填充模式两种使用...

回答

3

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

使用PyCrypto时,必须使用Python完成填充manually

一旦你在Python中应用这个填充方案,两个加密的Base64字符串都应该匹配。

+0

我试过使用M2Crypto。不幸的是,它似乎不适用于链接中提供的程序。我会尝试应用PKCS#5填充。 – vishy1618

+0

它使用填充逻辑,谢谢! – vishy1618

+0

不错 - 不客气! – emboss

0

看样子案例 - 填充是密码流的基本属性,并且必须在接收者和发送者两者上进行匹配。

+0

填充可以在PyCrypto中手动操作,即您正在指定填充的逻辑。另一方面,在Ruby中,填充是自动完成的,除了复制Python中的逻辑外,我没有看到任何配置它的方法。 – vishy1618

+0

您需要在Python中执行Ruby中自动执行的操作,或者在两者中手动执行。 – agf

+0

我还没有想出一种方法来在Ruby中手动执行它。这让我修改了我的python程序,除了我不知道如何在Ruby-Openssl中完成填充。 – vishy1618