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

Источник: «PHP 8.4: Sodium: AEGIS-128L and AEGIS256 support»
AEGIS — это семейство алгоритмов аутентифицированного шифрования на основе AES, которое быстрее, чем AES-GCM. Расширение Sodium в PHP 8.4 поддерживает алгоритмы шифрования AEGIS-128L и AEGIS256, если расширение Sodium скомпилировано с libsodium 1.0.19 или более поздней версии.

Расширение PHP 8.4 Sodium поддерживает AEGIS-128L и AEGIS256 с помощью функций PHP, которые следуют шаблону _keygen, _encrypt и _decrypt по тому же шаблону, что и существующие алгоритмы шифрования aes256gcm, chacha20poly1305, chacha20poly1305_ietf и xchacha20poly1305. Все они являются алгоритмами Аутентифицированного Шифрования с Дополнительными Данными (AEAD).

Шифрование AEGIS с помощью расширения PHP Sodium

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

Новые функции и PHP константы

Расширение Sodium в PHP 8.4 добавляет шесть новых функций PHP и четыре новые PHP константы для алгоритмов AEGIS-128L и AEGIS-256 AEAD.

Функции и константы AEGIS-128L

AEGIS-128L — это алгоритм AEAD, принимающий 128-битный ключ и 128-битное значение nonce и способный шифровать/дешифровать данные размером менее 2*64 бит.

Синопсис функции sodium_crypto_aead_aegis128l_keygen

/**
* Генерация случайного ключа AEGIS-128L
* @return string
*/

function sodium_crypto_aead_aegis128l_keygen(): string

Синопсис функции sodium_crypto_aead_aegis128l_encrypt

/**
* Шифрование с последующей аутентификацией с помощью AEGIS-128L.
* @param string $message Сообщение для шифрования в виде обычного текста.
* @param string $additional_data Дополнительные, аутентификационные данные. Эти данные используются при проверке аутентификационного тега, добавляемого к шифротексту, но они не шифруются и не хранятся в шифротексте.
* @param string $nonce Число, которое должно быть использовано только один раз в одном сообщении. Длина 16 байт.
* @param string $key Ключ шифрования (128 бит).
* @return string Зашифрованный шифротекст
*/

function sodium_crypto_aead_aegis128l_encrypt(string $message, string $additional_data, string $nonce, string $key): string

Синопсис функции sodium_crypto_aead_aegis128l_decrypt

/**
* Проверьте, а затем расшифруйте сообщение с помощью AEGIS-128L.
* @param string $message Зашифрованное сообщение, созданное функцией sodium_crypto_aead_aegis128l_encrypt().
* @param string $additional_data Дополнительные, аутентифицированные данные. Используется для проверки тега аутентификации, добавляемого к шифротексту, но не шифруется и не хранится в шифротексте. Это должно быть то же значение, которое было передано при шифровании открытого текста.
* @param string $nonce Число, которое должно быть использовано только один раз в одном сообщении. Длина 16 байт. Это должно быть то же самое значение nonce, которое было передано при шифровании сообщения с открытым текстом.
* @param string $key Ключ шифрования (128 бит).
* @return string Дешифрованный текст
*/

function sodium_crypto_aead_aegis128l_decrypt(string $message, string $additional_data, string $nonce, string $key): string

Функции и константы AEGIS-256

Синопсис функции sodium_crypto_aead_aegis256_keygen

/**
* Generate a random AEGIS-256 key
* @return string
*/

function sodium_crypto_aead_aegis256_keygen(): string

Синопсис функции sodium_crypto_aead_aegis256_encrypt

/**
* Шифрование и последующая аутентификация с помощью AEGIS-256.
* @param string $message Сообщение для шифрования в виде обычного текста.
* @param string $additional_data Дополнительные, аутентификационные данные. Эти данные используются при проверке аутентификационного тега, добавляемого к шифротексту, но они не шифруются и не хранятся в шифротексте.
* @param string $nonce Число, которое должно быть использовано только один раз в одном сообщении. Длина 32 байта.
* @param string $key Ключ шифрования (256 бит).
* @return string Зашифрованный шифротекст
*/

function sodium_crypto_aead_aegis256_encrypt(string $message, string $additional_data, string $nonce, string $key): string

Синопсис функции sodium_crypto_aead_aegis256_decrypt

/**
* Проверка и последующая расшифровка сообщения с помощью AEGIS-256.
* @param string $message Зашифрованное сообщение, созданное функцией sodium_crypto_aead_aegis256_encrypt().
* @param string $additional_data Дополнительные, аутентификационные данные. Используется для проверки аутентификационного тега, добавляемого к шифротексту, но не шифруется и не хранится в шифротексте. Это должно быть то же значение, которое было передано при шифровании обычного текста.
* @param string $nonce Число, которое должно быть использовано только один раз в одном сообщении. Длина 32 байта. Это должно быть то же самое значение nonce, которое было передано при шифровании сообщения с открытым текстом.
* @param string $key Ключ шифрования (256 бит).
* @return string Дешифрованный текст
*/

function function sodium_crypto_aead_aegis256_decrypt(string $ciphertext, string $additional_data, string $nonce, string $key): string|false

Проверка доступности AEGIS-128L и AEGIS-256

Не существует специальной функции, подобной sodium_crypto_aead_aes256gcm_is_available, которая бы возвращала, доступны ли алгоритмы AEGIS-128L и AEGIS-256 AEAD.

Однако новые функции и константы объявляются только в том случае, если выполнены все требования. Для этого требуется процессор x86_64 или aarch64, PHP 8.4 и расширение Sodium, скомпилированное с libsodium версии 1.0.19 или более поздней. Проверка доступности одной из новых функций служит проверкой доступности этих алгоритмов:

function_exists('sodium_crypto_aead_aegis256_encrypt') {
// AEGIS-128L доступен.
}

Примеры использования AEGIS-128L и AEGIS-256

Подробную информацию и бенчмарки этих двух алгоритмов AEAD смотрите в статье Шифрование AEGIS с расширением PHP Sodium.

Ниже приведены примеры, демонстрирующие использование двух новых алгоритмов шифрования.

AEGIS-128L

// генерируем случайный ключ достаточной длины (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

// генерируем случайный ключ достаточной длины (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-128L и AEGIS-256 добавлены в качестве новых функций и констант в расширение Sodium в PHP 8.4.

Проект sodium_compat предоставляет пользовательский PHP-полифилл для расширения Sodium. В проекте открыт вопрос о добавлении поддержки AEGIS-128L и AEGIS-256, хотя никаких работ в этом направлении не ведётся.

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

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

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

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

Основы TypeScript: ООП практика, классы и наследование