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

2024-04-25 14:13:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要能够在Ruby客户机和Python服务器之间发送加密数据(反之亦然),并且在使用ruby-aesgem/库时遇到了问题。这个库非常容易使用,但是我们在它和pycryptoaes库之间传递数据时遇到了困难。当这些库是唯一被使用的库时,它们看起来还不错,但它们似乎不能很好地跨越语言边界。有什么想法吗?在

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


Tags: 数据字符串语言编辑客户机二进制soap边界
3条回答

(e.g., the lengths differ by one or there is extra garbage characters on the end of the decrypted string)

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

如果没有更多的信息,很难猜测发生了什么。。。在

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

  1. 钥匙是一样的(显然)。将它们转储为十六进制并比较每个字节。在
  2. 初始化向量是相同的。这是pyCrypto中AES.new()中的参数IV。把他们也扔了。在
  3. 模式相同。pyCrypto中AES.new()中的参数mode。在

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

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

结果发现,rubyaes自动填充数据以填充16个字符,并在最后一个字符串的末尾添加一个空字符作为分隔符。PyCrypto要求你做16个字符的倍数,所以我们就知道rubyaes在做什么。在

相关问题 更多 >