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-битное значение, которое должно быть уникальным для каждого сообщения при одном и том же ключе.
- Генерация гаммы ChaCha20 с nonce и счётчиком.
- Шифрование открытого текста путём XOR с гаммой.
- Вычисление тега Poly1305 на основе шифротекста, AAD и длины обоих полей.
- Формирование выходного сообщения: шифротекст + тег (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».
Источники
- 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). RFC 8439: ChaCha20 and Poly1305 for IETF Protocols. Internet Engineering Task Force.
- Rescorla, E. (2018). RFC 8446: The Transport Layer Security (TLS) Protocol Version 1.3. Internet Engineering Task Force.
- Langley, A., Chang, W. (2015). RFC 7539: ChaCha20 and Poly1305 for IETF Protocols. Internet Engineering Task Force.
- Bernstein, D. J., Lange, T., Schwabe, P. (2013). «NaCl: Networking and Cryptography library».
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →