PHP - расшифровать зашифрованную строку из Node.js - PullRequest
0 голосов
/ 05 февраля 2019

Я хочу расшифровать зашифрованную строку (зашифрованную в Nodejs) с помощью PHP, переданного на сервер.

Я нашел идеальную библиотеку Nodejs для шифрования / дешифрования: Cryptr .Я создал соединение в своем файле JavaScript, отправив запрос на мой сервер с зашифрованной строкой.

Теперь я хочу расшифровать эту строку.

Взгляните на Источник Cryptr , похоже, они используют aes-256-ctr в качестве алгоритма и sha256 в качестве метода шифрования.

Мои Nodejs: https://runkit.com/embed/keu82yjhwyxj

Зашифрованная строка:1d510024ad0a5da624b76a2be72022bff3aaadfe8ac5e0b6c178b00333

Затем я делаю это в PHP:

<?php
$encrypted = "1d510024ad0a5da624b76a2be72022bff3aaadfe8ac5e0b6c178b00333";
$algorithm = "aes-256-ctr";
$secret_key = "myTotalySecretKey"; 
$iv = "";

$decrypted_data = openssl_decrypt(pack('H*', $encrypted), $algorithm, $secret_key, OPENSSL_RAW_DATA, $iv);
echo $decrypted_data;

Но так как IV генерируется случайным образом в Cryptr, как бы я сгенерировал это в PHP?

Какможно расшифровать зашифрованные строки Cryptr с помощью PHP, поэтому он возвращает «Я люблю пиццу!»? *


Редактировать:

Вместо упаковки ('H* ', $ encrypted) попробуйте использовать только $ encrypted.Кроме того, вам нужны только данные, метод и ключ для расшифровки.

<?php
$encrypted = "1d510024ad0a5da624b76a2be72022bff3aaadfe8ac5e0b6c178b00333";
$algorithm = "aes-256-ctr";
$secret_key = "myTotalySecretKey";

$decrypted_data = openssl_decrypt($encrypted, $algorithm, $secret_key);
echo $decrypted_data;

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

НЕ ИСПОЛЬЗУЙТЕ CRYPTR. Это небезопасно. Я открыл проблему с разработчиком, хотя я не уверен, как это можно исправить без полной перезаписи модуля.

Cryptr использует режим шифрования CTR.Этот режим предназначен для особых случаев использования и не устойчив к атакам податливости.Если содержимое любого зашифрованного сообщения известно, можно преобразовать это сообщение в любое другое сообщение.Например, учитывая зашифрованную строку из примера использования:

const cryptr = new Cryptr('myTotalySecretKey');

const encryptedString = cryptr.encrypt('bacon');
const decryptedString = cryptr.decrypt(encryptedString);

console.log(encryptedString); // "bcb23b81c4839d06644792878e569de4f251f08007"

(Обратите внимание, что зашифрованная строка даже не имеет той длины, которая показана в использовании модуля. Это явная ошибка в ихдокументация.)

Не зная ключа, можно изменить эту строку, чтобы она расшифровывалась как «привет»:

var tmp = Buffer.from(encryptedString, "hex");
var b1 = Buffer.from("bacon"), b2 = Buffer.from("hello");
for (var i = 0; i < b1.length; i++) {
    tmp[i + 16] ^= b1[i] ^ b2[i];
}
var ep = tmp.toString("hex");
console.log(ep); // "bcb23b81c4839d06644792878e569de4f855ff8306"

И действительно:

var dp = cryptr.decrypt(ep);
console.log(dp); // "hello"

Это действительно большое дело с точки зрения криптографии.Злоумышленник только что изменил зашифрованное сообщение при передаче, и у вас нет возможности его обнаружить.

Не используйте этот модуль.Если вам нужно переносимое шифрование, используйте библиотеку Sodium ;привязки доступны как для Node, так и для PHP.

0 голосов
/ 05 февраля 2019

Вам нужно сдать IV при передаче сообщения и ключа безопасности.

Итак, я сделал небольшой тест

$encrypted = openssl_encrypt("test", "aes-256-ctr", "123", 0, "aaaaaaaaaaaaaaaa");
$algorithm = "aes-256-ctr";
$secret_key = "123"; 
$iv = "";

$decrypted_data = openssl_decrypt($encrypted, $algorithm, $secret_key, 0, "aaaaaaaaaaaaaaaa");
echo $decrypted_data;

И это работает.Да, он генерируется случайным образом, но вы можете и должны передать его (как зашифрованное сообщение) на сервер.

Я не уверен, какова цель параметра IV, но PHP предупреждает вас, если параметр IVпусто.

Я только что нашел это на странице GitHub для Cryptr.Там написано:

Случайно генерируется iv и добавляется результат

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...