Криптографические хеш-функции и коды аутентификации сообщений (MAC) образуют фундамент современных защищенных сетевых туннелей. В то время как симметричные шифры отвечают за шифрование полезной нагрузки, хеширование гарантирует подлинность сессии, связывает временные идентификаторы, фиксирует целостность стенограммы рукопожатия и проверяет легитимность каждого пакета до выполнения ресурсоемких асимметричных вычислений. На протяжении десятилетий традиционные протоколы, такие как IPsec и OpenVPN, опирались на семейство SHA-2 (SHA-256 и SHA-512), стандартизированное в NIST FIPS 180-4. Однако программная реализация SHA-256 на 32-битных встраиваемых маршрутизаторах и энергоэффективных устройствах выявила микроархитектурные узкие места.
Протокол WireGuard полностью отказался от устаревших конструкций хеширования в пользу алгоритма BLAKE2s, стандартизированного в спецификации RFC 7693. Работая в связке с Curve25519 и ChaCha20-Poly1305, BLAKE2s обеспечивает уровень стойкости, сопоставимый с SHA-256 и SHA-3, но требует значительно меньше тактов процессора. Благодаря интеграции встроенного режима аутентификации с ключом в протокол рукопожатия Noise_IKpsk2 и механизму защиты от распределенных атак отказа в обслуживании (DoS), WireGuard сочетает математическую строгость и устойчивость к атакам по сторонним каналам.
Ограничения SHA-256 и уязвимость перед атаками удлинением сообщения
Чтобы понять причины перехода на BLAKE2s, необходимо рассмотреть конструктивные недостатки классических хеш-функций:
- Структура Меркла — Дамгора: Традиционные алгоритмы хеширования разбивают входной поток на блоки фиксированного размера (512 бит в случае SHA-256) и последовательно пропускают их через функцию сжатия. Внутренний вектор состояния после обработки последнего блока напрямую становится публичным значением хеша.
- Атака удлинением сообщения (Length Extension Attack): Поскольку выходное значение SHA-256 в точности отражает внутреннее состояние компрессора, злоумышленник, зная хеш $H(M)$ и длину исходного сообщения $M$, может дописать произвольные данные $M'$ и корректно вычислить валидный хеш $H(M \mathbin{\Vert} \text{pad} \mathbin{\Vert} M')$ без знания секретного префикса или исходного текста $M$. По этой причине простая конструкция $H(\text{Key} \mathbin{\Vert} \text{Message})$ является небезопасной.
- Накладные расходы HMAC: Для предотвращения атак удлинением сообщения криптографическое сообщество разработало стандарт HMAC (RFC 2104). HMAC использует двухпроходную вложенную схему:
$$\text{HMAC}(K, M) = H\big((K \oplus \text{opad}) \mathbin{\Vert} H((K \oplus \text{ipad}) \mathbin{\Vert} M)\big)$$
Хотя HMAC полностью устраняет угрозу удлинения, он требует инициализации и сжатия двух отдельных блоков заполнения (ipad и opad) для каждой метки аутентификации. Для коротких служебных пакетов рукопожатия такая схема создает существенную дополнительную нагрузку на ядро операционной системы.
Архитектура BLAKE2s: 32-битный ARX и каркас HAIFA
Разработанный Жан-Филиппом Омассоном, Самуэлем Невешем, Зуко Уилкокс-О'Хирном и Кристианом Виннерляйном, алгоритм BLAKE2s оптимизирован для 32-битных микропроцессоров и формирует дайджесты настраиваемой длины до 256 бит из 512-битных блоков данных.
Конструкция HAIFA и структурная защита от атак удлинения
В отличие от классического подхода Меркла — Дамгора, BLAKE2s построен на итерационном каркасе HAIFA (HAsh Iterative FrAmework). В каждый раунд сжатия явно передаются дополнительные метаданные:
- Счетчик байтов ($t_0, t_1$): 64-битное целое число, отслеживающее суммарное количество полезных байтов, обработанных до текущего блока включительно.
- Флаг завершения ($f_0, f_1$): Специальное машинное слово, принимающее значение
0xFFFFFFFFисключительно при обработке финального блока сообщения.
Функция сжатия принимает четыре независимых аргумента: 256-битный вектор состояния $h$, 512-битный блок сообщения $m$, счетчик смещения $t$ и флаг завершения $f$. Поскольку финальный раунд накладывает маску инверсии на матрицу сжатия, полученный дайджест невозможно использовать в качестве промежуточного состояния для присоединения новых данных. Атаки удлинением исключены на математическом уровне, что позволяет использовать BLAKE2s напрямую в качестве псевдослучайной функции (PRF) и MAC.
Матрица состояния 4x4 и перестановка Quarter-Round
Внутреннее состояние BLAKE2s представлено рабочей матрицей из 16 слов по 32 бита каждое ($v_0 \dots v_{15}$, суммарно 512 бит). Верхние восемь позиций заполняются текущими значениями вектора сцепления $h_0 \dots h_7$, а нижние восемь слов получают стандартные векторы инициализации (IV), объединенные со счетчиком смещения и флагами финализации:
| Индекс строки | Столбец 0 | Столбец 1 | Столбец 2 | Столбец 3 |
|---|---|---|---|---|
| Строка 0 | $h_0$ | $h_1$ | $h_2$ | $h_3$ |
| Строка 1 | $h_4$ | $h_5$ | $h_6$ | $h_7$ |
| Строка 2 | $IV_0$ | $IV_1$ | $IV_2$ | $IV_3$ |
| Строка 3 | $IV_4 \oplus t_0$ | $IV_5 \oplus t_1$ | $IV_6 \oplus f_0$ | $IV_7 \oplus f_1$ |
Смешивание данных выполняется функцией $G$, заимствованной из ядра ChaCha. Работая с четырьмя словами состояния и двумя словами входного сообщения, $G(a, b, c, d, x, y)$ выполняет исключительно операции ARX (Addition по модулю $2^{32}$, циклический сдвиг Rotation и XOR):
$$a \leftarrow a + b + x; \quad d \leftarrow (d \oplus a) \lll 16;$$ $$c \leftarrow c + d; \quad b \leftarrow (b \oplus c) \lll 12;$$ $$a \leftarrow a + b + y; \quad d \leftarrow (d \oplus a) \lll 8;$$ $$c \leftarrow c + d; \quad b \leftarrow (b \oplus c) \lll 7;$$
Алгоритм выполняет 10 раундов смешивания. В каждом раунде четыре преобразования столбцов сменяются четырьмя преобразованиями диагоналей матрицы, выбирая слова сообщения согласно таблицам перестановок $\sigma_0 \dots \sigma_9$. Все операции выполняются непосредственно в арифметико-логическом устройстве (ALU) без ветвлений и без обращений к оперативной памяти, гарантируя защиту от атак по времени доступа к процессорному кешу.
Встроенный режим аутентификации: Однопроходный MAC без HMAC
Ключевым преимуществом BLAKE2s является встроенный режим работы с ключом (Keyed Mode). При передаче секретного ключа (длиной до 32 байт) параметры длины заносятся в заголовок блока, а сам ключ помещается в первый 512-битный блок сообщения и дополняется нулями.
Последующие фрагменты данных проходят через стандартные блоки сжатия. Такой однопроходный подход обеспечивает:
- Строгие гарантии безопасности: BLAKE2s с ключом функционирует как полноценная стойкая псевдослучайная функция без необходимости внешних оберток.
- Отсутствие избыточного выделения памяти: Ключ обрабатывается в том же вычислительном потоке, что и само сообщение.
- Двукратная экономия процессорного времени: Для коротких пакетов аутентификации проверка завершается за один раунд сжатия вместо серии вызовов, характерных для HMAC-SHA256.
Роль BLAKE2s в архитектуре WireGuard
WireGuard задействует BLAKE2s на каждом критическом этапе инициализации сессии, контроля состояния и отражения перегрузок:
1. Фиксация транскрипта рукопожатия Noise_IKpsk2
Во время обмена ключами взаимодействующие стороны должны быть уверены, что третья сторона не изменила эфемерные открытые ключи, временные метки или предварительный общий ключ (PSK). В туннеле поддерживаются две криптографические цепочки:
- Цепочечный ключ ($ck$): Обновляется после каждого математического шага через структуру HKDF на базе BLAKE2s.
- Хеш рукопожатия ($h$): Накопительный дайджест, рассчитываемый по формуле $h \leftarrow \text{BLAKE2s}(h \mathbin{\Vert} \text{данные})$. Все передаваемые параметры последовательно примешиваются в $h$, что гарантирует идентичность параметров сессии на обоих узлах.
2. Двухуровневая бессерверная защита от DoS (MAC1 и MAC2)
Маршрутизаторы на границе сети часто подвергаются лавинообразным атакам фиктивными пакетами, направленным на исчерпание памяти и ресурсов CPU. WireGuard защищает конечные точки, добавляя два 16-байтных поля MAC к каждому пакету рукопожатия:
- MAC1: 128-битный код аутентификации, вычисляемый от заголовка пакета с использованием открытого ключа получателя:
$$\text{MAC1} = \text{BLAKE2s-128}\big(\text{Hash}(\text{PublicKey получателя}), \text{msg}_{0..k}\big)$$
Наличие корректного MAC1 подтверждает, что пакет направлен именно данному серверу, позволяя ядру отбрасывать поддельный трафик без создания записей в таблице состояний.
- MAC2: При критическом уровне загрузки сервер отклоняет вычисление скалярных произведений Curve25519 до тех пор, пока клиент не подтвердит легитимность запроса. Сервер отправляет специальный пакет с зашифрованным cookie. Клиент повторяет отправку рукопожатия, добавляя поле
MAC2, вычисленное от всего пакета (включаяMAC1) с использованием cookie в качестве ключа:
$$\text{MAC2} = \text{BLAKE2s-128}\big(\text{Cookie}, \text{msg}_{0..k+16}\big)$$
Благодаря микросекундной скорости вычисления BLAKE2s сервер проверяет подлинность запроса без сохранения сессионных структур, нейтрализуя массивные DoS-атаки.
Векторизация SIMD и реализация в RiceGuard
Матричная структура BLAKE2s эффективно масштабируется на векторных расширениях современных процессоров. Инструкции ARM NEON, Intel AVX2 и AVX-512 выполняют четыре независимых вычисления функции $G$ за один векторный цикл. На серверных платформах BLAKE2s обрабатывает данные со скоростью менее 3 тактов на байт.
В сетевой платформе RiceGuard криптографические операции выполняются с соблюдением строгих системных требований:
- Очереди ядра padata: Вычисления хешей и аутентификация пакетов распределяются между всеми процессорными ядрами без нарушения последовательности передачи трафика.
- Сравнение меток за константное время: Проверка полей
MAC1иMAC2выполняется системной функциейcrypto_memneq, сканирующей все 16 байт независимо от позиции возможной ошибки, что блокирует тайминговые атаки. - Очистка конфиденциальных структур: Цепочечные ключи, промежуточные дайджесты и токены cookie немедленно удаляются из оперативной памяти с помощью
memzero_explicit, исключая сохранение ключевого материала в кеше или дампе памяти.
Сочетание 32-битной архитектуры ARX, защиты от атак удлинения и однопроходного режима делает BLAKE2s надежной основой высокопроизводительных защищенных сетей.



