我们有一个旧版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个字符,该错误仍然存在。
答案 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');