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

2 投票
5 回答
5136 浏览
提问于 2025-04-11 09:33

我需要在一个Ruby客户端和一个Python服务器之间发送加密数据(反之亦然),但是在使用ruby-aes这个库时遇到了一些麻烦。这个库使用起来很简单,但我们在它和Python的pyCrypto AES库之间传递数据时遇到了问题。这些库在单独使用时似乎没问题,但在不同语言之间配合使用时就不太顺利了。有没有什么好的建议?

补充说明:我们是通过SOAP进行通信的,也尝试过将二进制数据转换为base64,但都没有成功。此外,两个库的加密和解密几乎相同,但又不完全一样(比如,长度差一个字符,或者解密后的字符串末尾多了些无用的字符)。

5 个回答

2

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

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

  1. 确保密钥是一样的(这很明显)。把它们转成十六进制格式,然后逐字节比较一下。
  2. 确保初始化向量是一样的。这就是在pyCrypto中的里的IV参数。也把它转成十六进制格式。
  3. 确保使用的模式是一样的。这是pyCrypto中的里的mode参数。

在pyCrypto中,IVmode有默认值,但不要指望它们和Ruby实现中的一样。最好使用一些简单的模式,比如CBC。我发现不同的库对复杂模式(比如PTR)的解释可能会有所不同。

维基百科上有一篇很好的文章,讲解了分组密码模式

5

(例如,长度相差一个字符或者解密后的字符串末尾有多余的垃圾字符)

我之前没注意到这一点。你的加密和解密没有问题。听起来像是填充的问题。AES加密总是以128位为一个块来处理数据。如果你的数据长度不是128位的整数倍,那么在加密之前需要对数据进行填充,而在解密后需要去掉或忽略这些填充的部分。

3

原来发生的事情是,ruby-aes会自动给数据填充到16个字符,并在最后的字符串末尾加一个空字符作为分隔符。而PyCrypto要求数据的长度必须是16的倍数,这样我们才弄明白ruby-aes是怎么处理的。

撰写回答