Приветствую, Хабр! Напомню, что в августе текущего года Институт стандартов и технологий США NIST выпустил стандарт NIST SP 800-232 [1], описывающий четыре низкоресурсных криптографических алгоритма на базе семейства алгоритмов Ascon:
алгоритм аутентифицированного шифрования с присоединенными данными Ascon-AEAD128;
три алгоритма хеширования: Ascon-Hash256 (классическая хеш-функция), Ascon-XOF128 (хеш-функция с переменным размером выходного значения) и Ascon-CXOF128 (хеш-функция с кастомизацией и переменным размером выходного значения).
Данная статья из двух частей посвящена детальному обзору вышеупомянутого стандарта. В первой части статьи было подробно описано внутреннее преобразование, общее для всех стандартизованных алгоритмов, и разобрана верхнеуровневая структура алгоритма Ascon-AEAD128. В этой, заключительной, части предлагаю Вашему вниманию подробное рассмотрение структуры алгоритмов хеширования, а также обзор рекомендаций и ограничений по применению алгоритмов, описанных в NIST SP 800-232.

Все три алгоритма хеширования из NIST SP 800-232 построены на структуре криптографической губки, которая была описана мной ранее. Напомню, что такая структура подразумевает две стадии выполнения алгоритма:
«впитывание» (absorbing) – когда входные данные поблочно накладываются на внутреннее состояние, которое как бы впитывает новые данные; после впитывания каждого блока состояние перемешивается и процесс повторяется до исчерпания входных данных;
«выжимание» (squeezing) – когда из внутреннего состояния извлекается (выжимается) его часть и используется в качестве некоторой порции выходного значения (например, фрагмента хеш-кода); после этого состояние перемешивается и процесс повторяется до извлечения требуемого объема выходных данных.
Алгоритм хеширования Ascon-Hash256
Ascon-Hash256 представляет собой классический алгоритм хеширования, результатом работы которого является 256-битный хеш-код входного сообщения. Структура алгоритма приведена на рисунке:

Хеширование входного сообщения выполняется в следующие 3 этапа, которые подробно рассмотрим далее:
Инициализация внутреннего состояния.
Впитывание сообщения.
Извлечение хеш-значения.
Как и у рассмотренного в предыдущей части алгоритма Ascon-AEAD128, внутреннее состояние S размером 320 бит представляется в виде двух частей различного размера: S = Sr || Sc, но интересующие нас алгоритмы хеширования обрабатывают данные 64-битными блоками, поэтому размеры частей внутреннего состояния изменились по сравнению с алгоритмом Ascon-AEAD128:
размер части Sr эквивалентен размеру обрабатываемого блока данных и равен 64 битам;
размер части Sc равен 256 битам.
Инициализация внутреннего состояния выполняется путем заполнения состояния S вектором инициализации IV = 0x0000080100CC0002, дополненным 256 битовыми нулями справа, после чего состояние перемешивается с помощью 12-раундовой перестановки внутреннего состояния p (перестановка p была описана в первой части статьи).
Поскольку преобразование производится над состоянием с фиксированным заполнением, значение состояния после инициализации может быть предвычислено и использовано вместо выполнения инициализации (в этом случае этап инициализации может быть пропущен):
Фрагмент состояния |
Значение |
S0 |
0x9B1E5494E934D681 |
S1 |
0x4BC3A01E333751D2 |
S2 |
0xAE65396C6B34B81A |
S3 |
0x3C7FD4A4D56A4DB3 |
S4 |
0x1A5C464906C5976D |
Напомню, что 320-битное состояние S на уровне перестановки внутреннего состояния представляется в виде пяти 64-битных фрагментов S0, …, S4.
Перед обработкой сообщение дополняется до размера, кратного 64 битам, путем присоединения справа единичного бита и, при необходимости, требуемого количества битовых нулей. Обработка сообщения выполняется поблочно. Каждый блок сообщения Mi, i = 1, …, Y, накладывается на часть внутреннего состояния Sr операцией XOR, после чего применяются 12 раундов перестановки внутреннего состояния p (после наложения последнего блока сообщения состояние не перемешивается).
Выходной хеш-код извлекается 64-битными фрагментами Hi = Sr, i = 1, …, Z, от старшей части к младшей до достижения требуемого размера выходного значения. Перед извлечением каждого фрагмента состояние переме��ивается с помощью 12-раундовой перестановки внутреннего состояния p.
В результате, выходной хеш-код H формируется путем конкатенации его фрагментов
H = H1|| ...|| HZ. У алгоритма Ascon-Hash256 H состоит из четырех 64-битных фрагментов, т. е. Z = 4.
Алгоритм хеширования с переменным размером выходного значения Ascon-XOF128
Структура алгоритма Ascon-XOF128 эквивалентна приведенной на рисунке выше структуре Ascon-Hash256. Порядок обработки данных также аналогичен таковому в алгоритме Ascon-Hash256, но есть следующие отличия:
Помимо хешируемого сообщения, у алгоритма Ascon-XOF128 есть еще один входной параметр L > 0, определяющий размер выходного значения в битах. Непосредственно в преобразованиях значение L не участвует.
Ascon-XOF128 использует другое значение вектора инициализации: IV = 0x0000080000CC0003.
Поскольку размер выходного значения определяется параметром L, количество фрагментов Z выходного хеш-кода H равно ⌈L / 64⌉, при этом последний фрагмент может усекаться до нужного размера, если L не кратно 64.
Поскольку значение IV изменилось по сравнению с алгоритмом Ascon-Hash256, заполнение состояния после этапа инициализации также изменилось на следующее:
Фрагмент состояния |
Значение |
S0 |
0xDA82CE768D9447EB |
S1 |
0xCC7CE6C75F1EF969 |
S2 |
0xE7508FD780085631 |
S3 |
0x0EE0EA53416B58CC |
S4 |
0xE0547524DB6F0BDE |
Алгоритм хеширования с кастомизацией и переменным размером выходного значения Ascon-CXOF128
Данный алгоритм отличается от предыдущего тем, что, помимо сообщения M, в расчете хеш-кода участвует также кастомизирующий префикс переменного размера (но размер префикса не может превышать 256 байт). Используя префикс, можно сделать выходной хеш-код контекстно-зависимым. При этом, если префикс используется многократно, то результат его обработки можно вычислить заранее и, таким образом, сразу подставлять внутреннее состояние, являющееся результатом работы первых двух фаз алгоритма (инициализации и впитывания префикса), экономя ресурсы на обработке идентичных префиксов.

Алгоритм состоит из следующих четырех этапов:
Инициализация внутреннего состояния.
Кастомизация (впитывание префикса).
Впитывание сообщения.
Извлечение хеш-значения.
Как и в рассмотренных выше алгоритмах, инициализация внутреннего состояния выполняется путем заполнения состояния S вектором инициализации IV, дополненным 256 битовыми нулями справа, и перемешивания состояния с помощью 12-раундовой перестановки внутреннего состояния p; отличие данного этапа от предыдущих алгоритмов состоит в использовании другого значения вектора инициализации: IV = 0x0000080000CC0004.
Заполнение состояния после этапа инициализации выглядит следующим образом:
Фрагмент состояния |
Значение |
S0 |
0x675527C2A0E8DE03 |
S1 |
0x43D12D7DC0377BBC |
S2 |
0xE9901DEC426E81B5 |
S3 |
0x2AB14907720780B6 |
S4 |
0x8F3F1D02D432BC46 |
На этапе кастомизации производится впитывание префикса. Предварительно выполняются следующие операции:
формируется 64-битный блок C0, содержащий исходный размер префикса в бит��х (приведенный к 64-битному целочисленному значению);
производится дополнение префикса (аналогично описанному выше дополнению сообщения) до размера, кратного 64 битам.
Затем блок C0 и дополненный префикс C, разбитый на 64-битные блоки Ci, i = 1, …, X, поблочно накладываются операцией XOR на часть внутреннего состояния Sr; после наложения каждого блока выполняются 12 раундов перестановки внутреннего состояния p. Перед впитыванием производится дополнение префикса (аналогично описанному выше дополнению сообщения) до размера, кратного 64 битам.
Этап впитывания сообщения выполняется без отличий от аналогичного этапа рассмотренных выше алгоритмов, а этап извлечения хеш-кода эквивалентен таковому у алгоритма Ascon-XOF128.
Требования по корректному применению
Помимо собственно описания алгоритмов, документ NIST SP 800-232 содержит различную дополнительную информацию, в основном касающуюся условий, необходимых для корректного применения стандартизованных алгоритмов. В частности, описаны следующие требования, соответствие которым обязательно для безопасного применения алгоритма шифрования Ascon-AEAD128 (напомню, что он был описан в первой части статьи):
Секретный ключ K должен генерироваться с использованием качественного генератора случайных чисел и в соответствии с процессом, описанным в еще одном документе NIST – NIST SP 800-133 [2] (Recommendation for Cryptographic Key Generation – Рекомендации по генерации криптографических ключей). Необходимо отметить, что в стандарте NIST SP 800-232 описан также вариант применения алгоритма Ascon-AEAD128 с комплексным ключом, состоящим из двух 128-битных подключей: K и K’. В этом случае подключ K применяется обычным образом (снова сошлюсь на описание алгоритма в первой части статьи), а подключ K’ применяется для маскирования нонса N путем его наложения на нонс операцией XOR перед выполнением процедуры зашифрования или расшифрования (у такого подхода есть ограничения применения, описанные в [1]). При использовании комплексного ключа это требование должно применяться к обеим его частям.
Должна обеспечиваться секретность ключа K. При использовании комплексного ключа необходимо соблюдать секретность обоих подключей, а также маскированного значения нонса.
При каждом зашифровании с вычислением аутентифицирующего тега на одном и том же ключе должно использоваться уникальное значение нонса.
Допускается использование усеченного аутентифицирующего тега вместо его полного 128-битного значения. В этом случае используется требуемое количество левых бит тега T со следующими ограничениями:
· размер усеченного тега λ в любом случае не должен быть меньше 32 бит;
· в случае, если размер λ меньше 64 бит, необходимо провести анализ риска подделки тега перед использованием тега такого размера;
· в течение времени жизни конкретного ключа K должен использоваться один и тот же размер λ.Во избежание подделки тега должно быть установлено ограничение на максимальное количество попыток расшифрования, приводящих к ошибке проверки тега. Данное количество (обозначим его NF) зависит от размера тега следующим образом:
· если 64 ≤ λ ≤ 128, то NF = 2λ-32;
· если 32 ≤ λ < 64, то NF = 1, но допускается и увеличение значения NF вплоть до 2λ-32 после проведения анализа риска, доказывающего, что это не нарушит безопасность применения алгоритма.Максимальное количество обрабатываемых данных (включая значения нонса) на одном ключе (как при зашифровании, так и при расшифровании) не должно превышать 254 байт.
При достижении лимита на обработку данных или лимита NF необходимо прекратить использование текущего секретного ключа и перейти на ��овый.
Стоит отметить, что данные требования являются достаточно типичными для AEAD-алгоритмов. Обеспечение соответствия им требует дополнительных усилий для корректной реализации алгоритма, а также приводит к необходимости отслеживания ряда параметров при их эксплуатации для обеспечения безопасного применения, прежде всего:
счетчика обработанных данных на одном ключе;
счетчика попыток расшифрования с проверкой аутентифицирующего тега, приведших к ошибке.
Отмечу также, что для достижения адекватного уровня безопасности, данные счетчики должны храниться в защищенной от несанкционированной перезаписи памяти и должны инкрементироваться до совершения соответствующих операций. Полезные рекомендации по грамотным и безопасным хранению и обработке состояния криптографического алгоритма можно найти в документе [3] (документ не имеет отношения к теме этой статьи, но вопросы работы с подобными счетчиками в нем описаны достаточно подробно).
Счетчики можно не вести в случае, когда, во-первых, сценарий использования реализации алгоритма доказуемо не предполагает обработки большого объема данных на одном ключе (а 254 байт – это крайне большой объем данных, особенно для малоресурсных устройств), и, во-вторых, применяется неусеченный или усеченный незначительно аутентифицирующий тег – тогда величина 2λ-32 также становится астрономически большой.
Обеспечиваемый уровень криптостойкости
Все алгоритмы, описанные в стандарте [1], обладают заявленным уровнем криптостойкости 128 бит, что отражено в их названиях (за исключением Ascon-Hash256, в названии которого указан размер выходного значения данной хеш-функции в битах, что типично для именования алгоритмов хеширования). При этом алгоритм Ascon-AEAD128 обеспечивает 128-битный уровень криптостойкости при соответствии ряду условий:
выполнение перечисленных выше требований;
использование неусеченного тега; в случае усечения тега до некоторого размера λ стойкость данного алгоритма соответственно уменьшается до λ-битного уровня;
при использовании для обработки данных множества из u независимых ключей уровень стойкости понижается до 128 - log2 u бит (данная проблема снимается маскированием нонса, которое было описано выше) или до минимального из значений λ и 128 - log2 u при использовании усеченного тега.
Алгоритмы с переменным размером выходного значения Ascon-XOF128 и Ascon-CXOF128 обеспечивают 128-битный уровень криптостойкости только в случае, когда размер выходного значения L не меньше, чем 256 бит. В противном случае данные алгоритмы обеспечивают:
L/2-битный уровень стойкости в части нахождения коллизий;
L-битный уровень стойкости в части нахождения прообразов.
Полезные свойства алгоритмов Ascon
Стандартизованные алгоритмы семейства Ascon обладают целым рядом положительных свойств с точки зрения их применимости в устройствах с ограниченными ресурсами, в частности:
На базе единой перестановки внутреннего состояния могут быть построены алгоритмы различного назначения, что позволит более компактно реализовать в одном устройстве несколько алгоритмов семейства Ascon при необходимости.
Обработка данных алгоритмом Ascon-AEAD128 выполняется в один проход (по сравнению, например, с AEAD-режимами работы блочных шифров GCM [4] и MGM [5], которые обрабатывают открытый текст фактически в два прохода).
Нет необходимости иметь все входные данные до начала их обработки (или даже знать их размер) – данные могут обрабатываться по мере их поступления в псевдо-потоковом режиме (по мере накопления полного блока). Но есть исключение: при наличии и присоединенных данных, и открытого текста зашифрование открытого текста алгоритмом Ascon-AEAD128 можно начинать только после обработки всех присоединенных данных.
В алгоритме не используются какие-либо обратные преобразования, что также снижает тр��бования к ресурсам для их реализации.
Многие из этих достоинств напрямую унаследованы алгоритмами Ascon от структуры криптографической губки, на которой они основаны.
Литература по теме
1. NIST Special Publication 800-232. Ascon-Based Lightweight Cryptography Standards for Constrained Devices. Authenticated Encryption, Hash, and Extendable Output Functions. August 2025.
2. NIST Special Publication 800-133 Revision 2. Recommendation for Cryptographic Key Generation. June 2020.
3. NIST Special Publication 800-208. Recommendation for Stateful Hash-Based Signature Schemes. October 2020.
4. NIST Special Publication 800-38D. Recommendation for Block Cipher Modes of Operation: Galois/Counter Mode (GCM) and GMAC. November 2007.
5. Изменение № 1 ГОСТ 34.13-2018. Информационная технология. Криптографическая защита информации. Режимы работы блочных шифров. Принято 25.09.2023.