Сообщение обрабатывается блоками по 256 бит справа налево.
Каждый блок сообщения обрабатывается по следующему алгоритму.
1. Генерация четырех ключей длиной 256 бит каждый.
2. Шифрование 64-битных значений промежуточного хэш-кода H на ключах Ki (i = 1, 2, 3, 4) с использованием алгоритма ГОСТ 28147 в режиме простой замены.
3. Перемешивание результата шифрования.
Для генерации ключей используются следующие данные:
- промежуточное значение хэш-кода Н длиной 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-битного значения в результирующей последовательности.
|
|
φ(i + 1 + 4 (k - 1)) = 8i + k
i = 0 ÷ 3, k = 1 ÷ 8
Сдвиг А определяется по формуле
A(x) = (x1 x2) || x4 || x3 || x2
Где
xi - соответствующие 64 бита 256-битного значения х,
|| - обозначает конкатенацию.
Присваиваются следующие начальные значения:
i = 1, U = H, V = M.
W = U V, K1 = Р(W)
Ключи K2, K3, K4 вычисляются последовательно по следующему алгоритму:
U = A(U) Сi,
V = A(A(V)),
W = U V,
Ki = Р(W)
Далее выполняется шифрование 64-битных элементов текущего значения хэш-кода Н с ключами K1, K2, K3 и K4. При этом хэш-код Н рассматривается как последовательность 64-битных значений:
H = h4 || h3 || h2 || h1
Выполняется шифрование алгоритмом ГОСТ 28147:
si = EKi [hi] i = 1, 2, 3, 4
S = s4 || s3 || s2 || s1
или
S = s1 || s2 || s3 || s4
Наконец на заключительном этапе обработки очередного блока выполняется перемешивание полученной последовательности. 256-битное значение рассматривается как последовательность шестнадцати 16-битных значений. Сдвиг обозначается Ψ и определяется следующим образом:
η16 || η15 ||... || η1 - исходное значение
η1 η2 η3 η4 η13 η16 || η16 ||... || η2 - результирующее значение
Результирующее значение хэш-кода определяется следующим образом:
Χ(M, H) = Ψ61(H Ψ(M Ψ12(S)))
где
H - предыдущее значение хэш-кода,
М - текущий обрабатываемый блок,
Ψi - i-ая степень преобразования Ψ.
Логика выполнения ГОСТ 3411
Входными параметрами алгоритма являются:
· исходное сообщение М произвольной длины;
· стартовый вектор хэширования Н, длина которого равна 256 битам;
|
|
· контрольная сумма Σ, начальное значение которой равно нулю и длина равна 256 битам;
· переменная L, начальное значение которой равно длине сообщения.
Сообщение М делится на блоки длиной 256 бит и обрабатывается справа налево. Очередной блок i обрабатывается следующим образом:
1. H = Χ(Mi, H)
2. Σ = Σ ' Mi
3. L рассматривается как неотрицательное целое число, к этому числу прибавляется 256 и вычисляется остаток от деления получившегося числа на 2256. Результат присваивается L.
Где ' обозначает следующую операцию: Σ и Mi рассматриваются как неотрицательные целые числа длиной 256 бит. Выполняется обычное сложение этих чисел и находится остаток от деления результата сложения на 2256. Этот остаток и является результатом операции.
Самый левый, т.е. самый последний блок М' обрабатывается следующим образом:
1. Блок добавляется слева нулями так, чтобы его длина стала равна 256 битам.
2. Вычисляется Σ = Σ ' Mi.
3. L рассматривается как неотрицательное целое число, к этому числу прибавляется длина исходного сообщения М и находится остаток от деления результата сложения на 2256.
4. Вычисляется Н = Χ(М', Н).
5. Вычисляется Н = Χ(L, Н).
6. Вычисляется Н = Χ(Σ, Н).
Значением функции хэширования является Н.
TIGER
В алгоритме Tiger все вычисления производятся над 64‑разрядными переменными. Изначально используются три 64‑битных регистра (a, b и c) для хранения промежуточного значения хэш-функции. Вначале, эти регистры инициализируются (состояние H0) следующим образом:
a = 0x0123456789ABCDEF
b = 0xFEDCBA9876543210
c = 0xF096A5B4C3B2E187
Каждый 512-битный блок входного сообщения делится на восемь 64-битных блоков x0, x1, x2, …x7 и последующие действия проводятся для того, чтобы изменить состояние регистров (a, b, c) из состояния Hi в Hi+1. Эти действия состоят из трёх этапов, между этапами необходимо проводить процедуру обратимой трансформации входного сообщения (key_schedule). Конечным этапом является процедура (feedforward), в которой значения регистров (a, b, c) объединяются с начальными значениями этих регистров для получения состояния Hi+1.
save_abc
pass(a, b, c, 5) - 1-ый этап
key_schedule
pass(c, a, b, 7) - 2-ой этап
key_schedule
pass(b, c, a, 9) - 3-ий этап
feedforward