ChaCha20
ChaCha20 — это потоковый шифр (симметричный шифр), разработанный Дэниелом Бернштейном в 2008 году. Является модификацией более раннего шифра Salsa20, также созданного Бернштейном. ChaCha20 относится к семейству шифров на основе арифметики с добавлением, вращением и XOR (ARX). Он получил широкое распространение как альтернатива шифру AES (Advanced Encryption Standard) в системах, где важна высокая скорость программной реализации и устойчивость к атакам по времени.
История
Шифр Salsa20 был представлен Бернштейном в 2005 году и стал финалистом конкурса eSTREAM (проект Европейского Союза по поиску новых потоковых шифров). В 2008 году Бернштейн опубликовал модификацию, названную ChaCha. Основным отличием ChaCha от Salsa20 стала изменённая функция раунда, которая, по замыслу автора, обеспечивает лучшую диффузию (распространение влияния одного бита входных данных на выходные) и повышенную устойчивость к криптоанализу. Впоследствии были предложены варианты с различным числом раундов: ChaCha8 (8 раундов), ChaCha12 (12 раундов) и наиболее распространённый ChaCha20 (20 раундов).
ChaCha20 привлёк внимание криптографического сообщества, особенно после того, как в 2013 году были обнаружены уязвимости в реализации шифра RC4 в протоколе TLS. В 2014 году Google объявил о внедрении ChaCha20 в связке с алгоритмом аутентификации Poly1305 (также разработанным Бернштейном) в протоколе TLS для мобильных устройств, где программная реализация AES часто была медленнее из-за отсутствия аппаратного ускорения. В 2018 году комбинация ChaCha20-Poly1305 была официально стандартизирована в RFC 8439 (Internet Engineering Task Force, IETF) как часть протокола TLS 1.3.
Устройство и принцип работы
ChaCha20 является потоковым шифром, который генерирует псевдослучайный ключевой поток (гамму), который затем побитово складывается (XOR) с открытым текстом для получения шифротекста. Дешифрование выполняется аналогично — XOR шифротекста с тем же ключевым потоком.
Инициализация состояния
Внутреннее состояние шифра представляет собой матрицу 4×4 из 32-битных слов (всего 16 слов, 512 бит). Состояние инициализируется следующим образом:
- Константа: 4 слова (128 бит), фиксированная последовательность «expand 32-byte k» (для 256-битного ключа) или «expand 16-byte k» (для 128-битного ключа).
- Ключ: 8 слов (256 бит) для стандартного варианта или 4 слова (128 бит) для сокращённого.
- Счётчик: 4 слова (128 бит), обычно используется только одно слово (32 бита), остальные три зарезервированы и равны нулю. Счётчик увеличивается на 1 после обработки каждого 64-байтового блока.
- Nonce (одноразовый номер): 4 слова (128 бит) для стандарта IETF (RFC 8439) или 2 слова (64 бита) для оригинальной спецификации Бернштейна. Nonce является открытым значением, которое должно быть уникальным для каждого сообщения при одном и том же ключе.
Функция раунда
Каждый раунд ChaCha20 состоит из четырёх операций, называемых «квартетными раундами» (quarter rounds). Квартетный раунд принимает на вход четыре 32-битных слова (a, b, c, d) и выполняет последовательность операций сложения, XOR и циклического сдвига:
- a = a + b; d = d XOR a; d = d <<< 16
- c = c + d; b = b XOR c; b = b <<< 12
- a = a + b; d = d XOR a; d = d <<< 8
- c = c + d; b = b XOR c; b = b <<< 7
Один полный раунд ChaCha20 (из 20) состоит из двух типов квартетных раундов:
- Раунд по столбцам (column round): квартетные раунды применяются к четырём столбцам матрицы (например, слова (0, 4, 8, 12), (1, 5, 9, 13) и т.д.).
- Раунд по диагоналям (diagonal round): квартетные раунды применяются к четырём диагоналям матрицы (например, слова (0, 5, 10, 15), (1, 6, 11, 12) и т.д.).
После выполнения всех 20 раундов (10 пар «столбец-диагональ») исходное состояние складывается с результирующим состоянием (побитовое сложение по модулю 2^32). Полученный 64-байтовый блок используется как ключевой поток для шифрования 64 байт открытого текста. Затем счётчик увеличивается, и процесс повторяется для следующего блока.
Классификация и варианты
ChaCha20 относится к классу потоковых шифров на основе блочных операций (block cipher in counter mode, CTR). Он также может рассматриваться как псевдослучайная функция (PRF).
Основные варианты:
- ChaCha20 с 256-битным ключом и 96-битным nonce (стандарт IETF, RFC 8439). Наиболее распространённая конфигурация.
- ChaCha20 с 128-битным ключом и 64-битным nonce (оригинальная версия Бернштейна).
- XChaCha20 — вариант с расширенным nonce (192 бита), позволяющий использовать случайные nonce без риска коллизий. Стандартизирован в RFC 8439 (как расширение) и в проекте IETF.
- ChaCha12 и ChaCha8 — варианты с уменьшенным числом раундов (12 и 8 соответственно), используемые в системах, где скорость критичнее безопасности.
Применение
ChaCha20 получил широкое распространение в современных криптографических протоколах и системах:
- TLS 1.3 (Transport Layer Security): ChaCha20-Poly1305 является одним из обязательных шифронаборов (cipher suite) для TLS 1.3, наряду с AES-GCM. Особенно популярен в мобильных устройствах (Android, iOS) и браузерах (Google Chrome, Mozilla Firefox).
- SSH (Secure Shell): ChaCha20-Poly1305 является рекомендуемым шифром для OpenSSH (начиная с версии 6.5).
- IPsec (Internet Protocol Security): ChaCha20-Poly1305 включён в RFC 7634 как один из алгоритмов для протокола ESP (Encapsulating Security Payload).
- WireGuard: Протокол VPN использует ChaCha20-Poly1305 в качестве основного шифра для защиты данных.
- Системы шифрования дисков: Например, в Linux-модуле dm-crypt (LUKS) поддерживается ChaCha20.
- Протоколы передачи данных: Используется в QUIC (протокол на основе UDP, используемый в HTTP/3) и Noise Protocol Framework.
Криптостойкость
На 2025 год ChaCha20 считается криптостойким шифром. Лучшие известные атаки на ChaCha20 с 20 раундами являются теоретическими и требуют либо огромных вычислительных ресурсов (например, атака на основе дифференциального криптоанализа с трудоёмкостью около 2^256 операций), либо предполагают использование очень малого числа раундов (например, ChaCha6 взломан, ChaCha8 имеет серьёзные уязвимости). Практических атак на ChaCha20 не существует.
Основные преимущества ChaCha20 перед AES:
- Высокая скорость программной реализации: ChaCha20 использует только простые операции (сложение, XOR, сдвиг), которые эффективно выполняются на всех типах процессоров, включая мобильные и встраиваемые системы без аппаратного ускорения AES.
- Устойчивость к атакам по времени: Алгоритм не содержит условных переходов, зависящих от данных, что делает его устойчивым к атакам по времени (timing attacks).
- Отсутствие патентных ограничений: Алгоритм является общественным достоянием (public domain), что способствует его широкому внедрению.
Интересные факты
- Название «ChaCha» происходит от испанского слова «chacha», обозначающего танец. Бернштейн назвал шифр в честь танца, так как модификация Salsa20 (исп. «соус») была более «ритмичной».
- ChaCha20 часто используется в связке с алгоритмом аутентификации Poly1305, образуя аутентифицированное шифрование (AEAD — Authenticated Encryption with Associated Data). В этой конфигурации шифр обеспечивает конфиденциальность, а Poly1305 — целостность и подлинность данных.
- В 2020 году ChaCha20 был включён в стандарт ГОСТ Р 34.12-2020 (российский национальный стандарт криптографической защиты) как дополнительный алгоритм, наряду с российскими стандартами «Кузнечик» и «Магма».
Источники
- Bernstein, D. J. (2008). «ChaCha, a variant of Salsa20». Workshop Record of SASC 2008.
- RFC 8439: «ChaCha20 and Poly1305 for IETF Protocols». Internet Engineering Task Force (IETF), 2018.
- RFC 7634: «ChaCha20, Poly1305, and Their Use in the IPsec Encapsulating Security Payload (ESP)». IETF, 2015.
- Aumasson, J.-P. (2017). «Serious Cryptography: A Practical Introduction to Modern Encryption». No Starch Press.
- Paar, C., & Pelzl, J. (2010). «Understanding Cryptography: A Textbook for Students and Practitioners». Springer.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →