2008-10-13 58 views
2

我需要能够在Ruby客户端和Python服务器之间发送加密数据(反之亦然),并且一直在使用ruby-aes gem/library时遇到问题。该库非常易于使用,但是我们一直无法在它与Python的pyCrypto AES库之间传递数据。当他们是唯一被使用的图书馆时,这些图书馆似乎没有问题,但是它们似乎在语言边界上表现不佳。有任何想法吗?哪个AES库在Ruby/Python中使用?

编辑:我们正在通过SOAP进行通信,并尝试将二进制数据转换为base64无济于事。此外,两者之间的加密/解密差不多也不完全相同(例如,长度相差一个或在解密的字符串的末尾有额外的垃圾字符)

+0

问题标题有点误导,因为没有答案围绕使用哪个库。这是更好的:http://stackoverflow.com/questions/172486/what-pure-python-library-to-use-for-aes-256-encryption – wsorenson 2009-09-14 15:38:27

回答

3

结果是ruby-aes自动填充数据填充16个字符,并在最后一个字符串的末尾添加空字符作为分隔符。 PyCrypto要求你做16个字符的倍数,这就是我们如何弄清ruby-aes在做什么。

1

类型取决于如何您正在传输加密的数据。您可能正在用一种语言编写文件,然后尝试从另一种语言读入文件。 Python(特别是在Windows上)要求您为二进制文件指定二进制模式。所以在Python中,假设你想在那里解密,你应该像这样打开文件:

f = open('/path/to/file', 'rb') 

“b”表示二进制。如果你正在写的加密数据从Python文件:

f = open('/path/to/file', 'wb') 
f.write(encrypted_data) 
+0

谢谢,但在这种情况下,我们通过SOAP服务器。我认为有一个类似的模拟,但用于SOAP而不是二进制文件。 – 2008-10-13 05:44:32

+0

加密(二进制)数据如何封装在SOAP数据包中?听起来更像是一个SOAP问题给我。也许你应该在问题中增加更多细节。 – mhawke 2008-10-13 05:46:42

+0

您可以通过尝试从一种语言写入二进制文件,然后使用另一种语言解密来消除Ruby和Python之间的语言和/或加密库问题。如果这样做,那么看看传输层。 – mhawke 2008-10-13 05:57:48

2

很难,即使在发生了什么没有更多的信息猜...

如果我是你,我会检查您Python和Ruby程序:

  1. 键是相同的(很明显)。将它们转储为十六进制并比较每个字节。
  2. 初始化向量相同。这是pyCrypto中的AES.new()中的参数IV。将它们也转储为十六进制。
  3. 模式是相同的。 pyCrypto中参数modeAES.new()

有在pyCrypto IVmode默认值,但不相信他们是一样的,在Ruby实现。使用其中一种更简单的模式,如CBC。我发现不同的库对模式复杂模式(如PTR)如何工作有不同的解释。

维基百科有一篇关于如何block cipher modes的伟大文章。

1

基本上Hugh在上面说过:检查IV,密钥大小和链接模式以确保所有内容都是相同的。

独立测试双方,对一些信息进行编码并检查Ruby和Python是否完全相同。你假设问题与加密有关,但它可能只是简单的发送加密的数据puts,它将随机换行引发到数据中。一旦确定他们正确地加密数据,请检查您是否收到您认为您发送的内容。继续前进,直到找到破坏数据的阶段。

另外,我建议使用openssl库,它包含在ruby的标准库中,而不是使用外部gem。

5

(例如,长度相差一个或存在对解密的字符串的末尾额外垃圾字符)

我错过了位。你的加密/解密没有问题。这听起来像是一个填充问题。 AES始终以128位的数据块编码数据。如果数据长度不是128位的倍数,则应在加密之前填充数据,并且在加密后需要删除/忽略填充。