Pull to refresh

ГОСТ 28147-89 (Часть 1. Введение и общие принципы)

Information Security *
Очень часто на Хабре встречаются статьи о сути, программных реализациях, вскрытиях шифров. Но непонятно одно: почему среди них нет наших, отечественных алгоритмов шифрования?

Я решил исправить это, написав повесть статью, разбитую на 5 частей для лучшего восприятия о стандарте ГОСТ 28147-89. Каждая часть, кроме первой (описывает схему алгоритма и общие принципы), повествует о каждом из четырех возможных режимах работы стандарта с приложением к ним кода на C++.

Описание алгоритма



ГОСТ 28147-89 является отечественным блочным шифром. То есть открытый текст разбивается на блоки (в данном случае 64 бита), и каждый блок преобразовывается отдельно.

В основу алгоритма положена сеть Фейстеля, представленная на рисунке ниже.



Поясню работу данной схемы.


  1. Каждый блок разбивается на два «подблока» (левый и правый, соотвественно).
  2. Исходное заполнение правого блока записывается в левый блок на выходе.
  3. Над правым блоком производится криптографическое преобразование с применением ключевых данных.
  4. Левый (исходный) и правый (преобразованный) блоки складываются по модулю 2 в сумматоре по модулю 2.
  5. Так повторяется несколько раз.

Структурная схема алгоритма





Данная схема содержит:


  • Четыре накопителя по 32 бита: N1, N2, N3, N4.
  • Два 32-разрядных накопителя: N5 и N6, — с записанными в них постоянными заполнениями C2 и C1 соответственно.
  • Ключевое запоминающее устройство (КЗУ) на 256 бит. КЗУ состоит из восьми накопителей по 32 разряда каждый: X0, X1, X2, X3, X4, X5, X6, X7.
  • 32-разрядный сумматор по модулю 2: СМ2.
  • Еще один сумматор по модулю 2, который не имеет ограничения на разрядность (но используется 64 бита): СМ5.
  • Два сумматора по модулю 232 разрядности 32 бита: СМ1, СМ3.
  • Сумматор по модулю (232-1): СМ4.
  • Блок подстановки К: восемь узлов замены K1, K2, K3, K4, K5, K6, K7, K8, каждый с памятью на 64 бита.
  • Регистр циклического сдвига влево на 11 бит R.

Ключи


В КЗУ



КЗУ отведено 256 бит, в ГОСТ 28147-89 используется ключ длиной 256 бит. Ключ разбивается на восемь блоков по 32 бита, и каждый бит каждого блока последовательно вводится в накопитель X соответствующего порядка.

То есть, 1-й бит ключа вводится в 1-й разряд накопителя X0, 2-й — во 2-й разряд накопителя X0, 33-й — в 1-й разряд накопителя X1, 65-й — в 1-й разряд накопителя X2, и так далее, 224-й бит ключа вводится в 1-й разряд накопителя X7, 256-й бит ключа вводится в 32-й разряд накопителя X7.

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

В блоке подстановки K



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

Строки таблицы определяют, грубо говоря, что требуется заменить (число от 0 до 15 в шестнадцатиричной системе счисления). Столбцы же указывают, на что заменять. При этом поступающий 32-битовый в блок вектор разбивается на восемь 4-х битовых, каждый из которых и преобразуется в соответствии с таблицой замены.

Ключи как в КЗУ, так и в блоке К, являются секретными, и требуются меры по недопущению их компрометации.

Режимы работы


Напоследок хочется отметить, что ГОСТ 28147-89 работает в 4-х режимах, каждый из которых будет рассмотрен в последующих 4-х статьях (с кодом на C++):
  • Режим простой замены.
  • Режим гаммирования.
  • Режим гаммирования с обратной связью.
  • Режим выработки имитовставки.

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

UPD: Следующая часть статьи «Режим простой замены» доступен по ссылке.
Tags:
Hubs:
Total votes 52: ↑43 and ↓9 +34
Views 54K
Comments Comments 96