XChaCha20-Poly1305
XChaCha20-Poly1305 — это алгоритм аутентифицированного шифрования с дополнительными данными (AEAD), построенный на основе потокового шифра ChaCha20 с увеличенным до 192 бит размером одноразового номера (nonce) и кода аутентификации сообщения Poly1305. Он является расширением стандартного алгоритма ChaCha20-Poly1305, предложенного Даниэлем Бернштейном, и предназначен для обеспечения конфиденциальности, целостности и аутентичности данных при случайной генерации одноразовых номеров или в сценариях, где требуется высокая устойчивость к коллизиям nonce.
История и происхождение
Алгоритм ChaCha20 был разработан Даниэлем Бернштейном в 2008 году как модификация потокового шифра Salsa20. В 2014 году он был принят в качестве стандарта для протокола TLS (Transport Layer Security) в наборе шифров TLS 1.2 и 1.3. Poly1305, также созданный Бернштейном, представляет собой одноразовый аутентификатор сообщения (MAC), работающий по принципу полиномиального хеширования в поле GF(2¹³⁰−5). Комбинация ChaCha20 и Poly1305 была стандартизирована в RFC 8439.
XChaCha20-Poly1305 был предложен в 2016 году криптографами Лукасом Хенриксеном, Скоттом Аркином и Фрэнком Денисом как расширение, позволяющее использовать случайные nonce без риска повторного использования ключа. Основная мотивация — устранение ограничения стандартного ChaCha20-Poly1305, где 96-битный nonce требует генерации уникального значения для каждого сообщения, что в распределённых системах или при параллельной обработке может привести к коллизиям. XChaCha20-Poly1305 не стандартизирован в RFC, но широко применяется в таких проектах, как libsodium (в виде функции crypto_aead_xchacha20poly1305_ietf) и в протоколе WireGuard.
Структура и принцип работы
XChaCha20-Poly1305 состоит из трёх основных компонентов: потокового шифра ChaCha20, функции расширения nonce и кода аутентификации Poly1305.
Потоковый шифр ChaCha20
ChaCha20 работает на основе 20 раундов (10 двойных раундов) над 512-битным состоянием, организованным в виде матрицы 4×4 из 32-битных слов. Состояние включает:
- 4 константы (0x61707865, 0x3320646e, 0x79622d32, 0x6b206574 — ASCII-представление «expand 32-byte k»);
- 8 слов ключа (256 бит);
- 2 слова счётчика (64 бита);
- 4 слова nonce (128 бит в стандартной версии, но в XChaCha20 используется модифицированная схема).
На каждом раунде применяются операции: сложение по модулю 2³², XOR и циклические сдвиги. Выходная последовательность генерируется путём XOR исходного состояния с состоянием после 20 раундов.
Расширение nonce в XChaCha20
Главное отличие XChaCha20 от стандартного ChaCha20 — использование 192-битного (24-байтового) nonce. Процесс расширения включает два этапа:
- Вычисление подключа: Первые 128 бит (16 байт) nonce вместе с 256-битным ключом подаются на вход ChaCha20 с нулевым счётчиком и без дополнительных раундов. Выходные 512 бит (64 байта) используются как новый ключ для шифрования.
- Шифрование: Оставшиеся 64 бита (8 байт) nonce используются как стандартный nonce для ChaCha20 (с дополнением до 128 бит нулями). Далее выполняется обычное шифрование с 256-битным производным ключом.
Таким образом, XChaCha20 фактически преобразует 256-битный ключ и 192-битный nonce в новый 256-битный ключ, после чего работает как стандартный ChaCha20-Poly1305 с 64-битным nonce. Это позволяет использовать случайные nonce без необходимости поддержания счётчика, так как вероятность коллизии при 192-битном nonce пренебрежимо мала (≈ 2⁻⁹⁶ при 2⁶⁴ сообщениях).
Код аутентификации Poly1305
Poly1305 вычисляет 128-битный тег аутентичности на основе одноразового ключа, который генерируется из первых 32 байт выходной последовательности ChaCha20 (с нулевым счётчиком после выработки ключа). Алгоритм:
- Разбивает сообщение на блоки по 16 байт;
- Каждый блок интерпретируется как число в little-endian и дополняется единичным битом;
- Вычисляется полиномиальное значение по модулю 2¹³⁰−5 с коэффициентом, равным части ключа Poly1305;
- Результат складывается с второй частью ключа для получения тега.
Характеристики и безопасность
XChaCha20-Poly1305 обеспечивает:
- Конфиденциальность: 256-битный ключ и 20 раундов ChaCha20 обеспечивают стойкость к атакам на основе линейного и дифференциального криптоанализа. На 2025 год не известно практических атак, снижающих эффективную сложность ниже 2²⁵⁶ операций.
- Целостность и аутентичность: Poly1305 гарантирует, что любое изменение зашифрованного текста или дополнительных данных (AD) будет обнаружено с вероятностью не менее 1−2⁻¹⁰⁷. Тег подделки может быть вычислен только при знании ключа.
- Устойчивость к коллизиям nonce: 192-битный nonce позволяет генерировать до 2⁶⁴ сообщений с одним ключом при случайном выборе nonce без риска коллизии (вероятность коллизии ≈ 2⁻⁶⁴). Это делает алгоритм пригодным для протоколов, где nonce выбирается случайно, например, в системах с распределённой генерацией.
- Производительность: ChaCha20 оптимизирован для программной реализации без аппаратного ускорения AES. На современных процессорах с поддержкой векторных инструкций (AVX2, NEON) скорость шифрования достигает 1–3 Гбит/с на ядро. Poly1305 также эффективен, выполняясь за 0.5–1 цикл на байт.
Применение
XChaCha20-Poly1305 используется в следующих областях:
- Протокол WireGuard: В качестве основного шифрования для туннелей VPN. WireGuard использует XChaCha20-Poly1305 для защиты пакетов данных, что позволяет избежать необходимости в управлении nonce.
- Библиотека libsodium: Реализует XChaCha20-Poly1305 как часть пакета AEAD (функция
crypto_aead_xchacha20poly1305_ietf). Широко применяется в приложениях, требующих простого и безопасного шифрования, например, в мессенджере Signal (в части протокола передачи файлов) и в криптовалюте Monero. - Файловые системы и архиваторы: Например, в программе zstd (Zstandard) с опцией шифрования, а также в некоторых реализациях шифрования дисков (LUKS2 с поддержкой Argon2 и XChaCha20).
- Протоколы передачи данных: В некоторых реализациях HTTP/3 (QUIC) и в системах потокового видео для защиты контента.
Сравнение с другими AEAD-алгоритмами
| Параметр | XChaCha20-Poly1305 | AES-256-GCM | ChaCha20-Poly1305 (RFC 8439) |
|---|---|---|---|
| Размер ключа | 256 бит | 256 бит | 256 бит |
| Размер nonce | 192 бита | 96 бит | 96 бит |
| Размер тега | 128 бит | 128 бит | 128 бит |
| Программная скорость | Высокая (без AES-NI) | Низкая (без AES-NI) | Высокая |
| Аппаратное ускорение | Отсутствует | AES-NI (Intel/AMD) | Отсутствует |
| Устойчивость к коллизиям nonce | Высокая (2⁶⁴ сообщений) | Низкая (требуется уникальный nonce) | Средняя (требуется уникальный nonce) |
| Стандартизация | Нет (фактически де-факто) | RFC 5288, NIST SP 800-38D | RFC 8439 |
Критика и ограничения
Основные замечания к XChaCha20-Poly1305:
- Отсутствие официальной стандартизации: Алгоритм не утверждён NIST или IETF в качестве стандарта, что может ограничивать его применение в государственных и корпоративных системах, требующих сертификации (например, ГОСТ или FIPS 140-3).
- Зависимость от качества реализации: Как и любой AEAD-алгоритм, XChaCha20-Poly1305 требует корректной обработки nonce и ключей. Ошибки в генерации случайных чисел или в управлении памятью могут привести к уязвимостям.
- Отсутствие устойчивости к атакам по времени: В некоторых реализациях (особенно на языках без контроля времени выполнения, например, Python) возможны атаки по сторонним каналам, хотя Poly1305 и ChaCha20 спроектированы с учётом константного времени.
Источники
- Bernstein, D. J. (2008). ChaCha, a variant of Salsa20. Workshop Record of SASC 2008.
- Bernstein, D. J. (2005). The Poly1305-AES message-authentication code. Fast Software Encryption (FSE 2005).
- Nir, Y., & Langley, A. (2018). ChaCha20 and Poly1305 for IETF Protocols. RFC 8439.
- Henriksen, L., Arkin, S., & Denis, F. (2016). XChaCha20: Extending the nonce of ChaCha20. libsodium documentation.
- Donenfeld, J. A. (2017). WireGuard: Next Generation Kernel Network Tunnel. Proceedings of the 2017 Network and Distributed System Security Symposium (NDSS).
- Denis, F. (2017). The Sodium cryptography library. GitHub repository.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →