Алгоритм шифрования в режиме простой замены показан на рисунке 6.2.1.6.
Рисунок 6.2.1.6 Схема алгоритма ГОСТ 28147-89 в режиме простой замены
Обозначения на схеме:
N1, N2 - 32-разрядные накопители;
CM1 - 32-разрядный сумматор по модулю 232 ( * );
CM2 - 32-разрядный сумматор по модулю 2 ();
R - 32-разрядный регистр циклического сдвига;
КЗУ – ключевое запоминающее устройство на 256 бит, состоящее из восьми 32-разрядных накопителей X0,X1,X2, …, X7;
S – блок подстановки, состоящий из восьми узлов замены (S-блоков замены) S1,S2,S3, …, S7,S8.
Зашифрование открытых данных в режиме простой замены. Открытые данные, подлежащие зашифрованию, разбивают на 64-разрядные блоки T0. Процедура зашифрования 64-разрядного блока в режиме простой замены включает 32 цикла (j = 1…32). В ключевое запоминающее устройство вводят 256 бит ключа К в виде восьми 32-разрядных подключей (чисел) К:
разбивают на две последовательности по 32 бита: b(0) a(0), где b(0) – левые или старшие биты, а a(0) – правые или младшие биты.
Эти последовательности вводят в накопители N1 и N2 перед началом первого цикла зашифрования. Начальное заполнение накопителя N1:
начальное заполнение накопителя N2
Первый цикл (j = 1) процедуры зашифрования 64-разрядного блока открытых данных можно описать уравнениями:
Здесь а(1) – заполнение N1, после 1-го цикла зашифрования; b(1) – заполнение N2 после 1-го цикла зашифрования; f – функция зашифрования.
Аргументом функции f является сумма по модулю числа а(0) (начального заполнении накопителя N1) и числа К0 – подключа, считываемого из накопителя Х0КЗУ. Каждое из этих чисел равно 32 битам.
Функция f включает две операции над полученной 32-разрядной суммой (а(0) * К0).
Первая операция называется подстановкой (заменой) и выполняется блоком подстановки S. Блок подстановки S состоит из восьми узлов замены (S-блоков замены) S1,S2,S3, …, S7,S8 с памятью 64 бит каждый. Поступающий из CM1 на блок подстановки S 32-разрядный вектор разбивают на восемь последовательно идущих 4-разрядных векторов, каждый из которых преобразуется в 4-разрядный вектор соответствующим узлом замены. Каждый узел замены можно представить в виде таблицы-перестановки шестнадцати 4-разрядных двоичных чисел в диапазоне 0000…1111. Входной вектор указывает адрес строки в таблице, а число в этой строке является выходным вектором. Затем четырехразрядные выходные векторы последовательно объединяют в 32-разрядный вектор. Узлы замены (таблицы-перестановки) представляют собой ключевые элементы, которые являются общими для сети ЭВМ и редко меняются. Эти узлы замены должны сохраняться в секрете.
Вторая операция – циклический сдвиг влево (на 11 разрядов) 32-разрядного вектора, полученного с выхода блока подстановки S. Циклический сдвиг выполняется регистром сдвига R.
Далее результат работы функции шифрования f суммируется поразрядно по модулю 2 в сумматоре CM2 с 32-разрядным начальным заполнением b(0) накопителя N2. Затем полученный на выходе результат (значение а(1)) записывают в накопитель N1, а старое значение N1 (значение а(0)) переписывают в накопитель N2 (значение b(1) = a(0)). Первый цикл завершен.
Последующие циклы осуществляются аналогично, при этом во втором цикле из КЗУ считывают заполнение X1 - подключ К1, в третьем цикле – подключ К2 и т.д., в восьмом цикле – подключ К7. В циклах с 9-го по 16-й, а также в циклах с 17-го по 24-й подключи из КЗУ считываются в том же порядке: K0,K1,K2, …, K7. В последних восьми циклах с 25-го по 32-й порядок считывания подключей из КЗУ обратный: K7,K6, …, K2, K1, K0. Таким образом, при зашифровании в 32 циклах осуществляется следующий порядок выборки из КЗУ подключей:
В 32-м цикле результат из сумматора CM2 вводится в накопитель N2, а в накопителе N1сохраняется прежнее заполнение. Полученные после 32-го цикла зашифрования заполнения накопителей N1 и N2 являются блоком зашифрованных данных Тш, соответствующим блоку открытых данных Т0.
Уравнения зашифрования в режиме простой замены имеют вид:
при j = 1...24,
при j = 25…31,
при j = 32,
где a(j) = (a32(j),a31(j), …, a1(j)) - заполнение N1 после j-го цикла зашифрования;
b(j) = (b32(j),b31(j), …, b1(j)) - заполнение N2 после j-го цикла зашифрования, j=1…32.
Блок зашифрованных данных Тш (64 разряда) выводится из накопителей N1, N2 в следующем порядке: из разрядов 1…32 накопителя, затем из разрядов 1..32 накопителя N2, т.е. начиная с младших разрядов: