Музей Криптографии
Исследуем

Алгоритм шифрования «Кузнечик»: как работает российский блочный шифр

«Кузнечик» — современный российский симметричный алгоритм шифрования. Он работает с блоками по 128 бит и использует ключ длиной 256 бит. Алгоритм входит в ГОСТ 34.12-2018 и применяется в системах криптографической защиты информации.

На первый взгляд его устройство выглядит сложно: раундовые ключи, S-блоки, линейные преобразования, операции в конечных полях. Но общая логика довольно понятна: данные несколько раз смешиваются с ключом и преобразуются так, чтобы связь между исходным текстом и шифротекстом стала максимально сложной.

Что такое «Кузнечик»

«Кузнечик» — симметричный блочный шифр.

Симметричный означает, что для шифрования и расшифрования используется один секретный ключ.

Блочный — что данные обрабатываются частями фиксированной длины.

У «Кузнечика»:

  • размер блока — 128 бит, или 16 байт;
  • размер ключа — 256 бит, или 32 байта.

Алгоритм был впервые стандартизован в ГОСТ Р 34.12-2015, а затем вошёл в ГОСТ 34.12-2018. Международное описание опубликовано в RFC 7801 под названием Kuznyechik — именно такая транслитерация используется в англоязычном техническом документе. Буквальный перевод русского слова кузнечик — grasshopper, но официальное англоязычное название алгоритма не переводят.

Почему алгоритм называется «Кузнечик»

У названия есть любопытная история.

В профессиональной среде распространена расшифровка:

КУЗ — Кузьмин,
НЕЧ — Нечаев,
И К — «и компания».

То есть «КУЗ-НЕЧ-ИК» читается как своеобразная игра слов: «Кузьмин, Нечаев и компания». Именно такую версию приводят публикации о происхождении названия алгоритма. При этом в самом ГОСТе эта расшифровка официально не закреплена, поэтому корректнее считать её общепринятой профессиональной версией, а не формальным названием из стандарта.

Есть и более прозаичное объяснение: авторы алгоритма отмечали, что название продолжает традицию криптографических алгоритмов с необычными и труднопроизносимыми именами вроде Rijndael и Keccak.

Как работает шифрование «Кузнечик»

Алгоритм несколько раз преобразует один 128-битный блок.

В каждом раунде используются три основные операции:

  • X — смешивание данных с ключом;
  • S — нелинейная замена;
  • L — линейное перемешивание.

Такую конструкцию называют подстановочно-перестановочной сетью.

Если упростить, каждый раунд делает три вещи: добавляет влияние ключа, ломает простые зависимости между байтами и распространяет изменения по всему блоку.

Шаг 1. Смешивание с ключом

Сначала данные объединяются с очередным раундовым ключом с помощью операции XOR.

Для отдельных битов XOR работает так:

0 XOR 0 = 0
0 XOR 1 = 1
1 XOR 0 = 1
1 XOR 1 = 0

Эта операция быстро и обратимо смешивает данные с секретным ключом.

Самого XOR для надёжного шифрования недостаточно, поэтому сразу после него выполняются более сложные преобразования.

Шаг 2. Нелинейная замена

Далее каждый байт заменяется другим по специальной таблице — S-блоку.

Таблица содержит 256 значений: по одному для каждого возможного байта от 0 до 255.

Условно принцип можно представить так:

10 заменить на 45,
45 заменить на 1,
1 заменить на 238.

Реальная таблица зафиксирована стандартом.

Главная задача S-преобразования — добавить нелинейность. Благодаря этому нельзя описать шифр набором простых линейных уравнений и легко восстановить исходные данные.

Шаг 3. Линейное преобразование

После подстановки выполняется L-преобразование.

Его задача — распространить влияние каждого изменённого байта на весь блок.

Если изменить один бит исходного текста, после нескольких раундов это изменение затронет множество битов результата.

Так появляется эффект, важный для стойкого шифра: два почти одинаковых сообщения дают совершенно разные шифротексты.

Сколько раундов используется

Из исходного 256-битного ключа алгоритм получает 10 раундовых ключей.

Первые девять раундов выполняют последовательность:

X → S → L

После этого применяется десятый раундовый ключ.

Многократное повторение нужно для того, чтобы первоначальная структура данных исчезла, а влияние ключа распределилось по всему блоку.

Откуда берутся раундовые ключи

Пользователь задаёт один ключ длиной 256 бит.

Алгоритм делит его на две части и с помощью специальной процедуры развёртки получает остальные раундовые ключи.

При этом используются те же типы преобразований: XOR, подстановки, линейное преобразование и специальные константы.

То есть раундовые ключи не выбираются случайно и не задаются вручную — они вычисляются из исходного секрета.

Как происходит расшифрование

Все преобразования «Кузнечика» обратимы.

При расшифровании используются обратные операции:

  • обратное линейное преобразование;
  • обратная S-подстановка;
  • раундовые ключи в обратном порядке.

Если ключ правильный, исходный текст восстанавливается полностью.

Если нет — получается бессмысленный набор данных.

Почему одного алгоритма недостаточно

«Кузнечик» шифрует один блок размером 16 байт.

Но реальные файлы и сетевые сообщения намного длиннее. Поэтому блочный шифр используют вместе с режимом работы.

Режим определяет, как обрабатывать последовательность блоков и как связывать их между собой.

Это важно, потому что нельзя просто независимо шифровать каждый одинаковый блок одинаковым способом: иначе структура исходных данных может частично сохраниться.

Поэтому в реальных системах безопасность зависит не только от самого «Кузнечика», но и от правильно выбранного режима, генерации ключей и всей реализации.

Насколько велик ключ

Ключ длиной 256 бит даёт:

2²⁵⁶ возможных вариантов.

Это настолько большое пространство, что полный перебор практически нереален.

Но стойкий алгоритм ещё не означает автоматически безопасную систему.

На практике злоумышленнику часто проще:

  • украсть ключ;
  • получить пароль;
  • найти ошибку в программе;
  • атаковать устройство пользователя;
  • воспользоваться неправильной настройкой;
  • перехватить данные до шифрования или после расшифрования.

Поэтому криптографическая стойкость — только одна часть общей безопасности.

«Магма» и «Кузнечик»: в чём разница

ГОСТ 34.12-2018 описывает два блочных шифра — «Магму» и «Кузнечик».

У обоих ключ длиной 256 бит, но архитектура разная.

Размер блока

«Магма» — 64 бита.
«Кузнечик» — 128 бит.

Более крупный блок удобнее при обработке больших объёмов данных и снижает ряд ограничений, связанных с повторением блоков.

Архитектура

«Магма» использует сеть Фейстеля и развивает идеи более раннего ГОСТ 28147-89.

«Кузнечик» построен как подстановочно-перестановочная сеть.

Число раундов

У «Магмы» — 32 раунда.

У «Кузнечика» — 10 раундовых ключей и девять основных преобразований X–S–L перед финальным наложением ключа.

Само число раундов ничего не говорит о сравнительной стойкости: раунды у этих алгоритмов устроены по-разному.

Где используется «Кузнечик»

Алгоритм предназначен для программной и аппаратной реализации в системах криптографической защиты информации.

Он может использоваться в:

  • защищённых каналах связи;
  • средствах шифрования;
  • аппаратных криптомодулях;
  • корпоративных системах;
  • государственных информационных системах.

Сам «Кузнечик» — не программа и не готовое приложение, а математически точно описанный алгоритм.

Его можно реализовать в программном коде, микросхеме или специальном криптографическом устройстве.

От шифровальных машин к математике

«Кузнечик» хорошо показывает, как изменилась криптография за XX век.

В «Энигме» и других роторных машинах шифрование выполняли физические диски, контакты и провода.

В современных алгоритмах ту же задачу решают математические преобразования, которые процессор выполняет за доли секунды.

Но общий принцип узнаваем: сообщение многократно преобразуется с помощью секретного ключа, пока связь между исходными и зашифрованными данными не становится практически непригодной для восстановления без этого ключа.

В московском музее криптографии можно проследить этот путь от механических шифровальных устройств до современных алгоритмов и увидеть, как криптография постепенно перешла от механики к математике и программному коду.