9.3 Обчислення крокової функції стиску
Геш-функція
побудована на ітеративній процедурі.
Повідомлення
обробляється блоками у 256 бітів, справа
наліво. Останній короткий блок розширюється
вліво нулями. На обробку блока витрачається
одна ітерація (крок) процедури.
На кожній
ітерації використовуються значення
крокової функції
:
,
що відображає пари блоків довжини по
256 бітів у блок довжини 256. Аргументи
функції
формуються у процесі ітерацій, зокрема,
-
черговий блок повідомлення
,
-
проміжне значення геш-коду.
Крокова
функція використовує складні перетворення,
одним з которих є шифрування
за схемою ГОСТ 28147-89 проміжних результатів
в режимі простої заміни на несекретних
ключах, залежних від повідомлення і
стартового вектора. Таким чином,
обчислення геш–функції безпосередньо
пов’язано
з алгоритмом ГОСТ 28147-89.
Обчислення крокової функції складається з трьох етапів:
- генерація
4-х сеансових ключів
для ГОСТ 28147-89;
-
шифрперетворення - шифрування чотирьох
підслів блоку
,
по 64 біти кожний, на відповіднх ключах,
що сгенеровані у попередньому кроці;
-
перемішуюче перетворення - модифікація
результатів шифрування за допомогою
функції на основі регистру зсуву. за
результатами шифрування здійснюється
обчислення проміжного геш-коду
.
При обчисленні геш-коду всього повідомлення результати ітерацій пов’язуються у складний спосіб.
9.3.1 Генерація ключів
Нехай
- двійковий блок довжини 256.
Будемо
розглядати блок
у різний спосіб:
а) як послідовність чотирьох блоків по 64 біти кожний, тобто,
;
б) як послідовність 16 блоків по 16 бітів кожний, тобто,
;
в) як послідовність 32 блоків (байтів) по 8 бітів кожний,
тобто
.
Введемо
операції
і
, що перетворюють блок у блок.
,
тобто зсунути блок ціклічно на один
підблок вправо, а потім перший підблок
результату замінити на суму крайніх
підблоків результату зсуву.
Перетворення
є перестановкою байтів блоку:
.
,
де
,
,
.
У табличному виді це перетворення надано у табл. 9.1.
Таблиця
9.1 Підстановка байтів
![]()
|
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
|
1 |
9 |
17 |
25 |
2 |
10 |
18 |
26 |
3 |
11 |
19 |
27 |
4 |
12 |
20 |
28 |
|
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
|
5 |
13 |
21 |
29 |
6 |
14 |
18 |
22 |
7 |
15 |
23 |
31 |
8 |
16 |
24 |
32 |
Процедура
генерації ключів
використовує два аргументи – слова
та три константи
.
Всі ці дані є блоками довжини 256 бітів.
Константи
записуються у скороченому вигляді,
наприклад,
,
що означає
і т.і.
,
.
Обчислення
ключів
реалізується за наступним алгоритмом.
1.
Присвоїти значення змінним:
.
2.
Обчислити
,
.
3.
Присвоїти
(
матиме значення
).
4. Якщо
,
перейти на крок 7, інакше, на крок 5.
5. На
цьому кроці
може приймати значення
.
Виконати обчислення ключів
:
,
,
,
.
6. Перейти на крок 3.
7. Кінець роботи алгоритма.
Кінець першого етапу.
