Алгоритм криптографического преобразования данных ГОСТ 28147-89
В нашей стране установлен единый алгоритм криптографического преобразования данных для систем обработки информации в сетях ЭВМ, отдельных вычислительных комплексах и ЭВМ, который определяется ГОСТ 28147-89. Стандарт обязателен для организаций, предприятий и учреждений, применяющих криптографическую защиту, хранимых и передаваемых в сетях ЭВМ, в отдельных вычислительных комплексах и ЭВМ.
Этот алгоритм предназначен для аппаратной и программной реализации, удовлетворяет криптографическим требованиям и не накладывает ограничений на степень секретности защищаемой информации. Он представляет собой 64-битовый блочный алгоритм с 256-битовым ключом, основанный на сети Фейстеля.
Алгоритм шифрования блока данных по ГОСТ 28147-89 описывается схемой, представленной на рис. 3.2. Обозначения на схеме:
– 32-разрядные накопители;
– 32-разрядный сумматор по модулю 232 ([+]);
– 32-разрядный сумматор по модулю 2 (Å);
R – 32-разрядный регистр циклического сдвига;
КЗУ – ключевое запоминающее устройство на 256 бит, состоящее из восьми 32-разрядных накопителей ;
S – блок подстановки, состоящий из восьми узлов замены (S-блоков замены) .
Рис. 3.2. Схема преобразования информации в алгоритме шифрования блока по ГОСТ 28147–89. |
Открытые данные, подлежащие шифрованию, разбивают на 64-разрядные блоки . Процедура шифрования 64-разрядного блока включает 32 раунда (цикла) (j = 1…32).
В ключевое запоминающее устройство вводят 256 бит ключа K в виде восьми 32-разрядных подключей :
.
Последовательность битов блока
разбивают на две последовательности по 32 бита: b(0) а(0), где b(0) – левые или старшие биты, а(0) – правые или младшие биты.
Эти последовательности вводят в накопители и ; перед началом первого раунда шифрования.
В результате начальное заполнение накопителя :
Номер разряда | … | ||||
a(0) = ( | , | , | …, | , | ) |
Начальное заполнение накопителя :
Номер разряда | … | ||||
b(0) = ( | , | , | …, | , | ) |
Первый раунд (j = 1) процедуры шифрования 64-разрядного блока открытых данных можно описать уравнениями:
,
.
Здесь а(1) – заполнение , b(1) – заполнение после 1-го раунда шифрования; f – функция шифрования.
Аргументом функции f является сумма по модулю числа а(0) (начального заполнения накопителя ) и числа – подключа, считываемого из накопителя КЗУ. Каждое из этих чисел равно 32 битам.
Функция f включает две операции над полученной 32-разрядной суммой .
Первая операция является подстановкой (заменой) и выполняется блоком подстановки S. Блок подстановки S состоит из восьми узлов замены (S-блоков замены) с памятью 64 бит каждый. Поступающий из на блок подстановки S 32-разрядный вектор разбивают на восемь последовательно идущих 4-разрядных векторов, каждый из которых преобразуется в четырехразрядный вектор соответствующим узлом замены. Каждый узел замены можно представить в виде таблицы-подстановки шестнадцати четырехразрядных двоичных чисел в диапазоне 0000…1111. Входной вектор указывает адрес строки в таблице, а число в этой строке является выходным вектором. Затем четырехразрядные выходные векторы последовательно объединяют в 32-разрядный вектор. Узлы замены (таблицы-подстановки) представляют собой ключевые элементы, которые являются общими для сети ЭВМ и редко изменяются. Эти узлы замены должны сохраняться в секрете. Считается, что стойкость алгоритма ГОСТ 28147-89 во многом определяется структурой узлов замены.
Долгое время структура S-блоков в открытой печати не публиковалась. В настоящее время известны S-блоки, которые используются в приложениях Центрального Банка Российской Федерации и считаются достаточно сильными. Их устройство дано в табл. 3.1. Каждый S-блок может быть представлен в виде строки чисел от 0 до 15, расположенных в некотором порядке. Тогда порядковый номер числа будет являться входным значением S-блока, а само число – выходным значением S-блока.
Таблица 3.1
Рекомендуемые узлы замены для алгоритма ГОСТ 28147-89
№ S-блока | Значение входа | |||||||||||||||
Вторая операция – циклический сдвиг влево (на 11 разрядов) 32-разрядного вектора, полученного с выхода блока подстановки S. Циклический сдвиг выполняется регистром сдвига R.
Далее результат работы функции шифрования f суммируют поразрядно по модулю 2 в сумматоре с 32-разрядным начальным заполнением b(0) накопителя . Затем полученный на выходе результат (значение а(1)) записывают в накопитель , а старое значение (значение а(0)) переписывают в накопитель (значение b(1) = а(0)). На этом первый раунд завершается.
Последующие раунды осуществляются аналогично, при этом во втором раунде из КЗУ считывают заполнение – подключ , в третьем – подключ и т.д., в восьмом раунде – подключ . В раундах с 9-го по 16-й, а также в с 17-го по 24-й подключи из КЗУ считываются в том же порядке: . В последних восьми раундах с 25-го по 32-й порядок считывания подключей из КЗУ обратный: . Таким образом, при шифровании в 32 циклах осуществляется следующий порядок выборки из КЗУ подключей:
В 32-м раунде результат из сумматора вводится в накопитель , а в накопителе сохраняется прежнее заполнение. Полученные после 32-го раунда заполнения накопителей и являются блоком зашифрованных данных , соответствующим блоку открытых данных .
Таким образом уравнения шифрования блока имеют вид:
при j = 1…24,
при j = 25…31,
при j = 32,
где – заполнение после j-го раунда шифрования, – заполнение после j-го раунда, j = 1…32.
Блок зашифрованных данных (64 разряда) выводится из накопителей , в следующем порядке: из разрядов 1…32 накопителя , затем из разрядов 1…32 накопителя , т.е. начиная с младших разрядов:
.
Криптосхема, реализующая алгоритм расшифрования блока, имеет тот же вид, что и при шифровании (см. рис. 3.2).
В КЗУ вводят 256 бит ключа, на котором осуществлялось шифрование. Зашифрованные данные, подлежащие расшифрованию, разбиты на блоки по 64 бита в каждом. Ввод любого блока в накопители и производят так, чтобы начальное значение накопителя , имело вид:
Номер разряда | … | ||||
a(32) = ( | , | , | …, | , | ) |
Начальное заполнение накопителя :
Номер разряда | … | ||||
b(32) = ( | , | , | …, | , | ) |
Расшифрование осуществляется по тому же алгоритму, что и шифрование, с тем изменением, что заполнения накопителей считываются из КЗУ в раундах расшифрования в следующем порядке:
Уравнения расшифрования имеют вид:
при j=1…8,
при j=9…31,
при j=32.
Полученные после 32 циклов работы заполнения накопителей и образуют блок открытых данных
,
соответствующий блоку зашифрованных данных .