我正在尝试在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);
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句