javascript - Node.js 中的 PHP aes-256-cbc mcrypt_decrypt() 等价物

标签 javascript php node.js encryption

我正在尝试将此有效的 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/

相关文章:

node.js - 使用 ExpressJS 将文件上传到 S3,同时限制文件大小

javascript - 如何将输入框的数组名称添加到 HTML 中?

javascript - 如何使用 html 分割可变长度字段

php - 当字符串大小无关紧要时,为什么 strlen() 比使用变量慢

php - 在 foreach 循环外访问变量 PHP

php - 在 Zend Framework 2 模型中访问 MySQL 数据库的最简单方法

node.js - Node.js 中的 Twit 配置错误

node.js - 主体错误: Implementing ngx-soap client in Angular 4

javascript - 是否有检测 Firefox 的 "good practice"方法?

javascript - 将类的静态方法转换为变量 typescript