Основы современной криптографии
         

Функция хэширования ГОСТ Р .-


При описании функции хэширования будут использоваться те же обозначения, что использовались при описании алгоритма выработки цифровой подписи согласно ГОСТ Р 34.10, и, кроме того, пусть

M– последовательность двоичных символов, подлежащих хэшированию.

h – хэш-функция, отображающая последовательность M в слово h(M) О V256(2).

EK(A) – результат шифрования слова А на ключе K с использованием алгоритма шифрования по ГОСТ 28147 в режиме простой замены.

H – стартовый вектор хэширования.

Общие положения

Под хэш-функцией h понимается отображение

h: B* ® V256(2).

Для определения хэш-функции необходимы:

-                        алгоритм вычисления шаговой функции хэширования k, где

k: V256(2)ґV256(2) ® V256(2);

-                        описание итеративной процедуры вычисления значения хэш-функции h.

Алгоритм вычисления шаговой функции хэширования состоит из трех частей:



-                        генерации четырех 256-битных ключей;

-                        шифрующего преобразования – шифрования 64-битных подслов слова H

на ключах Ki (i = 1, 2, 3, 4) с использованием алгоритма ГОСТ 28147 в режиме простой замены;

-                        перемешивающего преобразования результата шифрования.

Генерация ключей.

Рассмотрим X = (b256, b255, …, b1) О V256(2).

Пусть X = x4||x3||x2||x1

= h16||h15||…||h1 = x32||x31||…||x1,

где xiОV64(2), i = 1..4; hjОV16(2), j = 1..16; xkОV8(2), k = 1..32.


Обозначим A(X) = (x1 Е x2)||x4||x3||x2.

Задается преобразование P: V256(2)®V256(2) слова x32||…||x1 в слово xj(32)||x(j)31||…||xj(1), где j(i+1+4(k?1)) = 8i + k, i

= 0..3, k = 1..8.

Для генерации ключей необходимо использовать следующие исходные данные:

-                        слова H, M О V256(2);

-                        константы: слова Сi (i = 2,3,4), имеющие значения С2=С4=0256 и C3= 180811602411608(0818)21808(0818)4(1808)4.

При вычислении ключей реализуется следующий алгоритм:

1.                 Присвоить значения

i = 1, U = H, V = M.

2.                 Выполнить вычисление

W = U Е V, K1 = P(W).

3.                 Присвоить i = i + 1.

4.                 Проверить условие i = 5. При положительном исходе перейти к шагу 7. При отрицательном – перейти к шагу 5.

5.                 Выполнить вычисление

U = A(U) Е Ci, V = A(A(V)), W = U Е V, Ki

= P(W);

6.                 Перейти к шагу 3

7.                 Конец работы алгоритма.

Шифрующее преобразование

На данном этапе осуществляется шифрование 64-битных подслов слова H на ключах Ki (i = 1, 2, 3, 4).

Для шифрующего преобразования необходимо использовать следующие исходные данные:

H=h4||h3||h2||h1, hiОV64(2), i = 1..4 и набор ключей K1, K2, K3, K4.



После выполнения шифрования получают слова

si = EKi(hi), где i = 1, 2, 3, 4,

т.е. в результате получается вектор

S = s4||s3||s2||s1.

Перемешивающее преобразование

На данном этапе осуществляется перемешивание полученной последовательности с применением регистра сдвига.

Исходными данными являются слова H, M О V256(2) и слово S О V256(2).

Пусть отображение

y: V256(2) ® V256(2)

преобразует слово

h16||…||h1, hiОV16(2), i = 1..16

в слово

h1Еh2Еh3Еh4Еh13Еh16||h16||…||h2.

Тогда в качестве значения шаговой функции хэширования принимается слово

k(M,H) = y61(H

Е y(M

Е y12(S))),

где yi

– i-я степень преобразования y.

Процедура вычисления хэш-функции

Исходными данными для процедуры вычисления значения функции h

является подлежащая хэшированию последовательность M О B*. Параметром является стартовый вектор хэширования H – произвольное фиксированное слово из V256(2).

Процедура вычисления функции h на каждой итерации использует следующие величины:

M О B*

– часть последовательности M, не прошедшая процедуры хэширования на предыдущих итерациях;

H О V256(2) – текущее значение хэш-функции;

S О V256(2) – текущее значение контрольной суммы;

L О V256(2) – текущее значение длины обработанной на предыдущих итерациях части последовательности M.

Алгоритм вычисления функции h включает в себя следующие три этапа:

Этап 1

Присвоить начальные значения текущих величин

M := M; H := H; S := 0256; L := 0256

Этап 2

Проверить условие |M|>256. Если да, то перейти к этапу 3. В противном случае выполнить последовательность вычислений:

L := <L+|M|>256; M' := 0256–|M| ||M; S := S [+] M'

H := k(M',H); H := k(L,H); H := k(S,H);

Конец работы алгоритма. H содержит значение хэш-функции.

Этап 3

Вычислить подслово MS О V256(2) слова M (M=MP||MS). Далее выполнить последовательность вычислений:

H := k(MS,H); L := <L+256>256;  S := S [+] MS; M := MP

Перейти к этапу 2.


Содержание раздела