PHP AES 128-битное шифрование / дешифрование - PullRequest
0 голосов
/ 06 сентября 2018

Я пытаюсь понять, как 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 байта.

Спасибо!

1 Ответ

0 голосов
/ 12 сентября 2018

Единственная проблема в том, что я не совсем понимаю. $ cipher - aes-128-gcm, но я получаю 32-байтовое шифрование.

AES-GCM является аутентифицированным шифром. Если вы пытаетесь узнать, как работает базовый строительный блок, вам нужно поиграть с aes-128-ecb.

Если вы хотите использовать режим реального шифрования, вы хотите продолжать использовать GCM, никогда ECB .

И безопасно ли хранить $ cipher, $ iv, $ key и $ tag в базе данных MySQL для дальнейшего использования?

Вы можете безопасно хранить все кроме ключа. Ключ позволяет вам расшифровать.

...