Функция хэширования ГОСТ Р .-
При описании функции хэширования будут использоваться те же обозначения, что использовались при описании алгоритма выработки цифровой подписи согласно ГОСТ Р 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.