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

ChaCha20-Poly1305

ChaCha20-Poly1305 — это комбинированный алгоритм аутентифицированного шифрования с дополнительными данными (AEAD), объединяющий потоковый шифр ChaCha20 и код аутентификации сообщения (MAC) Poly1305. Предназначен для обеспечения конфиденциальности, целостности и подлинности данных при передаче или хранении. Алгоритм был разработан Дэниелом Бернштейном в 2005—2008 годах и получил широкое распространение в протоколах безопасности, таких как TLS 1.2 и TLS 1.3, а также в криптографических библиотеках (OpenSSL, libsodium, BoringSSL). Основное преимущество ChaCha20-Poly1305 — высокая скорость работы на программном уровне, особенно на устройствах без аппаратной поддержки шифрования (например, мобильные процессоры ARM), а также устойчивость к временным атакам.

История

Алгоритм ChaCha20 был представлен Дэниелом Бернштейном в 2008 году как модификация его же потокового шифра Salsa20, предложенного в 2005 году для участия в проекте eSTREAM. Основное отличие ChaCha20 от Salsa20 — изменённая функция раундового смешивания, которая улучшила диффузию и повысила устойчивость к криптоанализу. Poly1305, разработанный Бернштейном в 2005 году, изначально предназначался для аутентификации сообщений с использованием одноразового ключа.

В 2013 году Бернштейн совместно с Таньей Ланге и Питером Швабе официально объединил ChaCha20 и Poly1305 в единый AEAD-режим, опубликовав спецификацию в RFC 7539 (в 2015 году). В 2018 году алгоритм был стандартизирован в RFC 8439, который стал обязательным для реализации в протоколе TLS 1.3 (RFC 8446). ChaCha20-Poly1305 также используется в протоколах SSH, IPsec (RFC 7634), WireGuard и Signal.

Устройство и принцип работы

ChaCha20-Poly1305 состоит из двух независимых компонентов, работающих параллельно:

ChaCha20 (потоковый шифр)

ChaCha20 генерирует псевдослучайную последовательность байтов (гамму), которая накладывается на открытый текст с помощью операции XOR. Шифр основан на 20 раундах преобразования 4×4-матрицы 32-битных слов. Начальное состояние матрицы формируется из 256-битного ключа, 96-битного одноразового номера (nonce) и 32-битного счётчика блоков. Каждый блок генерирует 64 байта (512 бит) гаммы.

Основные этапы раунда:

  • Четыре четвертных раунда (quarter round), каждый из которых смешивает четыре слова матрицы.
  • Каждый раунд состоит из четырёх операций: сложение по модулю 2³², XOR и циклический сдвиг.
  • После 20 раундов (10 двойных раундов) к матрице добавляется исходное состояние для получения выходного блока.

ChaCha20 не использует аппаратные инструкции AES (AES-NI), что делает его эффективным на процессорах без поддержки таких инструкций.

Poly1305 (код аутентификации)

Poly1305 вычисляет 16-байтовый тег аутентификации для каждого сообщения. Алгоритм работает в поле простого числа 2¹³⁰ − 5 (порядка 2.6×10³⁹). Ключ Poly1305 (32 байта) делится на две части:

  • 16 байт — секретный множитель r (очищенный от битов в определённых позициях для предотвращения атак).
  • 16 байт — секретное дополнение s.

Сообщение разбивается на 16-байтовые блоки, каждый из которых интерпретируется как число по модулю 2¹³⁰ − 5. Вычисляется полиномиальное значение с использованием схемы Хорнера, после чего к результату прибавляется s. Полученное 128-битное число является тегом аутентификации.

Режим AEAD

В режиме AEAD алгоритм обрабатывает три типа данных:

  • Открытый текст (конфиденциальные данные).
  • Дополнительные аутентифицированные данные (AAD) — метаданные, которые не шифруются, но защищаются от подделки (например, заголовки пакетов).
  • Одноразовый номер (nonce) — 96-битное значение, которое должно быть уникальным для каждого сообщения при одном и том же ключе.

Процесс:

  1. Генерация гаммы ChaCha20 с nonce и счётчиком.
  2. Шифрование открытого текста путём XOR с гаммой.
  3. Вычисление тега Poly1305 на основе шифротекста, AAD и длины обоих полей.
  4. Формирование выходного сообщения: шифротекст + тег (16 байт).

Характеристики

  • Размер ключа: 256 бит (32 байта).
  • Размер nonce: 96 бит (12 байт).
  • Размер тега аутентификации: 128 бит (16 байт).
  • Размер блока шифрования: 64 байта (512 бит).
  • Производительность: на процессорах без аппаратного ускорения (например, ARM Cortex-A53) скорость достигает 1–3 Гбит/с; на x86-64 с инструкциями AVX2 — до 10 Гбит/с.
  • Безопасность: алгоритм не имеет известных практических атак на полные 20 раундов. Теоретическая стойкость — 256 бит против атак на ключ; атаки на nonce (повторное использование) приводят к полной компрометации конфиденциальности и аутентификации.

Применение

ChaCha20-Poly1305 активно используется в следующих областях:

  • Протокол TLS 1.3: обязательный набор шифров (cipher suite) для обеспечения защиты веб-трафика. В частности, используется в браузерах Google Chrome, Mozilla Firefox и серверах Nginx.
  • WireGuard: протокол VPN, использующий ChaCha20-Poly1305 как единственный шифр для защиты туннелей.
  • Signal Protocol: применяется для шифрования сообщений в мессенджере Signal (организация Signal Foundation; деятельность не запрещена в РФ, но признана нежелательной? — уточнение: Signal Foundation не включена в реестр нежелательных организаций Минюста РФ по состоянию на 2025 год; однако использование протокола Signal в РФ не ограничено).
  • SSH: в OpenSSH с версии 6.5 поддерживается шифр chacha20-poly1305@openssh.com.
  • IPsec: RFC 7634 определяет использование ChaCha20-Poly1305 в ESP (Encapsulating Security Payload).
  • DNS-защита: протокол DNSCrypt и DNS-over-HTTPS (DoH) поддерживают данный алгоритм.
  • Криптовалюты: некоторые блокчейн-проекты (например, Monero) используют ChaCha20 для шифрования транзакций.

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

Основное ограничение ChaCha20-Poly1305 — требование уникальности nonce для каждого сообщения при одном ключе. Повторное использование nonce приводит к возможности восстановления ключа и подделки тега аутентификации. В некоторых реализациях (например, в протоколе WireGuard) nonce генерируется как счётчик, что гарантирует уникальность, но требует синхронизации состояния.

Критики также отмечают, что ChaCha20-Poly1305 не обеспечивает защиту от атак по сторонним каналам (например, по времени выполнения) в программных реализациях без специальных мер (константное время). Однако большинство современных библиотек (libsodium, OpenSSL) реализуют операции в константном времени.

Сравнение с AES-GCM:

  • ChaCha20-Poly1305 быстрее на устройствах без аппаратного AES (ARM, RISC-V).
  • AES-GCM опирается на инструкции AES-NI, что даёт ему преимущество на современных x86-процессорах (скорость до 20 Гбит/с).
  • ChaCha20-Poly1305 не подвержен атакам на короткие теги (GCM допускает теги 4–12 байт, что снижает стойкость).

Стандартизация и RFC

  • RFC 7539 (2015): «ChaCha20 and Poly1305 for IETF Protocols» — первая спецификация.
  • RFC 8439 (2018): «ChaCha20-Poly1305 Cipher Suites for Transport Layer Security (TLS)» — актуальная версия.
  • RFC 8446 (2018): «The Transport Layer Security (TLS) Protocol Version 1.3» — включает ChaCha20-Poly1305 как обязательный шифр.
  • RFC 7634 (2015): «ChaCha20, Poly1305, and Their Use in the Internet Key Exchange Protocol (IKE) and IPsec».

Источники

  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). RFC 8439: ChaCha20 and Poly1305 for IETF Protocols. Internet Engineering Task Force.
  4. Rescorla, E. (2018). RFC 8446: The Transport Layer Security (TLS) Protocol Version 1.3. Internet Engineering Task Force.
  5. Langley, A., Chang, W. (2015). RFC 7539: ChaCha20 and Poly1305 for IETF Protocols. Internet Engineering Task Force.
  6. Bernstein, D. J., Lange, T., Schwabe, P. (2013). «NaCl: Networking and Cryptography library».

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →