繁体   English   中英

解密PHP中的一个字符串,用crypto在JS中加密

[英]Decrypt a string in PHP, crypted in JS with crypto

我正在尝试解密 PHP 中的字符串,我可以在 JS 中完成,但我不能通过 PHP 完成。

密码学新手,我尝试恢复我的原始字符串,但找不到解决方案。

所以我在 JS 中有以下代码:

const p1 = ['abc', 1, 'def', 'hij'].join('a');

let p2 = crypto.createHash('md5').update(p1, 'ascii').digest('hex') + 'a' + p1 + 'a';
while (p2.length % 16 > 0) p2 += ' ';

let result = crypto.createCipheriv('aes-128-ecb', 'aeda94ad8azd', '').update(p2, 'ascii', 'hex');

PHP 中的此代码:

$p1 = implode('a', ['abc', 1, 'def', 'hij']);

$p2 = hash('md5', $p1, false) . 'a' . $p1 . 'a';
dd($p2);

while (strlen($p2) % 16 > 0) $p2 .= ' ';

$result = openssl_encrypt($p2, 'aes-128-ecb', 'aeda94ad8azd', 0);

JS 结果:

让 p2 结果 = 7fbe3256bd8e9ac3e9b2e2ac9c1c812aaabca1adefahija p2 结果 while = 与 P2 相同,末尾有一个空格 让结果 = a7222dbd06b1ae0ea421ac968eba780f0e0e23317c25bab0ecf423b6ff95f1e25ede0bc65c15

PHP 结果:

$p2 结果 = 7fbe3256bd8e9ac3e9b2e2ac9c1c812aaabca1adefahija $p2 结果 while = 与 p2 相同,末尾有一个空格

$result = wE5FpEuPuWdL8D06y/jiqRB7kehRcLcBmI16AncqsKWeeqWm8Tj08anFBrnD0JWCP5/ihLo0AUZr0/+MBDjQvw==


我在 openssl_decrypt 中做错了什么? 我没有使用正确的function?

等待大家的帮助谢谢大家。 祝你今天过得愉快

我试了一下,但你在 Node.js 中使用了 Javascript,我没有使用它。 尽管如此,给出答案还是很有用的,因为我离你想要的结果有点近了。

首先,我注意到您的 JS 结果是十六进制的,而 PHP 结果可能是 Base64。需要进行一些转换。 我不得不使用原始结果,并删除填充以获得与您一样长的十六进制字符串。 PHP 代码为:

$raw    = openssl_encrypt($p2, 
                          'aes-128-ecb', 
                          'aeda94ad8azd', 
                          OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING);
$result = bin2hex($raw);

现在的结果是:

c04e45a44b8fb9674bf03d3acbf8e2a9107b91e85170b701988d7a02772ab0a59e7aa5a6f138f4f1a9c506b9c3d09582

相同类型(十六进制)和字符串长度,但不相同。 有两件事可能导致差异:

  • 文件的字符编码。 我查不到 node.js。
  • 键可能被不同地对待。 在 node.js 中,它必须在 UTF-8 中,我认为它在 PHP 中是二进制的。

无论如何,我希望这有点用处。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM