我正在尝试将此有效的 php 代码移植到 Node.js,但出现错误:IV 长度 32 无效
这是 PHP 代码:
//--- PHP example code (works): ---
$aes_iv = 'MjY2YjljMmM0MjVjNzVlMGMyZGI2NjAwN2U5ZGMzZDQ%3D';
$payload = base64_decode($payload);
$aes_iv = base64_decode($aes_iv);
// secret key. 64 character hex string:
$shared_key = '14370ced836 ...';
// convert from hex to binary string:
$shared_key = pack('H*', $shared_key);
// AES decrypt payload
$payload = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $shared_key, $payload, MCRYPT_MODE_CBC, $aes_iv);
// AES adds null characters to the end of short strings,
// so we should strip them out
$payload = rtrim($tp_payload, "\0");
这是不起作用的 Node.js 代码。 请参阅“错误:无效的 IV 长度 32”
//--- Node.js equivalent ??? ---
var aes_iv = 'MjY2YjljMmM0MjVjNzVlMGMyZGI2NjAwN2U5ZGMzZDQ%3D';
var payload_s = new Buffer(payload, 'base64').toString();
var aes_iv_s = new Buffer(aes_iv, 'base64').toString();
// secret key. 64 character hex string:
var shared_key = '14370ced836 ...';
// convert from hex to binary string:
var shared_key_b = new Buffer(shared_key, 'hex').toString('binary');
// Error: Invalid IV length 32
var decipher = crypto.createDecipheriv('aes-256-cbc', shared_key_b, aes_iv_s);
var decoded = decipher.update(payload_s);
decoded += decipher.final();
console.log(decoded);
最佳答案
MCRYPT_RIJNDAEL_256
指的是 rijndael 加密算法,具有 256
位的非标准 block 大小,而不是 key 大小 256
位。 PHP 使用 libmcrypt
进行加密,而 Node.js 使用 openssl
,而 libmcrypt 实现了 AES( block 大小为 128 位),它还实现了具有可配置 block 大小的 rijndael。
AES 专门定义了 128 位的 block 大小,这是 rijndael openssl 支持的唯一版本。因此,我为名为 node-rijndael 的 Node 编写了一个最小的 libmcrypt 绑定(bind)。 ,这应该符合您的目的。另请参阅我对类似问题的回答 here .
var Rijndael = require('node-rijndael');
// shared_key
var key = '14370ced836...';
// aes_iv
var iv = new Buffer('MjY2YjljMmM0MjVjNzVlMGMyZGI2NjAwN2U5ZGMzZDQ=', 'base64');
var payload = new Buffer(/*payload*/);
var rijndael = new Rijndael(key, {
mode: Rijndael.MCRYPT_MODE_CBC,
encoding: 'hex', // shared_key encoding
iv: iv
});
// defaults to utf-8 output encoding
payload = rijndael.decrypt(payload);
payload = payload.replace(/\0+$/, '');
关于javascript - Node.js 中的 PHP aes-256-cbc mcrypt_decrypt() 等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25099305/