使用phpseclib使用AES进行encryption,并使用CryptoJS进行解密

我想在CBC模式下使用phpseclib AESencryptionstring(库的默认值):

$cipher = new Crypt_AES(); $cipher->setKey('abcdefghijklmnop'); $cipher->setIV(crypt_random_string($cipher->getBlockLength() >> 3)); $cipher->encrypt("hello world") 

然后,我需要使用CryptoJS或类似的解密nodejs ..我已经尝试了不同的库,但没有运气到目前为止。 我想这个问题是有关的编码输出不同,从每个库。

有没有人有一个如何实现这个互操作性场景的工作示例?

其他库如Crypto可以使用。 一个示例Base64输出是MF9lCR4DaW1R0adIe03VEw==

所以这个想法是解密如下:

 var helloWorld = CryptoJS.AES.decrypt("MF9lCR4DaW1R0adIe03VEw==", key).toString(); 

在解密期间,您需要先前生成的IV。 它不一定是保密的,但必须是不可预知的(这是你的情况)。 你可以把它和密文一起发送。 一种常用的方法是将其预先encryption到密文中,并在解密过程中将其切断。

CryptoJS支持两种types的encryption。 如果将密钥作为string传递,它将使用OpenSSL的密钥派生函数来派生一个带有盐的新密钥。 你不需要这个,因为你使用了一个明确的密钥。 为此,您需要将密钥作为WordArray(CryptoJS的本地二进制数据结构)传递。 另外,密文有望是OpenSSL格式的string或CipherParams对象:

 var message = CryptoJS.AES.decrypt({ ciphertext: CryptoJS.enc.Base64.parse("MF9lCR4DaW1R0adIe03VEw==") }, CryptoJS.enc.Utf8.parse('abcdefghijklmnop'), { iv: iv // retrieve the IV somehow }).toString(CryptoJS.enc.Utf8);