Я пытаюсь понять, как AES шифрует фрагмент текста (16 байт — 128 бит). Этот код из Руководство по PHP:
$key = openssl_random_pseudo_bytes(32);
$plaintext = "message to be encrypted";
$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);
//store $cipher, $iv, and $tag for decryption later
$original_plaintext = openssl_decrypt($ciphertext, $cipher, $key, $options=0, $iv, $tag);
echo $original_plaintext."\n";
}
Единственная проблема в том, что я не совсем понимаю. $cipher
является aes-128-gcm
но я получаю 32 байта шифрования.
Итак, мои вопросы:
Может кто-нибудь помочь мне понять, как это на самом деле работает?
Можно ли сделать это 16 байт / 128 байт?
И безопасно ли хранить $cipher
, $iv
, $key
а также $tag
в базу данных MySQL для дальнейшего использования?
П.С .: если я изменюсь $key
длина до 16
вместо 32
окончательный вывод $ciphertext
все еще 32 байта.
Спасибо!
Единственная проблема в том, что я не совсем понимаю. $ cipher — это aes-128-gcm, но я получаю 32-байтовое шифрование.
AES-GCM является аутентифицированным шифром. Если вы пытаетесь узнать, как работает основной строительный блок, вы хотите поиграть с aes-128-ecb
вместо.
Если вы хотите в режиме реального шифрования, вы хотите продолжать использовать GCM, никогда не ЕЦБ.
И безопасно ли хранить $ cipher, $ iv, $ key и $ tag в базе данных MySQL для дальнейшего использования?
Вы можете хранить все Кроме ключ, безопасно. Ключ позволяет вам расшифровать.
Других решений пока нет …