【发布时间】: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