При построении защищенных каналов связи, VPN-инфраструктуры или выборе параметров TLS 1.3 перед инженером неизбежно встает вопрос: какой алгоритм симметричного шифрования выбрать — классический блочный AES-256 или современный потоковый ChaCha20?
Оба алгоритма оперируют 256-битными ключами и на текущий момент считаются криптографически нескрываемыми. Однако их внутреннее устройство, требовательность к железу и поведение при программной реализации кардинально различаются.
В этой статье мы попробуем разобрать внутреннюю математику SPN и ARX, сравнить реальную пропускную способность алгоритмов на x86_64 и ARM64, оценить их устойчивость к атакам по сторонним каналам и выберем, какой алгоритм оптимален под конкретные задачи.
- Архитектура и принципы работы: SPN против ARX
- Как устроена подстановка в AES-256 (S-Box)
- Конструкция ChaCha20: Quarter Round и ARX
- Сравнительный анализ характеристик
- Производительность на практике: Аппаратное vs Программное ускорение
- Влияние команд AES-NI и ARMv8 Crypto Extensions
- Результаты практических бенчмарков (OpenSSL 3.x)
- Энергоэффективность на мобильных устройствах
- Безопасность и векторы атак: Где шифр может давать сбой
- Атаки по сторонним каналам (Cache-Timing Attacks)
- Проблема Nonce Reuse в AES-GCM и ChaCha20-Poly1305
- Квантовая стойкость: Алгоритм Гровера
- Применение в реальных протоколах: TLS 1.3, WireGuard, IPsec
- TLS 1.3 и стратегия веб-серверов
- WireGuard vs OpenVPN
- Проверяем скорость на своем сервере
- Роль отечественных стандартов (ГОСТ Р 34.12-2015)
- Нетривиальный факт: Происхождение имени ChaCha20
- Выводы и итоговые рекомендации
Архитектура и принципы работы: SPN против ARX
Главное различие между AES-256 и ChaCha20 заключается в математической модели преобразования данных. AES-256 относится к классу блочных шифров, а ChaCha20 — к потоковым шифрам.

Как устроена подстановка в AES-256 (S-Box)
Стандарт AES (Advanced Encryption Standard), принятый NIST в 2001 году на основе алгоритма Rijndael (FIPS 197), работает с фиксированным размером блока в 128 бит (16 байт). Версия AES-256 использует ключ длиной 256 бит и выполняет 14 раундов последовательных трансформаций.
Каждый раунд AES состоит из четырех шагов над матрицей состояния:
- SubBytes: нелинейная замена каждого байта через фиксированную таблицу подстановки (S-Box).
- ShiftRows: циклический сдвиг строк матрицы состояния на разные смещения.
- MixColumns: перемешивание столбцов матрицы путем умножения над конечным полем Галуа GF(2^8).
- AddRoundKey: наложение раундового ключа через операцию ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR).
Такая структура называется Substitution-Permutation Network (SPN). Она обеспечивает высокий уровень перемешивания и конфузии. Однако наличие этапа SubBytes создает зависимость от табличных вычислений в оперативной памяти, что становится узким местом при программной реализации.
Конструкция ChaCha20: Quarter Round и ARX
ChaCha20 был разработан Дэниелом Бернштейном в 2008 году и стандартизирован IETF в RFC 8439, представляет собой модернизацию шифра Salsa20. Это потоковый шифр, генерирующий псевдослучайный поток байт (гамму), который затем накладывается на открытый текст с помощью операции XOR.
В основе ChaCha20 лежит ARX-архитектура (Addition-Rotation-XOR). Состояние шифра представляет собой матрицу 4х4, состоящую из шестнадцати 32-битных слов (всего 512 бит или 64 байта):
- 4 слова — постоянные константы (метки);
- 8 слов — 256-битный ключ шифрования;
- 1 слово — 32-битный счетчик блоков;
- 3 слова — 96-битный одноразовый вектор (Nonce).

Основной строительный блок алгоритма — операция Quarter Round (QR), которая обрабатывает четыре 32-битных слова (a, b, c, d):

Полный цикл ChaCha20 включает 20 раундов (10 двойных раундов, чередующих обработку столбцов и диагоналей матрицы).
Ключевое отличие: В ChaCha20 нет таблиц S-Box и сложных операций над полями Галуа. Используются только три элементарные инструкции процессора: сложение, сдвиг и XOR.
Сравнительный анализ характеристик
Для наглядности вот базовые спецификации и конструктивные свойства алгоритмов в таблице:
| Параметр / Характеристика | AES-256 (в режиме GCM) | ChaCha20 (в связке с Poly1305) |
| Тип шифра | Блочный (Block Cipher) | Потоковый (Stream Cipher) |
| Размер ключа | 256 бит | 256 бит |
| Размер блока / состояния | 128 бит | 512 бит (64 байта) |
| Число раундов | 14 | 20 |
| Математическая основа | SPN (Поля Галуа GF(2^8), S-Box) | ARX (Сложение \text{mod } 2^{32}, Сдвиг, XOR) |
| Режим AEAD (аутентификация) | GCM (Galois/Counter Mode) | Poly1305 (MAC на базе поля PRIME 2^{130}-5) |
| Стандарт / Документ | NIST FIPS 197 / SP 800-38D | IETF RFC 8439 |
| Аппаратное ускорение | Да (AES-NI, ARM CE) | Частичное (через SIMD / AVX2 / NEON) |
| Защита от тайминг-атак | Нативная только при AES-NI | Нативная на уровне архитектуры (Constant-Time) |
Производительность на практике: Аппаратное vs Программное ускорение
Заявления о том, что «ChaCha20 принципиально быстрее AES» или «AES всегда обогоняет ChaCha20», одинаково ошибочны. Всё зависит от архитектуры процессора и наличия специализированных инструкций.

Влияние команд AES-NI и ARMv8 Crypto Extensions
Начиная с микроархитектур Intel Westmere (2010) и AMD Buldozer (2011), в процессоры x86_64 встраивается аппаратный набор инструкций AES-NI. В архитектуре ARM64 аналогичный блок называется ARMv8 Cryptographic Extensions (CE).
Инструкции AESENC, AESENCLAST, AESDEC позволяют процессору вычислять раунды AES прямо на кристалле кремния без обращения к системной памяти за 1–2 такта. Более того, аппаратный умножитель по модулю Галуа (PCLMULQDQ) ускоряет работу режима аутентификации GCM.
В этих условиях AES-256-GCM демонстрирует колоссальную производительность.
Результаты практических бенчмарков (OpenSSL 3.x)
Реальные замеры пропускной способности при шифровании блоков размером 8 КБ через утилиту openssl speed -evp на трех разных аппаратных платформах выглядят так:
Методология замеров: Прогон OpenSSL 3.2.0, синтетический тест обработки однопоточного потока данных 8192 байта в течение 3 секунд. Данные приведены в Гигабайтах в секунду (GB/s).
| Платформа / Процессор | Аппаратный AES | AES-256-GCM | ChaCha20-Poly1305 | Дельта скорости |
| Intel Core i7-13700K (x86_64, AVX2, AES-NI) | Присутствует | 9.42 GB/s | 3.15 GB/s | AES-256 быстрее на ~199% |
| Apple M2 Pro (ARM64, ARM CE, NEON) | Присутствует | 8.10 GB/s | 3.80 GB/s | AES-256 быстрее на ~113% |
| Raspberry Pi 4 (Cortex-A72, без ARM CE) | Отсутствует | 0.12 GB/s | 0.38 GB/s | ChaCha20 быстрее на ~216% |
Если на сервере или смартфоне активен аппаратный ускоритель, AES-256-GCM уходит в отрыв по скорости в 2–3 раза.
Однако на процессорах без AES-NI (бюджетные роутеры, IoT-контроллеры, микрокомпьютеры, старые мобильные чипы) ситуация переворачивается: ChaCha20 опережает программный AES более чем в три раза.
Энергоэффективность на мобильных устройствах
Программный расчет AES без AES-NI требует сотен циклов обращения к L1-кэшу для извлечения значений S-Box. Это приводит к постоянному простою конвейера CPU и значительному энергопотреблению.
ChaCha20 идеально параллелится через векторные инструкции SIMD (AVX2 / AVX-512 на x86 и NEON на ARM). Операции Quarter Round выполняются над 4-мя словами одновременно. В результате мобильный процессор тратит до 30–40% меньше энергии аккумулятора при прокачке гигабайтов трафика через ChaCha20-Poly1305, если в SoC нет блока ARM CE.
Однако, прежде чем менять алгоритмы, задайте себе вопрос: а нужно ли вам шифровать весь трафик? Если ваша цель — просто обойти региональную блокировку, настроить ферму аккаунтов или запустить веб-парсер, тотальное L3-шифрование создает бессмысленный оверхед. В нашем техническом разборе разницы между VPN и прокси мы подробно показывали, как перенос маршрутизации на прикладной уровень (L7) позволяет разгрузить железо и радикально снизить пинг.
Безопасность и векторы атак: Где шифр может давать сбой
С криптографической точки зрения оба алгоритма показывают колоссальный запас прочности. За десятилетия анализа практических атак на полный 14-раундовый AES-256 или 20-раундовый ChaCha20 с выделением ключа найдено не было. Однако уязвимости возникают в нюансах реализации.
Атаки по сторонним каналам (Cache-Timing Attacks)
Это ключевой аргумент безопасности в пользу ChaCha20 при отсутствии аппаратных инструкций.
Таблица подстановки S-Box в AES занимает 256 байт. При программной реализации она загружается в кэш-память L1. Когда алгоритм выполняет замену байта, время доступа к памяти зависит от того, находится ли нужный элемент S-Box в кэше процессора или произошел кэш-промах.

Сторонняя вредоносная программа, исполняемая на том же физическом ядре (или соседнем потоке Hyper-Threading), может отслеживать тайминги кэша (атаки вида Flush+Reload или Prime+Probe) и полностью восстановить 256-битный ключ AES.
Защита ChaCha20: В ChaCha20 нет выборок из памяти по индексу, зависящему от данных. Алгоритм выполняет строго одинаковое число математических операций над регистрами за постоянное время (Constant-Time Execution). Это делает его иммунным к атакам по времени кэша на любом процессоре по умолчанию.
Проблема Nonce Reuse в AES-GCM и ChaCha20-Poly1305
Оба режима являются схемой AEAD (Authenticated Encryption with Associated Data) — они одновременно обеспечивают и конфиденциальность, и целостность (аутентификацию) данных.
Однако проблема всплывает при повторном использовании одноразового вектора (Nonce / IV) с одним и тем же ключом:э

- В AES-256-GCM: Повтор Nonce раскрывает XOR двух открытых текстов, а также позволяет восстановить ключ аутентификации H (GHASH). Это приводит к полной потере защищенности канала: атакующий сможет подделывать произвольные пакеты.
- В ChaCha20-Poly1305: Повтор Nonce также ведет к компрометации одноразового ключа Poly1305 r, позволяя злоумышленнику внедрять фальшивые данные в сессию.
Для снижения рисков в современных реализациях используются расширенные версии алгоритмов с длинным Nonce, например XChaCha20-Poly1305 (размер Nonce увеличен с 96 до 192 бит), что позволяет генерировать Nonce случайным образом без риска коллизий.
Квантовая стойкость: Алгоритм Гровера
Применительно к симметричному шифрованию квантовый компьютер использует алгоритм Гровера. Он обеспечивает квадратный корень ускорения при поиске ключа в неструктурированной базе данных.
- Для 128-битных ключей (AES-128) сложность подбора падает до 2^{64} операций, что находится в зоне потенциальной уязвимости для гипотетических квантовых систем будущего.
- Для AES-256 и ChaCha20 (256 бит) сложность поиска по алгоритму Гровера составляет 2^{128} операций.
Криптографическая стойкость уровня 2^{128} недостижима для перебора ни на классических, ни на квантовых компьютерах в силу физических ограничений Вселенной (термодинамический предел вычислений Landauer’s Principle). Поэтому оба алгоритма полностью квантово-устойчивы.
Применение в реальных протоколах: TLS 1.3, WireGuard, IPsec
TLS 1.3 и стратегия веб-серверов
Спецификация протокола TLS 1.3 (RFC 8446) сократила список разрешенных криптонаборов до нескольких максимально безопасных вариантов. Основные из них:
| TLS_AES_256_GCM_SHA384 |
| TLS_CHACHA20_POLY1305_SHA256 |
| TLS_AES_128_GCM_SHA256 |
Современные библиотеки (Google BoringSSL, OpenSSL) и веб-серверы (Nginx, Caddy, HAProxy) используют механизмы приоритета с учетом возможностей клиента.
Если к серверу подключается ПК с Intel i7, сервер выбирает TLS_AES_256_GCM_SHA384. Если подключается бюджетный смартфон на базе процессора ohne ARM CE, сервер отдаёт преимущество TLS_CHACHA20_POLY1305_SHA256.

WireGuard vs OpenVPN
- WireGuard: Разработан с жесткой концепцией отказа от избыточного выбора алгоритмов. В WireGuard зафиксирован единственный набор криптографии: ChaCha20-Poly1305 для симметричного шифрования и Curve25519 для обмена ключами. Это позволило сократить объем кода кодовой базы ядра до ~4000 строк, обеспечив абсолютную прозрачность аудита.
- OpenVPN / IPsec: Поддерживают гибкую настройку. В современных версиях OpenVPN 2.6+ по умолчанию согласуется AES-256-GCM, но доступен быстрый фоллбек на CHACHA20-POLY1305.
Проверяем скорость на своем сервере
Вы можете самостоятельно протестировать производительность обоих алгоритмов на вашем оборудовании под управлением Linux с помощью штатных средств OpenSSL.
Запустите следующие команды в терминале:
| # 1. Тестируем AES-256-GCM на блоках 8192 байта в 1 поток openssl speed -evp aes-256-gcm |
| # 2. Тестируем ChaCha20-Poly1305 на блоках 8192 байта в 1 поток openssl speed -evp chacha20-poly1305 |
| # 3. Принудительное отключение аппаратного ускорения AES-NI для оценки «чистой» скорости OPENSSL_ia32cap=«~0x200000200000000» openssl speed -evp aes-256-gcm |
Разница между результатом выполнения шагов 1 и 3 наглядно покажет вам «вклад» блоков AES-NI в производительность вашей системы.
Роль отечественных стандартов (ГОСТ Р 34.12-2015)
В корпоративном и государственном секторах Российской Федерации при согласовании систем защиты информации использование зарубежных стандартов AES и ChaCha20 строго ограничено требованиями регуляторов (ФСТЭК, ФСБ РФ).
Альтернативой блочным AES и потоковым ChaCha20 в Рунете выступают шифры ГОСТ Р 34.12-2015:
- «Кузнечик»: 128-битный блочный шифр с 256-битным ключом (структура SPN, 10 раундов).
- «Магма»: 64-битный блочный шифр с 256-битным ключом (сеть Фейстеля, 32 раунда).
С точки зрения архитектуры «Кузнечик» ближе к AES-256, но использует существенно более сложные матрицы перестановки в полях Галуа, что делает его программную реализацию без аппаратной поддержки в процессорах еще более ресурсоемкой, чем у AES.
Нетривиальный факт: Происхождение имени ChaCha20
Название алгоритма ChaCha20 напрямую связано с музыкой и танцами. Предыдущий шифр Дэниела Бернштейна назывался Salsa20 (Латиноамериканский танец Сальса).
Когда Бернштейн создал модификацию с улучшенным перемешиванием раундов за счет изменения функций Quarter Round, он решил сохранить «танцевальную» тематику и назвал новый алгоритм в честь латиноамериканского танца Ча-ча-ча (Cha-Cha-Cha). Число «20» в названии указывает на количество выполняемых раундов.
Выводы и итоговые рекомендации
Выбор между AES-256 и ChaCha20 обусловлен исключительно аппаратной архитектурой целевых устройств:
- Выбирайте AES-256 (в режиме GCM):
- Для высоконагруженных веб-серверов, дата-центров и корпоративных VPN-шлюзов на x86_64 (Intel Xeon, AMD EPYC) или мощных ARM64 (Ampere, Apple Silicon).
- При обязательной сертификации по стандартам FIPS / PCI-DSS / NIST.
- Когда целевое железо на 100% поддерживает аппаратные инструкции AES-NI или ARM CE.
- Выбирайте ChaCha20 (в режиме Poly1305):
- Для мобильных приложений, работающих на широком парке смартфонов (включая ультрабюджетные устройства).
- Для роутеров, IoT-устройств, embedded-систем и микроконтроллеров без криптоускорителей.
- При развертывании протоколов WireGuard или QUIC, где решающую роль играет стабильность производительности и минимализм кода.
- Если требуется гарантированная защита от тайминг-атак по сторонним каналам на неизвестном или виртуализированном железе.
В инфраструктуре с автоматическим согласованием (например, TLS 1.3 на веб-сервере) лучшей практикой остается включение обоих шифров с правом клиента выбирать наиболее эффективный алгоритм под его процессор.









