aes256. шифрование и расшифрование на PHP

163
10 ноября 2018, 08:00

имеем

$plaintext = 'Мой текст';
$password = 'Мой пароль';
$method = 'aes-256-cbc';
$key = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);
$iv = chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0);
$encrypted = base64_encode(openssl_encrypt($plaintext, $method, $key, OPENSSL_RAW_DATA, $iv));
$decrypted = openssl_decrypt(base64_decode($encrypted), $method, $key, OPENSSL_RAW_DATA, $iv);
echo 'encrypted to: ' . $encrypted . "<br>";
echo 'decrypted to: ' . $decrypted . "";

Вроде все норм. Зашифровали, зашифрованное расшифровали. Решил страницу, с результатами по обновлять. Оказывается encrypted - всегда разный, но и черт с ним. Ради интереса взял зашифрованное сообщение, и попытался расшифровать

$decrypted = openssl_decrypt(base64_decode('3ijR8qNwEKezwrnjZk1kM7cBuR0JLhU+e6g+UDkEpPc='), $method, $key, OPENSSL_RAW_DATA, $iv);

И тут начинается веселье, в место расшифрованного сообщения - пусто

Господа, прошу подсказать. Правилен ли пример, правильно ли шифрую, и почему при расшифровке уже зашифрованного сообщения ни чего не происходит ( точнее получается ПУСТО )

p.s. ест-но попробовал и с двойными кавычками, что бы исключить вероятность ошибки - результат тот же

Answer 1

password_hash генерирует случайную соль, и помещает ее вначало хеша. Поэтому у вас каждый раз другой ключ, а значит и другой шифротекст. Вы запускаете код снова, генерируется новый ключ, и при расшифровке получается мусор.

Можете попробовать вот так:

$key = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12, 'salt' => 'your-salt']);

Тогда ключи будут одинаковыми. Но явное указание соли в password_hash объявлено устаревшим.

Вы можете напрямую передавать ваш пароль, и openssl сгенерирует с него ключ:

$encrypted = base64_encode(openssl_encrypt($plaintext, $method, $password, OPENSSL_RAW_DATA, $iv));
$decrypted = openssl_decrypt(base64_decode($encrypted), $method, $password, OPENSSL_RAW_DATA, $iv);

Еще одно примечание: использование постоянного IV строго нерекомендуется.

READ ALSO
Как скрыть верхушку виджета?

Как скрыть верхушку виджета?

Тобишь нужно скрыть верхушку у самописного диалогового окна (там где заголовок, кнопка выхода)При этом такая конструкция при инициализации...

137
Класс для использования в list

Класс для использования в list

Есть два класса:

223
Как применять координатные преобразования к региону в GDI+?

Как применять координатные преобразования к региону в GDI+?

В этой статье приведена следующая информация:

178