我正在使用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"
有什么想法吗?提前谢谢。
答案 0 :(得分:6)
最后我使用了Gibberish AES,它同时由同一作者编写了Ruby和JavaScript实现:
答案 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)。