Криптографические хеш-функции и коды аутентификации сообщений (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, необходимо рассмотреть конструктивные недостатки классических хеш-функций:

  1. Структура Меркла — Дамгора: Традиционные алгоритмы хеширования разбивают входной поток на блоки фиксированного размера (512 бит в случае SHA-256) и последовательно пропускают их через функцию сжатия. Внутренний вектор состояния после обработки последнего блока напрямую становится публичным значением хеша.
  2. Атака удлинением сообщения (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})$ является небезопасной.
  3. Накладные расходы 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 надежной основой высокопроизводительных защищенных сетей.

Скачать VPNRice