@RashonS
Юный программист, изучающий PHP JS JQUERY AJAX

Есть код шифрования по ключу. Но дешифровка выводится «не так» (возможно ошибка в кодировке) php?

Вот код шифрования:
function encrypt_decrypt($action, $string) {
	$output = false;
	$encrypt_method = "AES-256-CBC";
	$secret_key = "ключ";
	$secret_iv = openssl_random_pseudo_bytes(16);

	$key = hash('sha256', $secret_key);

	$iv = substr(hash('sha256', $secret_iv), 0, 16);
	if ( $action == 'encrypt' ) {
	    $output = openssl_encrypt($string, $encrypt_method, $key, 0, $iv);
	    $output = base64_encode($output);
	} else if( $action == 'decrypt' ) {
	    $output = openssl_decrypt(base64_decode($string), $encrypt_method, $key, 0, $iv);
	}
	return $output;
}

Вот пример:
$plain_txt = "Здравствуйте!";
echo "Plain Text = " .$plain_txt. "<br>";

$encrypted_txt = encrypt_decrypt('encrypt', $plain_txt);
echo "Encrypted Text = " .$encrypted_txt. "<br>";

$decrypted_txt = encrypt_decrypt('decrypt', $encrypted_txt);
echo "Decrypted Text = " .$decrypted_txt. "<br>";


Должно выводиться так:
Plain Text = Здравствуйте
Encrypted Text = "Зашифрованный вид"
Decrypted Text = Здравствуйте

Но выводится то ли не с правильной кодировкой, то ли я не знаю:
Plain Text = Здравствуйте!
Encrypted Text = "Зашифрованный вид"
Decrypted Text = �Ä�߀����҇ہ��уйте!

Я пробовал base64_encode заменить на utf8_encode, Но разницы нет
  • Вопрос задан
  • 65 просмотров
Пригласить эксперта
Ответы на вопрос 2
SagePtr
@SagePtr
Еда - это святое
$secret_iv у вас при расшифровке генерируется снова, а он должен совпадать с тем, что использовался при шифровании. И он никакой не секретный, просто должен быть достаточно случайным, чтобы при двух разных шифрованиях не попал один и тот же $iv (иначе злоумышленник смекнёт, что начало сообщения не поменялось, и для него это даст дополнительную информацию)
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Дык вы каждый раз генерируете новый инициализирующий вектор, в результате при шифровании и дешифровании они у вас разные. Смотрите пример #2 в описании openssl_encrypt
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы