使用phpseclib使用AES加密并使用CryptoJS进行解密

时间:2016-03-02 10:41:53

标签: node.js encryption aes phpseclib cryptojs

我正在尝试使用CBC模式下的phpseclib AES加密字符串(库的默认设置):

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

然后,我需要使用CryptoJS或类似的方法解密nodejs。我尝试了不同的libs但到目前为止没有运气。我想这个问题与每个库的编码输出有所不同。

有没有人有一个如何实现这种互操作性方案的工作示例?

可以使用其他库,例如Crypto。 Base64输出示例为MF9lCR4DaW1R0adIe03VEw==

所以我的想法是解密如下:

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

1 个答案:

答案 0 :(得分:2)

您需要在解密期间先前生成的IV。它不必是秘密的,但它必须是不可预测的(在你的情况下)。您可以将其与密文一起发送。一种常见的方法是将其添加到密文并在解密期间将其切断。

CryptoJS支持两种类型的加密。如果将密钥作为字符串传递,它将使用OpenSSL的密钥派生函数来获取带有salt的新密钥。您不希望这样,因为您使用的是明确的密钥。为此,您需要将密钥作为WordArray(CryptoJS'本机二进制数据结构)传递。此外,密文应该是OpenSSL格式的字符串或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);