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

Encrypt with AES using phpseclib and decrypt with 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 上解密。我尝试了不同的库,但到目前为止没有成功。我想这个问题与每个库的编码输出不同有关。

有没有人有关于如何实现这种互操作性场景的工作示例?

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

所以思路是解密如下:

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

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

CryptoJS 支持两种类型的加密。如果您将密钥作为字符串传递,它将使用 OpenSSL 的密钥派生函数来派生一个带盐的新密钥。您不希望这样,因为您使用的是显式密钥。为此,您需要将密钥作为 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);