AES-256 CBC加密在Ruby / PHP中成功,但解密失败了CryptoJS

时间:2016-10-14 16:44:07

标签: javascript encryption encoding aes cryptojs

我可以用AES-256 CBC加密PHP或Ruby中的字符串(使用gem symmetric-encryption)并得到相同的结果。

<?php
openssl_encrypt(
  'Hello!', 'aes-256-cbc', '1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF', 0, '1234567890ABCDEF1234567890ABCDEF'
); // => 'BAd5fmmMTvRE4Ohvf3GpCw=='
ruby_cipher = SymmetricEncryption::Cipher.new(key: "1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF", iv: "1234567890ABCDEF1234567890ABCDEF", cipher_name: 'aes-256-cbc')
ruby_cipher.encrypt("Hello!") # => "BAd5fmmMTvRE4Ohvf3GpCw=="

但是我无法使用CryptoJS使用Javascript解密相同的字符串。至于我可以解释文档:

  

var encrypted = CryptoJS.AES.encrypt(&#34; Message&#34;,key,{iv:iv});

     

var decrypted = CryptoJS.AES.decrypt(&#34; Message&#34;,key,{iv:iv});

查看我在my jsfiddle或此处的失败尝试:

var key            = CryptoJS.enc.Hex.parse("1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF");
var iv             = CryptoJS.enc.Hex.parse"1234567890ABCDEF1234567890ABCDEF");

var ruby_encrypted = "BAd5fmmMTvRE4Ohvf3GpCw==";                            // Output from the Ruby encryption
var js_encrypted   = CryptoJS.AES.encrypt("Hello!", key, { iv: iv });       // Test to confirm that CryptoJS can decrypt its own encrypted

var ruby_decrypted = CryptoJS.AES.decrypt(ruby_encrypted, key, { iv: iv }); // Object { words: Array[4], sigBytes: -129 }
var js_decrypted   = CryptoJS.AES.decrypt(js_encrypted, key, { iv: iv });   // Object { words: Array[4], sigBytes: 6 }

console.log(ruby_decrypted.toString(CryptoJS.enc.Utf8));                    //
console.log(js_decrypted.toString(CryptoJS.enc.Utf8));                      // Hello!

知道解密失败的原因吗?

1 个答案:

答案 0 :(得分:0)

PHP和Ruby将密钥和IV作为二进制字符串。他们不假设它是十六进制编码的,这意味着只会使用64个字符键的前32个字符。 OpenSSL默默地只使用它需要的字节数,并且不会抛出错误(在这种情况下它应该是这样)。

你可能在CryptoJS中需要这样的东西:

var key    = CryptoJS.enc.Utf8.parse("1234567890ABCDEF1234567890ABCDEF");
var iv     = CryptoJS.enc.Utf8.parse("1234567890ABCDEF");

因此,虽然这个密钥有256位,但安全性实际上只有128位,因为每个字符在十六进制编码的字符串中只有4位。