Шифрование AEGIS с расширением PHP Sodium

Источник: «AEGIS Encryption with PHP Sodium Extension»
Расширение Sodium в PHP 8.4 теперь поддерживает шифры аутентифицированного шифрования AEGIS-128L и AEGIS256. Они значительно быстрее, чем AES-GCM и CHACHA20-POLY1305. В этой статье мы сравним их и объясним, как безопасно шифровать и расшифровывать данные с помощью AEGIS-128L и AEGIS256 на PHP.

AEGIS — это семейство аутентифицированных алгоритмов шифрования на основе AES, которые значительно быстрее таких распространённых алгоритмов, как AES-GCM и CHACHA20-POLY1305. Расширение Sodium в PHP 8.4 поддерживает алгоритмы шифрования AEGIS-128L и AEGIS-256, если расширение Sodium скомпилировано с libsodium 1.0.19 или более поздней версии.

Два алгоритма шифрования семейства AEGIS, AEGIS-128L и AEGIS-256, в 2-3 раза быстрее, чем AES-GCM, и в 3-4 раза быстрее, чем алгоритмы CHACHA20-POLY1305. Они используют аппаратное ускорение AES на процессорных архитектурах x86_64 и aarch64 (64-битная архитектура ARM).

В документации AEGIS содержится подробная информация о внутренней работе алгоритмов.

Доступность AEGIS на PHP

Семейство алгоритмов шифрования AEGIS доступно на PHP, когда:

Чтобы проверить, доступен ли AEGIS на PHP, проверьте доступность одной из функций AEGIS:

if (function_exists('\sodium_crypto_aead_aegis128l_encrypt')) {
// AEGIS доступен
}

См. PHP 8.4: Sodium: Поддержка AEGIS-128L и AEGIS-256 для всех новых функций и констант AEGIS, добавленных в PHP 8.4.

AEGIS-128L

AEGIS-128L теоретически может шифровать данные длиной менее 2^64 бит и использует 128-битный ключ. Это единственный алгоритм симметричного шифрования в расширении Sodium, использующий 128-битный ключ, в то время как остальные используют 256-битный ключ.

Он также принимает 128-битное значение nonce, который необходимо предоставить для дешифрования.

Ниже приведён пример генерации ключа и nonce, шифрования данных с помощью дополнительных данных и их дешифровки:

// генерируем случайный ключ достаточной длины (16 байт)
// Это значение не должно быть публичным.
$key = sodium_crypto_aead_aegis128l_keygen();

// Генерируем случайное значение nonce длины SODIUM_CRYPTO_AEAD_AEGIS128L_NPUBBYTES (16 байт).
// Это значение должно храниться вместе с зашифрованным текстом, но не обязательно должно быть приватным
$nonce = random_bytes(SODIUM_CRYPTO_AEAD_AEGIS128L_NPUBBYTES);

// Дополнительные данные. Это может быть ID пользователя, e-mail или пустое значение.
$additional_data = '';

// Сообщение, которое нужно зашифровать
$message = 'Hello';

// Шифрование
$ciphertext = sodium_crypto_aead_aegis128l_encrypt($message, $additional_data, $nonce, $key);

// Дешифрование
$decryptedMessage = sodium_crypto_aead_aegis128l_decrypt($ciphertext, $additional_data, $nonce, $key); // "Hello"

AEGIS-256

AEGIS-256 использует 256-битные ключи и может шифровать данные длиной менее 2^64 бит. За некоторыми исключениями, AEGIS-256 примерно на 20 % более требователен к вычислениям, чем AEGIS-128L.

Ниже приведён пример генерации ключа и nonce, а также шифрования и дешифрования открытого текстового сообщения в шифрованный текст и обратно с использованием дополнительных данных:

// генерируем случайный ключ достаточной длины (32 байта)
// Это значение не должно быть публичным.
$key = sodium_crypto_aead_aegis256_keygen();

// Сгенерируйте случайное значение nonce длины SODIUM_CRYPTO_AEAD_AEGIS128L_NPUBBYTES (32 байта).
// Это значение должно храниться вместе с зашифрованным текстом, но не обязательно должно быть приватным
$nonce = random_bytes(SODIUM_CRYPTO_AEAD_AEGIS256_NPUBBYTES);

// Дополнительные данные. Это может быть ID пользователя, e-mail или пустое значение.
$additional_data = '';

// Сообщение, которое нужно зашифровать
$message = 'Hello';

// Шифрование
$ciphertext = sodium_crypto_aead_aegis256_encrypt($message, $additional_data, $nonce, $key);

// Дешифрование
$decryptedMessage = sodium_crypto_aead_aegis256_decrypt($ciphertext, $additional_data, $nonce, $key); // "Hello"

Производительность AEGIS в сравнении с AES-GCM и CHACHA20-POLY1305

Скорость шифрования семейства алгоритмов AEGIS примерно в два-три раза быстрее, чем у рекомендованного в настоящее время алгоритма AES-GCM. Например, среднее по мощности оборудование шифрует данные в AES-GCM со скоростью около 2,3 ГБ/с, а алгоритмы семейства AEGIS - со скоростью 4,5-5,0 ГБ/с.

Ниже приведены результаты бенчмарка, выполненного на процессоре AMD Ryzen 4800H, процессоре x86_64 с процессорными инструкциями AES-NI.

Для теста Скорость передачи данных блок случайных байт размером 20 МБ был зашифрован с помощью пяти алгоритмов, поддерживаемых расширением Sodium, и взято среднее значение из 100 итераций. В это число не входит время, затраченное на генерацию nonce и ключа.

В эталоне Операции/сек шифруется 1 КБ данных, берётся среднее значение из 1 млн итераций. Как и в случае с эталоном скорости передачи данных, здесь не учитывается время работы RNG.

АлгоритмСкорость передачи данных (ГБ/сек)Операций/сек
aes256gcm2.31 ГБ/сек1,168,300 оп/сек
chacha20poly13051.29 ГБ/сек738,411 оп/сек
chacha20poly1305_ietf1.28 ГБ/сек746,409 оп/сек
xchacha20poly13051.28 ГБ/сек692,764 оп/сек
aegis128l4.99 ГБ/сек1,925,310 оп/сек
aegis2564.61 ГБ/сек1,771,924 оп/сек
Алгоритмы AEGIS в два раза быстрее, чем AES-GCM, и в 3-4 раза быстрее, чем CHACHA20-POLY1305. Бенчмарк: шифрование 20 МБ данных и среднее значение 100 итераций на процессоре AMD Ryzen 4800H.
Алгоритмы AEGIS в два раза быстрее, чем AES-GCM, и в 3-4 раза быстрее, чем CHACHA20-POLY1305. Бенчмарк: шифрование 20 МБ данных и среднее значение 100 итераций на процессоре AMD Ryzen 4800H.
Алгоритмы AEGIS могут выполнять более чем в два раза больше операций шифрования в секунду по сравнению с AES-GCM. Бенчмарк - шифрование 1 КБ данных 1 миллион раз на процессоре AMD Ryzen 4800H.
Алгоритмы AEGIS могут выполнять более чем в два раза больше операций шифрования в секунду по сравнению с AES-GCM. Бенчмарк - шифрование 1 КБ данных 1 миллион раз на процессоре AMD Ryzen 4800H.

Все приведённые здесь алгоритмы AES будут работать быстрее на процессорах с инструкциями AES-NI. В основном это касается мобильных устройств младшего класса и других маломощных устройств, таких как встраиваемые устройства, которые не будут иметь инструкций AES-NI. Однако большинство серверов, на которых работает PHP, скорее всего, будут оснащены процессорами, способными достигать аналогичных скоростей, как показано в результатах бенчмарка выше.

Дополнительные материалы

Предыдущая Статья

Понимание обработки исключений в Laravel

Следующая Статья

PHP 8.4: Sodium: Поддержка AEGIS-128L и AEGIS256