LINUX.ORG.RU

Шифрование PHP openssl, проблемы.

 ,


0

2

Ситуация такая. Допустим вот этот код:

$key = 'asdfg';
$plaintext = 'Шифруемый текст';
$cipher = "aes-128-gcm";
$iv = 'asdf';
$ciphertext = openssl_encrypt($plaintext, $cipher, $key, $options = 0, $iv, $tag);
echo $ciphertext;
Возвращает строку: 'TGNHV3h0cFJ4TmJjWXZEUHR1c2h2WTUwSDhIVTM0d1FuellJdnlJPQ=='

А вот этот код ее не расшифровывает:

$key = 'asdfg';
$iv = 'asdf';
$ciphertext = 'TGNHV3h0cFJ4TmJjWXZEUHR1c2h2WTUwSDhIVTM0d1FuellJdnlJPQ==';
$cipher = "aes-128-gcm";
$original_plaintext = openssl_decrypt($ciphertext, $cipher, $key, $options = 0, $iv, $tag);
echo $original_plaintext;

При этом код с https://www.php.net/manual/ru/function.openssl-encrypt.php

$key = 'asdfg';
// например, с помощью openssl_random_pseudo_bytes
$plaintext = "данные для шифрования";
$cipher = "aes-128-gcm";
if (in_array($cipher, openssl_get_cipher_methods()))
{
    $ivlen = openssl_cipher_iv_length($cipher);
    $iv = openssl_random_pseudo_bytes($ivlen);
    $ciphertext = openssl_encrypt($plaintext, $cipher, $key, $options=0, $iv, $tag);
    // сохраняем $cipher, $iv и $tag для дальнейшей расшифровки
    $original_plaintext = openssl_decrypt($ciphertext, $cipher, $key, $options=0, $iv, $tag);
    echo $original_plaintext."\n";
}
работает прекрасно. Но у него есть один недостаток. Он работает только в одном скрипте. Я не понимаю как сохранять шифрованные данные чтобы использовать их другими скриптами.

Что я делаю не так?

Ответ на: комментарий от shtain

К сожалению это не решает проблему. Расшифровка не работает.

Вот так работает:

$key = 'asdfg';
$plaintext = 'Шифруемый текст';
$cipher = "aes-128-gcm";
$iv = 'asdf';
$ciphertext = openssl_encrypt($plaintext, $cipher, $key, $options = 0, $iv, $tag);
echo $ciphertext;

$original_plaintext = openssl_decrypt($ciphertext, $cipher, $key, $options = 0, $iv, $tag);
echo $original_plaintext;

А по отдельности нет

Maksimko ()
Последнее исправление: Maksimko (всего исправлений: 1)

Исправь пост выше, у нас маркдаун нынче в почёте. Не знаю пыхи, но вижу, что $key во втором случае у тебя не $key = ‘asdfg’; а просто какой-то мусор, да?

peregrine ★★★★★ ()
Ответ на: комментарий от peregrine

Первый пост, первые 2 блока кода.

Сначала выполняешь первый, получаешь строку которую засовываешь во второй блок в переменную $ciphertext. Она должна вернуть $plaintext из первого блока кода. Но она ничего не возвращает.

$key $iv можно абсолютно любые. Главное чтобы совпадали в обоих блоках.

Maksimko ()
Последнее исправление: Maksimko (всего исправлений: 1)

У вас в примере написано

// сохраняем $cipher, $iv и $tag для дальнейшей расшифровки

Однако в коде, который должен расшифровывать, $tag не определена.

NeOlip ()
Ответ на: комментарий от NeOlip

она и там не определена. Она роли не играет.

Проблема в том, что код со всеми недостатками и неопределенностями работает только одной сессии.

по отдельности расшифровка не работает

Maksimko ()
Ответ на: комментарий от Maksimko

Во-первых, используй aes-128-ctr вместо aes-128-gcm. Это нужно, так как aes-128-gcm использует $tag, генерируемый при шифровании строки. Во-вторых, используй openssl_encrypt() и openssl_decrypt() без $tag. В-третьих, сохраняй $iv между шифрованиями. Так как он содержит бинарные данные перегоняй их в base64 при шифровании и раскодируй при дешифровании

r0ck3r ★★★★★ ()
Ответ на: комментарий от Maksimko

она и там не определена. Она роли не играет.

Она роль как раз играет. Переменная $tag инициализируется при выполнении openssl_encrypt, а затем используется в openssl_decrypt. Это код аутентификации в режиме GCM: https://ru.wikipedia.org/wiki/Galois/Counter_Mode

static_lab ★★★★★ ()