«Кузнечик» (англ. Kuznyechik[1] или англ. Kuznechik[2][3]) — симметричный алгоритм блочного шифрования с размером блока 128 бит и длиной ключа 256 бит, использующий для генерации раундовых ключей SP-сеть.
Общие сведения
Данный шифр утверждён (наряду с блочным шифром «Магма») в качестве стандарта в ГОСТ Р 34.12-2015 «Информационная технология. Криптографическая защита информации. Блочные шифры» приказом от 19 июня 2015 года № 749-ст[4]. Стандарт вступил в действие с 1 января 2016 года[5]. Шифр разработан Центром защиты информации и специальной связи ФСБ России с участием АО «Информационные технологии и коммуникационные системы» (АО «ИнфоТеКС»). Внесён Техническим комитетом по стандартизации ТК 26 «Криптографическая защита информации»[6][7].
Протоколом № 54 от 29 ноября 2018 года, на основе ГОСТ Р 34.12-2015, Межгосударственным советом по метрологии, стандартизации и сертификации был принят межгосударственный стандарт ГОСТ 34.12-2018. Приказом Федерального агентства по техническому регулированию и метрологии от 4 декабря 2018 года № 1061-ст стандарт ГОСТ 34.12-2018 введен в действие в качестве национального стандарта Российской Федерации с 1 июня 2019 года.
Обозначения
— поле Галуа
по модулю неприводимого многочлена
.
— биективное отображение, ставящее в соответствие элементу кольца
(
) его двоичное представление.
— отображение, обратное к
.
— биективное отображение, ставящее в соответствие двоичной строке элемент поля
.
— отображение, обратное к 
Описание алгоритма
Для шифрования, расшифрования и генерации ключа используются следующие функции:
, где
,
— двоичные строки вида
…
(
— символ конкатенации строк).
…
— обратное к
преобразование.
…
…
— обратное к
преобразование, причём
…
…
, где
— композиция преобразований
и
и т. д.
=(HNAdd_{2}[k](a_{1})\oplus a_{0},a_{1}).}](https://wikimedia.org/api/rest_v1/media/math/render/svg/1c85ce552ea9e0cd61a0515751760dedb0ea6f6c)
Нелинейное преобразование
Нелинейное преобразование задается подстановкой S = Bin8 S' Bin8−1.
Значения подстановки S' заданы в виде массива S' = (S'(0), S'(1), …, S'(255)):














Линейное преобразование
Задаётся отображением
:
…


где операции сложения и умножения осуществляются в поле
.
Генерация ключа
Алгоритм генерации ключа использует итерационные константы
, i=1,2,…32. Задается общий ключ
…
.
Вычисляются итерационные ключи
…
…
…,i=1,2,3,4.}](https://wikimedia.org/api/rest_v1/media/math/render/svg/3ddd4e757787c2046482edb6ceb545653ab724d3)
Алгоритм зашифрования
…
где a — строка размером 128 бит.
Алгоритм расшифрования
…![{\displaystyle N^{-1}H^{-1}Add_{2}[K_{9}]N^{-1}H^{-1}Add_{2}[K_{10}](a).}](https://wikimedia.org/api/rest_v1/media/math/render/svg/3684679ec02aa35ad4468adba5c47817fe650add)
Строка «a» задается в шестнадцатеричном виде и имеет размер 16 байт, причём каждый байт задается двумя шестнадцатеричными числами.
Таблица соответствия строк в двоичном и в шестнадцатеричном виде:
0000 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 | 1000 | 1001 | 1010 | 1011 | 1100 | 1101 | 1110 | 1111 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | a | b | c | d | e | f |
Пример N-преобразования

Пример G-преобразования




Пример H-преобразования

Пример генерации ключа




=e63bdcc9a09594475d369f2399d1f276,}](https://wikimedia.org/api/rest_v1/media/math/render/svg/e9c5aa6a705f386a49494191c9c9e1a6e0a142fa)

=3d0940999db75d6a9257071d5e6144a6,}](https://wikimedia.org/api/rest_v1/media/math/render/svg/e32ef8c18baf0b9cfe9e8ded0dcf8cd088d94f21)
=(HNAdd_{2}[C_{1}](K_{1})\oplus K_{2},K_{1})=(c3d5fa01ebe36f7a9374427ad7ca8949,8899aabbccddeeff0011223344556677).}](https://wikimedia.org/api/rest_v1/media/math/render/svg/81912db46e0f642eaf8cb6e7930f0907b0274ba8)

![{\displaystyle F[C_{2}]F[C_{1}](K_{1},K_{2})=(37777748e56453377d5e262d90903f87,c3d5fa01ebe36f7a9374427ad7ca8949).}](https://wikimedia.org/api/rest_v1/media/math/render/svg/4817e0f7219a0e12ef8db495a5e78bcec39b9a88)

![{\displaystyle F[C_{3}]F[C_{2}]F[C_{1}](K_{1},K_{2})=(f9eae5f29b2815e31f11ac5d9c29fb01,37777748e56453377d5e262d90903f87).}](https://wikimedia.org/api/rest_v1/media/math/render/svg/b9475618bd602d6228e55d9e09e5e15c12af76b4)

![{\displaystyle F[C_{4}]F[C_{3}]F[C_{2}]F[C_{1}](K_{1},K_{2})=(e980089683d00d4be37dd3434699b98f,f9eae5f29b2815e31f11ac5d9c29fb01).}](https://wikimedia.org/api/rest_v1/media/math/render/svg/8eab15755e95e1b9a6438564d0d44c6f062ba6d3)

![{\displaystyle F[C_{5}]F[C_{4}]F[C_{3}]F[C_{2}]F[C_{1}](K_{1},K_{2})=(b7bd70acea4460714f4ebe13835cf004,e980089683d00d4be37dd3434699b98f).}](https://wikimedia.org/api/rest_v1/media/math/render/svg/6bfdeaf983358886f3a5ec34d22f20f5a10b3f5e)

![{\displaystyle F[C_{6}]F[C_{5}]F[C_{4}]F[C_{3}]F[C_{2}]F[C_{1}](K_{1},K_{2})=(1a46ea1cf6ccd236467287df93fdf974,b7bd70acea4460714f4ebe13835cf004).}](https://wikimedia.org/api/rest_v1/media/math/render/svg/71c9cccb6e30628511d03ad8b1aafd165791ce1e)

![{\displaystyle F[C_{7}]F[C_{6}]F[C_{5}]F[C_{4}]F[C_{3}]F[C_{2}]F[C_{1}](K_{1},K_{2})=(3d4553d8e9cfec6815ebadc40a9ffd04,1a46ea1cf6ccd236467287df93fdf974).}](https://wikimedia.org/api/rest_v1/media/math/render/svg/88173b5038a3b738bb18472ef38b9656d5398d8a)

…![{\displaystyle F[C_{2}]F[C_{1}](K_{1},K_{2})=(db31485315694343228d6aef8cc78c44,3d4553d8e9cfec6815ebadc40a9ffd04).}](https://wikimedia.org/api/rest_v1/media/math/render/svg/10248f11a6f7a6c93619b3c16fe39058c52620b8)
В итоге получаем итерационные ключи:










Пример алгоритма зашифрования
Открытый текст 
Криптостойкость
Ожидается, что новый блочный шифр «Кузнечик» будет устойчив ко всем видам атак на блочные шифры.
На конференции «CRYPTO 2015» Алекс Бирюков, Лео Перрин и Алексей Удовенко представили доклад, в котором говорится о том, что несмотря на утверждения разработчиков, значения S-блока шифра Кузнечик и хеш-функции Стрибог не являются (псевдо)случайными числами, а сгенерированы на основе скрытого алгоритма, который им удалось восстановить методами обратного проектирования[9]. Позднее Лео Перрин и Алексей Удовенко опубликовали два альтернативных алгоритма генерации S-блока и доказали его связь с S-блоком белорусского шифра BelT[10]. В этом исследовании авторы также утверждают, что, хотя причины использования такой структуры остаются неясны, использование скрытых алгоритмов для генерации S-блоков противоречит принципу отсутствия козыря в рукаве, который мог бы служить доказательством отсутствия специально заложенных уязвимостей в дизайне алгоритма.
Riham AlTawy и Amr M. Youssef описали атаку «встречи посередине» на 5 раундов шифра Кузнечик, имеющую вычислительную сложность 2140 и требующую 2153 памяти и 2113 данных[11].
Примечания
Ссылки