JS / Ruby AES 256对称性

时间:2011-11-10 13:51:36

标签: javascript ruby encryption aes

我正在使用Ruby进行加密并使用AES-256使用JavaScript进行解密,但是我遇到了跨平台的麻烦,即JS在解密Ruby的输出时会返回乱码。

我在这里使用JS AES实现:http://www.movable-type.co.uk/scripts/aes.html

var decrypted = Aes.Ctr.decrypt(encrypted, key, 256);

和OpenSSL / Ruby:

def encrypt(string, key)
  Base64.encode64(aes(key, string)).gsub /\s/, ''
end

def aes(key,string)
  cipher = OpenSSL::Cipher::Cipher.new("aes-256-cbc")
  cipher.encrypt
  cipher.key = Digest::SHA256.digest(key)
  cipher_text = cipher.update(string)
  cipher_text << cipher.final
  return cipher_text
end

在红宝石中,我得到了:

encrypt("This is a test", "password")
# => "zDMm47GniTQ2p5a5UqSDbg=="

但是当在JS中解密时,我得到:

Aes.Ctr.decrypt("zDMm47GniTQ2p5a5UqSDbg==", "password", 256);
# => "Ü}$> 3"

有什么想法吗?提前谢谢。

2 个答案:

答案 0 :(得分:6)

最后我使用了Gibberish AES,它同时由同一作者编写了Ruby和JavaScript实现:

https://github.com/mdp/gibberish-aes

https://github.com/mdp/gibberish

答案 1 :(得分:1)

JS库是否期望密文是Base64编码的?基本上你正在做的是;

              key
               |
               v
plaintext -> encipher -> ciphertext -> Base64 encode -> "zDMm47GniTQ2p5a5UqSDbg=="

然后你试着像这样反转它;

                               key
                                |
                                v
"zDMm47GniTQ2p5a5UqSDbg==" -> decipher -> plaintext

您缺少&#34; zDMm47GniTQ2p5a5UqSDbg ==&#34;的Base64解码在做破译之前。事实上,当我尝试重现这个(使用java AES实现)时,我收到了一个错误,因为&#34; zDMm47GniTQ2p5a5UqSDbg ==&#34;甚至不是16个字节的倍数,这对于密码上的这种类型是必要的(AES块大小是128位)。

<强>更新
我不确定我是否相信JS AES实施,它肯定做了一些有趣的事情。它表示它在CTR模式下运行,这可能不是你想要的(你可能想要CBC)。