【问题标题】:Decrypting PHP openssl_ecrypt with NodeJS crypto errors使用 NodeJS 加密错误解密 PHP openssl_ecrypt
【发布时间】:2018-09-27 15:09:02
【问题描述】:

我们有一个旧的 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 个字符,该错误仍然存​​在。

【问题讨论】:

  • AES-256 的密钥大小为 23 字节。 PHP 可以容忍较小的键(我认为它用零字节填充),但 Node 会抛出异常。你也不会解码你的密文。
  • crypto.stackexchange.com/questions/3298/…(不,它不会用零填充,它是 openssl 的东西,而不是 PHP 的东西)
  • @symcbean 我指的是键盘填充,而不是纯文本填充。但你是对的,它是一个 openssl 的东西,它与语言无关。
  • 我尝试将密钥填充到 23 个字节,但它仍然给出密钥长度错误。另外,“你不解码你的密文”是什么意思?
  • @Soabirw 抱歉,打错字了,我的意思是 32 字节(256 位 = 32 字节)。并且不要忘记在解密之前进行base64解码。

标签: php node.js encryption openssl cryptography


【解决方案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');

【讨论】:

    猜你喜欢
    • 2014-05-31
    • 2016-09-23
    • 2017-08-28
    • 1970-01-01
    • 2019-06-26
    • 2018-07-04
    • 1970-01-01
    • 2014-02-17
    • 2019-11-04
    相关资源
    最近更新 更多