Расшифровка PHP openssl_ecrypt с криптографическими ошибками NodeJS - PullRequest
0 голосов
/ 27 сентября 2018

У нас есть устаревшая система 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, я продолжаю получать ошибки по длине ключа, длине 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 голосов
/ 27 сентября 2018

Обработка отступов и 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');
...