Kuznechik (або англ. Kuznyechik, або рос. Кузнечик) — симетричний алгоритм блочного шифрування з розміром блоку 128 бітів і довжиною ключа 256 бітів який входить в стандарту ГОСТ Р 34.12-2015 та ГОСТ 34.12-2018. Шифр використовує для генерації раундових ключів мережу замін-перестановок.
Даний шифр затверджений (поряд з блочним шифром «Магма») в якості стандарту в ГОСТ Р 34.12-2015 «Інформаційна технологія. Криптографічний захист інформації. Блочні шифри» Наказом від 19 червня 2015 року № 749-ст[1]. Стандарт вступив в дію з 1 січня 2016 року.[2]. Шифр розроблений Центром захисту інформації та спеціального зв'язку ФСБ Росії за участю ВАТ «Інформаційні технології та комунікаційні системи» (ВАТ «ІнфоТеКС»). Внесений Технічним комітетом зі стандартизації ТК 26 «Криптографічний захист інформації».
— поле Галуа
за модулем незвідного багаточлена
.
— бієктивне відображення, що ставить у відповідність елементу кільця
(
) його двійкове подання.
— відображення, зворотне до
.
— бієктивне відображення, що ставить у відповідність двійковому рядку елемент поля
.
— відображення, зворотне до
Для шифрування, розшифрування і генерації ключа використовуються наступні функції:
, де
,
— двійкові рядки виду
…
(
— символ конкатенації рядків).
…
— зворотнє до
перетворення.
…
…
— зворотнє до
перетворення, при чому
…
…
, де
— композиція перетворень
і
і т. д.
Нелінійне перетворення задається підстановкою S = Bin8 S' Bin8−1.
Значення підстановки S' задані у вигляді масиву S' = (S'(0), S'(1), …, S'(255)):


Задається відображенням
:
…
де операції додавання і множення здійснюються в полі
.
Алгоритм генерації ключа використовує ітераційні константи
, i=1,2,…32. Задається загальний ключ
…
.
Обчислюються ітераційні ключі
…
…
…
…
де a — рядок разміром 128 біт.
…
Рядок «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 |
…
У підсумку отримуємо ітераційні ключі:
Відкритий текст
Очікується, що новий блочний шифр Kuznechik буде стійкий до всіх видів атак на блочні шифри.
На конференції «CRYPTO-2015» Алекс Бірюков, Лео Перрін і Олексій Удовенко представили доповідь, в якій говориться про те, що незважаючи на твердження розробників, значення S-блоку шифру Kuznechik і геш-функції Streebog не є (псевдо) випадковими числами, а згенеровані на основі прихованого алгоритму, який їм вдалося відновити методами зворотного проектування[3]. Пізніше Лео Перрін і Олексій Удовенко опублікували два альтернативних алгоритми генерації S-блоку і довели його зв'язок з S-блоком білоруського шифру BelT[4]. У цьому дослідженні автори також стверджують, що, хоча причини використання такої структури залишаються неясні, використання прихованих алгоритмів для генерації S-блоків суперечить принципу відсутності козиря в рукаві, який міг би служити доказом відсутністі спеціально закладених вразливостей в дизайні алгоритму.
Riham AlTawy і Amr M. Youssef описали атаку «зустрічі посередині» на 5 раундів шифру Kuznechik, 256-бітний майстер-ключ відновлюється з складністю часу 2140.3 і вимагає 2153.3 пам'яті та 2113 даних.[5]