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


КЗУ отведено 256 бит, в ГОСТ 28147-89 используется ключ длиной 256 бит. Ключ разбивается на восемь блоков по 32 бита, и каждый бит каждого блока последовательно вводится в накопитель X соответствующего порядка.
То есть, 1-й бит ключа вводится в 1-й разряд накопителя X0, 2-й — во 2-й разряд накопителя X0, 33-й — в 1-й разряд накопителя X1, 65-й — в 1-й разряд накопителя X2, и так далее, 224-й бит ключа вводится в 1-й разряд накопителя X7, 256-й бит ключа вводится в 32-й разряд накопителя X7.
Считывается же ключ в соответствии с выбранным режимом работы алгоритма, но в следующих частях статьи.
Блок подстановки содержит в себе таблицу замены размерностью 16x8, которая является долговременным ключом.
Строки таблицы определяют, грубо говоря, что требуется заменить (число от 0 до 15 в шестнадцатиричной системе счисления). Столбцы же указывают, на что заменять. При этом поступающий 32-битовый в блок вектор разбивается на восемь 4-х битовых, каждый из которых и преобразуется в соответствии с таблицой замены.
Ключи как в КЗУ, так и в блоке К, являются секретными, и требуются меры по недопущению их компрометации.
Напоследок хочется отметить, что ГОСТ 28147-89 работает в 4-х режимах, каждый из которых будет рассмотрен в последующих 4-х статьях (с кодом на C++):
Да данный момент все, господа хабражители, в следующий раз рассмотрим режим простой замены, являющийся базовым для всех остальных режимов.
UPD: Следующая часть статьи «Режим простой замены» доступен по ссылке.
Я решил исправить это, написав
Описание алгоритма
ГОСТ 28147-89 является отечественным блочным шифром. То есть открытый текст разбивается на блоки (в данном случае 64 бита), и каждый блок преобразовывается отдельно.
В основу алгоритма положена сеть Фейстеля, представленная на рисунке ниже.

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

Данная схема содержит:
- Четыре накопителя по 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: Следующая часть статьи «Режим простой замены» доступен по ссылке.