Открыть сервисСервис

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. Процесс расширения включает два этапа:

  1. Вычисление подключа: Первые 128 бит (16 байт) nonce вместе с 256-битным ключом подаются на вход ChaCha20 с нулевым счётчиком и без дополнительных раундов. Выходные 512 бит (64 байта) используются как новый ключ для шифрования.
  2. Шифрование: Оставшиеся 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-Poly1305AES-256-GCMChaCha20-Poly1305 (RFC 8439)
Размер ключа256 бит256 бит256 бит
Размер nonce192 бита96 бит96 бит
Размер тега128 бит128 бит128 бит
Программная скоростьВысокая (без AES-NI)Низкая (без AES-NI)Высокая
Аппаратное ускорениеОтсутствуетAES-NI (Intel/AMD)Отсутствует
Устойчивость к коллизиям nonceВысокая (2⁶⁴ сообщений)Низкая (требуется уникальный nonce)Средняя (требуется уникальный nonce)
СтандартизацияНет (фактически де-факто)RFC 5288, NIST SP 800-38DRFC 8439

Критика и ограничения

Основные замечания к XChaCha20-Poly1305:

  • Отсутствие официальной стандартизации: Алгоритм не утверждён NIST или IETF в качестве стандарта, что может ограничивать его применение в государственных и корпоративных системах, требующих сертификации (например, ГОСТ или FIPS 140-3).
  • Зависимость от качества реализации: Как и любой AEAD-алгоритм, XChaCha20-Poly1305 требует корректной обработки nonce и ключей. Ошибки в генерации случайных чисел или в управлении памятью могут привести к уязвимостям.
  • Отсутствие устойчивости к атакам по времени: В некоторых реализациях (особенно на языках без контроля времени выполнения, например, Python) возможны атаки по сторонним каналам, хотя Poly1305 и ChaCha20 спроектированы с учётом константного времени.

Источники

  1. Bernstein, D. J. (2008). ChaCha, a variant of Salsa20. Workshop Record of SASC 2008.
  2. Bernstein, D. J. (2005). The Poly1305-AES message-authentication code. Fast Software Encryption (FSE 2005).
  3. Nir, Y., & Langley, A. (2018). ChaCha20 and Poly1305 for IETF Protocols. RFC 8439.
  4. Henriksen, L., Arkin, S., & Denis, F. (2016). XChaCha20: Extending the nonce of ChaCha20. libsodium documentation.
  5. Donenfeld, J. A. (2017). WireGuard: Next Generation Kernel Network Tunnel. Proceedings of the 2017 Network and Distributed System Security Symposium (NDSS).
  6. Denis, F. (2017). The Sodium cryptography library. GitHub repository.
Заметили ошибку или не согласны с информацией в статье? Напишите нам support@bfometr.ru