Россия, Санкт-Петербург, Северо-Западный заочный технический университет, 2007 |
Хэш-функции
Хэш-функция ГОСТ 3411
Алгоритм ГОСТ 3411 является отечественным стандартом на хэш-функции. Его структура довольно сильно отличается от структуры алгоритмов SHA-1,2 или MD5, в основе которых лежит алгоритм MD4.
Длина хэш-кода, создаваемого алгоритмом ГОСТ 3411, равна 256 битам. Алгоритм разбивает сообщение на блоки, длина которых также равна 256 битам. Кроме того, алгоритм имеет параметр, который называется стартовый вектор хэширования Н – произвольное фиксированное значение длиной также 256 бит.
Сообщение обрабатывается справа налево блоками по 256 бит.
Каждый блок сообщения обрабатывается по следующему алгоритму.
- Генерация четырех ключей длиной 256 бит каждый.
- Шифрование 64-битных значений промежуточного хэш-кода H на ключах Ki, (i = 1, 2, 3, 4) с использованием алгоритма ГОСТ 28147 в режиме простой замены.
- Перемешивание результата шифрования.
Для генерации ключей используются следующие данные:
- промежуточное значение хэш-кода Н длиной 256 бит;
- текущий обрабатываемый блок сообщения М длиной 256 бит;
- параметры – три значения С2, С3 и С4 длиной 256 бит следующего вида: С2 и С4 состоят из одних нулей, а С3равно
18 08 116 024 116 08 (08 18)2 18 08 (08 18)4 (18 08)4
где степень обозначает количество повторений 0 или 1.
Используются две формулы, определяющие перестановку и сдвиг.
Перестановка Р битов определяется следующим образом: каждое 256-битное значение рассматривается как последовательность тридцати двух 8-битных значений.
Перестановка Р элементов 256-битной последовательности выполняется по формуле y=ϕ(x), где x – порядковый номер 8-битного значения в исходной последовательности; y – порядковый номер 8-битного значения в результирующей последовательности.
Сдвиг А определяется по формуле
Где xi – соответствующие 64 бита 256-битного значения х, || обозначает конкатенацию.
Присваиваются следующие начальные значения:
Ключи K2, K3, K4 вычисляются последовательно по следующему алгоритму:
Далее выполняется шифрование 64-битных элементов текущего значе-ния хэш-кода Н с ключами K1, K2, K3 и K4. При этом хэш-код Н рассматривается как последовательность 64-битных значений:
Выполняется шифрование алгоритмом ГОСТ 28147:
Наконец на заключительном этапе обработки очередного блока выполняется перемешивание полученной последовательности. 256-битное значение рассматривается как последовательность шестнадцати 16-битных значений. Сдвиг обозначается ψ и определяется следующим образом:
-исходное значение
- результирующее значение
Результирующее значение хэш-кода определяется следующим образом:
Где H – предыдущее значение хэш-кода, М – текущий обрабатываемый блок, ψi – i-ая степень преобразования y.
Входными параметрами алгоритма являются:
- исходное сообщение М произвольной длины;
- стартовый вектор хэширования Н, длина которого равна 256 битам;
- контрольная сумма ∑, начальное значение которой равно нулю и длина равна 256 битам;
- переменная L, начальное значение которой равно длине сообщения.
Сообщение М делится на блоки длиной 256 бит и обрабатывается справа налево. Очередной блок i обрабатывается следующим образом:
- H = χ (Mi, H)
- ∑ = ∑⊕' Mi
- L рассматривается как неотрицательное целое число, к этому числу прибавляется 256 и вычисляется остаток от деления получившегося числа на 2256. Результат присваивается L.
Где ⊕' обозначает следующую операцию: ∑ и Mi рассматриваются как неотрицательные целые числа длиной 256 бит. Выполняется обычное сложение этих чисел и находится остаток от деления результата сложения на 2256. Этот остаток и является результатом операции.
Самый левый, т.е. самый последний блок М' обрабатывается следующим образом:
- Блок добавляется слева нулями так, чтобы его длина стала равна 256 битам.
- Вычисляется ∑ = ∑ ⊕' M'.
- L рассматривается как неотрицательное целое число, к этому числу прибавляется длина исходного сообщения М и находится остаток от деления результата сложения на 2256.
- Вычисляется Н = χ (М', Н).
- Вычисляется Н = χ (L, Н)
- Вычисляется Н = χ (∑, Н).
Значением функции хэширования является Н.