5

我正在尝试使用带有 Crypto Js(在客户端)和 Rails 中的 OpenSSL(在服务器端)的 AES-256-CBC 加密文本,它们给了我不同的结果。这解释了为什么我无法在服务器端解码加密文本,反之亦然。

这是我的做法:

客户端(加密 JS) - 已编辑

iv = CryptoJS.enc.Base64.parse("kT+uMuPwUk2LH4cFbK0GiA==")

key = CryptoJS.enc.Hex.parse("6476b3f5ec6dcaddb637e9c9654aa687")

encrypted_text = CryptoJS.AES.encrypt("test", key, {mode: CryptoJS.mode.CBC, formatter : Base64Formatter, iv : iv})

encrypted_text => "7Qu7/V7yXHt67wMOV0/1Tg=="

服务器端 (Rails OpenSSL) - 已编辑

iv = Base64.decode64("kT+uMuPwUk2LH4cFbK0GiA==")

key = "6476b3f5ec6dcaddb637e9c9654aa687"

cipher = OpenSSL::Cipher::Cipher.new('aes-256-cbc')

cipher.encrypt

cipher.key = key

cipher.iv = iv

text = cipher.update("test") + cipher.final

encrypted_text = Base64.strict_encode64(text)

encrypted_text => "fHhNBuopuuthdq2SFvvgDw=="

有谁知道我做错了什么?我只是在这一点上难住了。

非常感谢您的帮助..谢谢!

保罗

4

2 回答 2

2

根据文档 CryptoJS 似乎根据密钥大小选择 128/192/256。该密钥从十六进制解析回二进制时为 16 个字节,这意味着它将使用 AES-128-CBC 进行编码。因此,在 Ruby 端选择 AES-256-CBC 是不正确的。

此外,密钥没有在 ruby​​ 端进行十六进制解码。通过这些更改,代码如下所示:

iv = Base64.decode64("kT+uMuPwUk2LH4cFbK0GiA==")

key = ["6476b3f5ec6dcaddb637e9c9654aa687"].pack("H*")

cipher = OpenSSL::Cipher::Cipher.new('aes-128-cbc')

cipher.encrypt

cipher.key = key

cipher.iv = iv

text = cipher.update("test") + cipher.final

encrypted_text = Base64.strict_encode64(text)

输出是=> "7Qu7/V7yXHt67wMOV0/1Tg==". 正是我们所期望的。

于 2013-07-27T14:51:27.947 回答
2

在行中:

key = CryptoJS.enc.Hex.parse("abcdefghijklmnopqrstuvwxyz012345")

字符串“abcdefghijklmnopqrstuvwxyz012345”不是十六进制表示法。我会从那开始。

于 2012-05-15T05:51:32.467 回答