Я пытаюсь понять, как AES шифрует фрагмент текста (16 байт - 128 бит). Этот код взят из php manual :
$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 для дальнейшего использования?
P.S .: если я изменю $key
длину на 16
вместо 32
, то конечный вывод $ciphertext
будет по-прежнему 32 байта.
Спасибо!