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. Кінець роботи алгоритма.
Кінець першого етапу.