在Ruby / Python中使用哪个AES库?

我需要能够在Ruby客户端和Python服务器之间发送加密数据(反之亦然),并且在使用ruby-aes gem /库时遇到了问题。 该库非常易于使用,但我们在它与Python的pyCrypto AES库之间传递数据时遇到了麻烦。 当它们是唯一使用的库时,这些库看起来很好,但它们似乎在语言边界上不能很好地发挥作用。 有任何想法吗?

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

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

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

事实certificate发生的事情是ruby-aes自动填充数据以填充16个字符并在最终字符串的末尾添加空字符作为分隔符。 PyCrypto要求你做16个字符的倍数,这就是我们弄清楚ruby-aes正在做什么的方式。

没有更多信息,甚至很难猜测发生了什么……

如果我是你,我会在你的Python和Ruby程序中检查:

  1. 键是相同的(显然)。 将它们转储为hex并比较每个字节。
  2. 初始化向量是相同的。 这是AES.new()AES.new()中的参数IV 。 也将它们转储为hex。
  3. 模式是相同的。 AES.new()AES.new()中的参数mode

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

维基百科有一篇关于块密码模式的文章。

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

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

“b”表示二进制。 如果您要将加密数据写入Python文件:

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

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

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

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