AES CryptoJSencryption和phpseclib解密

我有下一个问题
在Node.js上我有一个下一个代码

var iv = CryptoJS.enc.Hex.parse('00000000000000000000000000000000'); //it's for tests, later it will be dynamically generated var key256Bits = 'A5178B6A965AACF3CD60B07A15061719'; var cipher = CryptoJS.AES.encrypt( 'Some text', key256Bits, { iv: iv, padding:CryptoJS.pad.ZeroPadding } ).toString(); 

然后当我尝试用phpseclib解码它

 $key = 'A5178B6A965AACF3CD60B07A15061719'; $data = /*text encrypted by JS*/; $cipher = new AES(); $cipher->setKeyLength(256); $cipher->setKey($key); $res = $cipher->decrypt($data); 

然后$ res变成一个空string
我做错了什么?

如果传递一个string给CryptoJS.<cipher>.encrypt作为一个密钥,那么CryptoJS将它视为一个密码,并且将使用OpenSSL的EVP_BytesToKey以随机salt和一个MD5迭代的方式派生实际的密钥。

phpseclib没有这个实现,所以你可以传入实际的密钥:

 var key256Bits = CryptoJS.enc.Utf8.parse('A5178B6A965AACF3CD60B07A15061719'); 

由于这个密钥长度只有32个,它只有128位的熵,但仍然使用AES-256。 你需要64个hexits,你可以解码之前获得32个字节的安全密钥大小。

此外,phpseclib实现PKCS#7填充,所以你需要使用

 padding: CryptoJS.pad.Pkcs7 

在CryptoJS。

JavaScript代码示例:

 var iv = CryptoJS.enc.Hex.parse('00000000000000000000000000000000'); //it's for tests, later it will be dynamically generated var key256Bits = CryptoJS.enc.Utf8.parse('A5178B6A965AACF3CD60B07A15061719'); var cipher = CryptoJS.AES.encrypt( 'Some text', key256Bits, { iv: iv, padding: CryptoJS.pad.Pkcs7 } ).toString(); console.log(cipher) 
 <script src="https://cdn.rawgit.com/CryptoStore/crypto-js/3.1.2/build/rollups/aes.js"></script>