Шифрование AEGIS с расширением PHP Sodium
- Доступность AEGIS на PHP
AEGIS-128L
AEGIS-256
- Производительность AEGIS в сравнении с AES-GCM и CHACHA20-POLY1305
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, когда:
- PHP версии 8.4 и выше и
- Расширение Sodium, скомпилированное с помощью
libsodium
1.0.19 и более поздних версий, и - на процессорных архитектурах
x86_64
илиaarch64
Чтобы проверить, доступен ли 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.
Алгоритм | Скорость передачи данных (ГБ/сек) | Операций/сек |
---|---|---|
aes256gcm | 2.31 ГБ/сек | 1,168,300 оп/сек |
chacha20poly1305 | 1.29 ГБ/сек | 738,411 оп/сек |
chacha20poly1305_ietf | 1.28 ГБ/сек | 746,409 оп/сек |
xchacha20poly1305 | 1.28 ГБ/сек | 692,764 оп/сек |
aegis128l | 4.99 ГБ/сек | 1,925,310 оп/сек |
aegis256 | 4.61 ГБ/сек | 1,771,924 оп/сек |
Все приведённые здесь алгоритмы AES будут работать быстрее на процессорах с инструкциями AES-NI
. В основном это касается мобильных устройств младшего класса и других маломощных устройств, таких как встраиваемые устройства, которые не будут иметь инструкций AES-NI
. Однако большинство серверов, на которых работает PHP, скорее всего, будут оснащены процессорами, способными достигать аналогичных скоростей, как показано в результатах бенчмарка выше.