使用NodeJS加密错误解密PHP openssl_ecrypt

时间:2018-09-27 15:09:02

标签: php node.js encryption openssl cryptography

我们有一个旧版PHP系统,该系统通过openssl_encrypt加密了一些数据。 PHP代码非常简单。 (在此示例中,所有值都是随机生成的,但格式和长度与实际值相同,并且会产生相同的错误)。

$in = '12345';
$method = 'AES-256-CBC';
$key = '5fjfwc7kp84z5yet358t';
$options = 0;
$iv = '8x69nt6qnptg3x4j';
openssl_encrypt($in, $method, $key, $options, $iv);

通过PHP解密也很简单。

$in = 'yy03+cUpsq5uGWclBLtwIA==';
$method = 'AES-256-CBC';
$key = '5fjfwc7kp84z5yet358t';
$options = 0;
$iv = '8x69nt6qnptg3x4j';
openssl_decrypt($in, $method, $key, $options, $iv);

但是,当尝试将其移植到Node crypto上时,在尝试不同方法时,密钥长度,iv长度以及许多其他错误不断出现。

const input = Buffer.from('yy03+cUpsq5uGWclBLtwIA==');
const iv = Buffer.from('8x69nt6qnptg3x4j');
const key = Buffer.from('5fjfwc7kp84z5yet358t');

let decipher = crypto.createDecipheriv('aes-256-cbc', key, iv, 0);
let clearText = decipher.update(input, 'base64', 'utf8');
clearText += decipher.final('utf8');

我可能已经在NodeJS中尝试了六个或更多示例,但所有示例都会产生错误,并且无法完全解密。

当前错误是“无效密钥长度”,即使我将其限制为16个字符,该错误仍然存​​在。

1 个答案:

答案 0 :(得分:1)

填充和base64处理是解决方案。工作代码看起来更接近此:

const keyStr = '5fjfwc7kp84z5yet358t';
const diff = Math.abs(keyStr.length - 32);
const padding = Buffer.alloc(diff, 0x00);
const input = Buffer.from('yy03+cUpsq5uGWclBLtwIA==', 'base64');
const iv = Buffer.from('8x69nt6qnptg3x4j');
let key = Buffer.from('5fjfwc7kp84z5yet358t');
key = Buffer.concat([key, padding]);

const decipher = crypto.createDecipheriv('aes-256-cbc', key, iv, 0);
let clearText = decipher.update(input, 'base64', 'utf8');
clearText += decipher.final('utf8');