我需要能够在Ruby客户端和Python服务器之间发送加密数据(反之亦然),并且遇到了ruby-aes gem /库的问题。该库非常易于使用,但我们在它与Python的pyCrypto AES库之间传递数据时遇到了麻烦。当它们是唯一被使用的库时,它们似乎很好,但它们似乎不能在语言边界上发挥良好作用。有什么想法吗?
编辑:我们正在通过SOAP进行通信,并且还尝试将二进制数据转换为base64无济于事。此外,更多的是加密/解密在两者之间几乎但不完全相同(例如,长度相差一个或在解密字符串的末尾有额外的垃圾字符)
答案 0 :(得分:5)
(例如,长度相差一个或解密字符串末尾有额外的垃圾字符)
我错过了那一点。加密/解密没有问题。这听起来像填充问题。 AES总是以128位的块编码数据。如果数据长度不是128位的倍数,则应在加密前填充数据,并且在加密后需要删除/忽略填充。
答案 1 :(得分:3)
原来发生的事情是ruby-aes自动填充数据以填充16个字符并在最后一个字符串的末尾添加一个空字符作为分隔符。 PyCrypto要求你做16个字符的倍数,这就是我们如何弄清楚ruby-aes正在做什么。
答案 2 :(得分:2)
如果没有更多信息,甚至很难猜测发生了什么......
如果我是你,我会在你的Python和Ruby程序中检查它:
IV
中的参数AES.new()
。也将它们转储为十六进制。mode
中的参数AES.new()
。 pyCrypto中有IV
和mode
的默认值,但不相信它们与Ruby实现中的相同。使用其中一种更简单的模式,如CBC。我发现不同的库对模式复杂模式(如PTR)的工作方式有不同的解释。
维基百科有一篇关于如何block cipher modes的精彩文章。
答案 3 :(得分:1)
取决于您如何传输加密数据。您可能正在用一种语言编写文件,然后尝试从另一种语言中读取文件。 Python(特别是在Windows上)要求您为二进制文件指定二进制模式。所以在Python中,假设你想在那里解密,你应该打开这样的文件:
f = open('/path/to/file', 'rb')
“b”表示二进制。如果您要将加密数据写入Python文件:
f = open('/path/to/file', 'wb')
f.write(encrypted_data)
答案 4 :(得分:1)
基本上Hugh说:检查IV,密钥大小和链接模式以确保一切都相同。
独立测试双方,编码一些信息并检查Ruby和Python是否以相同方式对其进行了编码。您假设问题与加密有关,但它可能只是像发送加密数据一样简单,puts
会将随机换行引入数据。一旦您确定他们正确加密数据,请检查您是否收到了您认为发送的内容。继续一步一步,直到找到破坏数据的阶段。
另外,我建议使用包含在ruby标准库中的openssl库,而不是使用外部gem。