php - Node.js:如何破译用 php 加密的文本?

标签 php node.js cryptography openssl mcrypt

我的 PHP 加密看起来像这样:

<?
$salt = '…';
$data = '…';

$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CFB), MCRYPT_RAND);
$ciphered = trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $salt, $data, MCRYPT_MODE_ECB,$iv)));

我试图用以下代码破译上面代码的结果:

ciphered = '…';
crypto = require('crypto');
salt = crypto.createHash('md5').update('…').digest('hex');
iv = '0123456789123455';
decipher = crypto.createDecipheriv('aes-256-cbc', salt, iv);
deciphered = decipher.update(ciphered, 'base64');
deciphered += decipher.final('utf-8');

此代码导致:TypeError: DecipherFinal fail

最佳答案

我看到的几个问题:

  1. 操作模式不匹配。您为 CFB (Cipher Feedback) 操作模式生成一个 IV,您使用 ECB(Electronic Code Book - 不推荐,只需查看该 wiki 文章中的图像了解原因)作为您实际加密时的模式,然后尝试解密使用 CBC ( Cipher Block Chaining) 模式。你应该坚持一种模式(可能是 CBC)。为此,保持解密端 aes-256-cbc 并使加密端 MCRYPT_MODE_CBC

  2. 您将 $salt(实际上是您的 key )传递给 mcrypt_encrypt,但没有对它进行哈希处理,而是对其进行哈希处理,并在 crypto.createDecipheriv 时返回一个十六进制字符串> 根据 its documentation 需要一个 binary 编码的字符串.两个键必须相同,并且需要遵循正确的编码,以便它们在传递给函数时保持相同。

  3. 看起来您在加密端生成一个 IV,然后在解密端使用固定字符串作为 IV。 IV(Initialization vector)需要和密文一起传给解密方(也可以明文和密文一起传)。

  4. 根据 its documentation,解密对象的 update 方法不接受 base64 作为编码.您需要将 base64 文本转换为其他内容(可能是二进制编码),然后使用正确的编码将其传递给更新方法。

  5. PHP 的默认字符集是 ISO-8859-1,但您正在尝试将密文解密为 UTF-8 字符串。这可能会导致问题,尤其是当您使用标准 ASCII 中使用的字符以外的字符时。您要么需要确保您的 PHP 端以 UTF-8 模式运行(查看 this SO answer 了解如何操作),要么确保您的输入仅使用 ASCII 字符(ISO-8859-1 是 ASCII 的超集) 并使用“ascii”输出编码。

您的大部分问题都归结为编码问题。我对 node.js 上的各种编码类型知之甚少,因此您需要自行研究,但加密原语的问题应该很容易解决。请务必阅读我链接的文档和 mcrypt_encrypt documentation

关于php - Node.js:如何破译用 php 加密的文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14573630/

相关文章:

php - 查找找到数据的列

node.js - 在 Asana Node.js 中创建任务

memory - 密码学:内存中 key 的最佳实践?

java - 如何在 CertPath 验证中使用 OCSP 响应

php - 改变div中的数据

php - 如何将 wp-admin 重定向到另一个 url

javascript - 带有 HTTPS 请求的 Node.JS UnhandledException

c++ - 在 Crypto++ 中加载 PEM 编码的私有(private) RSA key

php - 需要 $_SESSION 变量的 mysql_real_escape_string() 吗?

node.js - 从 super 账本结构获取 "Error: 8 RESOURCE_EXHAUSTED: Sent message larger than max (2217 vs. 15)"