Гост 28147-89

Критика стандарта

Основные проблемы стандарта связаны с неполнотой стандарта в части генерации ключей и таблиц замен. Считается, что у стандарта существуют «слабые» ключи и таблицы замен, но в стандарте не описываются критерии выбора и отсева «слабых».

В октябре 2010 года на заседании 1-го объединённого технического комитета Международной организации по стандартизации (ISO/IEC JTC 1/SC 27) ГОСТ был выдвинут на включение в международный стандарт блочного шифрования ISO/IEC 18033-3. В связи с этим в январе 2011 года были сформированы фиксированные наборы узлов замены и проанализированы их криптографические свойства. Однако ГОСТ не был принят в качестве стандарта, и соответствующие таблицы замен не были опубликованы

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

  • нельзя определить криптостойкость алгоритма, не зная заранее таблицы замен;
  • реализации алгоритма от различных производителей могут использовать разные таблицы замен и могут быть несовместимы между собой;
  • возможность преднамеренного предоставления слабых таблиц замен лицензирующими органами РФ;
  • потенциальная возможность (отсутствие запрета в стандарте) использования таблиц замены, в которых узлы не являются перестановками, что может привести к чрезвычайному снижению стойкости шифра.

Описание

Файл:GOSTDiagram.png ГОСТ 28147-89

ГОСТ 28147-89 — блочный шифр с 256-битным ключом и 32 циклами преобразования, оперирующий 64-битными блоками.
Основа алгоритма шифра — Сеть Фейстеля.

Базовым режимом шифрования по ГОСТ 28147-89 является режим простой замены (определены также более сложные режимы гаммирование, гаммирование с обратной связью и режим имитовставки).
Для зашифрования в этом режиме открытый текст сначала разбивается на две половины (младшие биты — A, старшие биты — B. На i-ом цикле используется подключ Ki:

 Ai+1=Bi⊕f(Ai,Ki){\displaystyle ~A_{i+1} = B_i \oplus f(A_i, K_i)} (⊕{\displaystyle \oplus } = двоичное «исключающее или»)

 Bi+1=Ai{\displaystyle ~B_{i+1} = A_i}

Для генерации подключей исходный 256-битный ключ разбивается на восемь 32-битных блоков: K1…K8.

Ключи K9…K24 являются циклическим повторением ключей K1…K8 (нумеруются от младших битов к старшим).
Ключи K25…K32 являются ключами K1…K8, идущими в обратном порядке.

После выполнения всех 32 раундов алгоритма, блоки A33 и B33 склеиваются (обратите внимание, что старшим битом становится A33, а младшим — B33) — результат есть результат работы алгоритма.

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

Функция f(Ai,Ki){\displaystyle f(A_i, K_i)} вычисляется следующим образом:

Ai и Ki складываются по модулю 232.

Результат разбивается на восемь 4-битовых подпоследовательностей, каждая из которых поступает на вход своего узла таблицы замен (в порядке возрастания старшинства битов), называемого ниже S-блоком. Общее количество S-блоков ГОСТа — восемь, то есть столько же, сколько и подпоследовательностей. Каждый S-блок представляет собой перестановку чисел от 0 до 15. Первая 4-битная подпоследовательность попадает на вход первого S-блока, вторая — на вход второго и т. д.

Если S-блок выглядит так:

и на входе S-блока 0, то на выходе будет 1, если 4, то на выходе будет 5, если на входе 12, то на выходе 6 и т. д.

Выходы всех восьми S-блоков объединяются в 32-битное слово, затем всё слово циклически сдвигается влево (к старшим разрядам) на 11 битов.

Все восемь S-блоков могут быть различными. Фактически, они могут являться дополнительным ключевым материалом, но чаще являются параметром схемы, общим для определенной группы пользователей. В ГОСТ Р 34.11-94 для целей тестирования приведены следующие S-блоки:

Номер S-блока Значение
1 4 10 9 2 13 8 14 6 11 1 12 7 15 5 3
2 14 11 4 12 6 13 15 10 2 3 8 1 7 5 9
3 5 8 1 13 10 3 4 2 14 15 12 7 6 9 11
4 7 13 10 1 8 9 15 14 4 6 12 11 2 5 3
5 6 12 7 1 5 15 13 8 4 10 9 14 3 11 2
6 4 11 10 7 2 1 13 3 6 8 5 9 12 15 14
7 13 11 4 1 3 15 5 9 10 14 7 6 8 2 12
8 1 15 13 5 7 10 4 9 2 3 14 6 11 8 12

Примечания

  1. (14 мая 2014). Дата обращения 9 января 2020.

  2. (23 мая 2014). Дата обращения 9 января 2020.
  3. .
  4. .
  5.  (недоступная ссылка). Дата обращения 26 августа 2019.
  6. .
  7. .
  8. .
  9. .
  10. В описании стандарта ГОСТ обозначены как N1 и N2 соответственно
  11. Шнайер Б. Прикладная криптография. Протоколы, алгоритмы, исходные тексты на языке Си, 2-е издание — М.: Триумф, 2002, 14.1
  12.  (укр.). zakon.rada.gov.ua. Кабинет Министров Украины (12 июня 2007 года).
  13. . zakon.rada.gov.ua (20 августа 2012). Дата обращения 26 августа 2019.
  14. Vitaly V. Shorin, Vadim V. Jelezniakov and Ernst M. Gabidulin. Linear and Differential Cryptanalysis of Russian GOST // Electronic Notes in Discrete Mathematics. — 2001. — С. 538-547.
  15. Nicolas T. Courtois. . . Cryptology ePrint Archive: Report 2011/211
  16. .
  17. Сергей Панасенко. (15 августа 2007). Дата обращения 30 ноября 2012.
  18. Технический комитет по стандартизации (ТК 26) «Криптографическая защита информации»  (недоступная ссылка). Дата обращения 11 ноября 2012.
  19. Leontiev, S., Ed. and G. Chudov, Ed.  (англ.) (December 2008). — Internet-Drafts, work in progress. Дата обращения 21 июня 2009.

  20. S. Leontiev,
    P. Smirnov,
    A. Chelpanov.  (англ.) (December 2008). — Internet-Drafts, work in progress. Дата обращения 21 июня 2009.

Общие принципы реализации режима гаммирования

Гамма шифра

Гаммирование — это наложение (или снятие при расшифровке сообщений) на открытое (или зашифрованное) сообщение так называемой криптографической гаммы. Криптографическая гамма — это последовательность элементов данных, которая вырабатывается с помощью определенного алгоритма. Наложение (или снятие) гаммы на блок сообщения в рассматриваемом нами стандарте реализуется с помощью операции побитного сложения по модулю 2 (XOR). То есть при шифровании сообщений каждый блок открытого сообщения ксорится с блоком криптографической гаммы, длина которого должна соответствовать длине блоков открытого сообщения. При этом, если размер блока исходного текста меньше, чем размер блока гаммы, блок гаммы обрезается до размера блока исходного текста (выполняется процедура усечения гаммы).

Принцип реализации режима гаммирования при зашифровывании сообщения

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

Принцип реализации режима гаммирования при расшифровывании сообщения

В большинстве случаев размер блока исходного текста принимается равным размеру блока используемого алгоритма блочного шифрования (напомню, это 16 байт при использовании алгоритма «Кузнечик» или 4 байт при использовании «Магмы»), поэтому процедура усечения блока гаммы может понадобиться только для последнего блока исходного текста, в случае, когда общая длина сообщения не кратна размеру одного блока и последний блок получается неполный.

Усечение блока гаммы при несовпадении размеров блока исходного сообщения и блока гаммы

Чтобы обеспечить высокую стойкость шифрования, блоки гаммы должны отличаться друг от друга, а также иметь случайный (или псевдослучайный) характер. В данном примере блоки различаются благодаря так называемому инициализирующему вектору, значение которого меняется от блока к блоку. Псевдослучайность блоков гаммы при этом реализуется путем шифрования этого вектора с использованием выбранного алгоритма (мы используем «Магму»).

Инициализирующий вектор

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

В режиме гаммирования инициализирующий вектор формируется дополнением нулями синхропосылки до размера одного блока используемого алгоритма блочного шифрования. В случае «Магмы» длина синхропосылки равна четырем байтам, длина инициализирующего вектора — восьми. Вторая часть инициализирующего вектора (заполненная нулями) будет использоваться в качестве того самого счетчика (Counter), который и лег в основу англоязычного сокращения CTR.

Выработка инициализирующего вектора в режиме гаммирования с алгоритмом блочного шифрования «Магма»

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

Выработка гаммы шифра

Зашифровываем и расшифровываем

В целом процесс шифрования выглядит следующим образом.

Зашифровывание в режиме гаммирования

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

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

Дешифровка в режиме гаммирования

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector