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]