Алгоритм md5
На вхід алгоритму надходить вхідний потік даних, хеш якого необхідно знайти. Довжина повідомлення може бути будь-який (в тому числі нульовою). Запишемо довжину повідомлення в L. Це число ціле і невід’ємне. Кратність будь-яким числам не обов'язкова. Після надходження даних йде процес підготовки потоку до обчислень[5].
Далі представлений алгоритм вираховування хеша.
Нижче наведено алгоритм обчислення хешу.
1. Вирівнювання потоку.
Кінець вихідного повідомлення, довжиною L, дописують одиничний біт, потім необхідне число нульових біт так, щоб новий розмір L 'був порівнянний з 448 по модулю 512 (L' mod 512 = 448). Додавання нульових біт виконується, навіть якщо нова довжина, включаючи одиничний біт, вже можна порівняти з 448[6].
2. Додавання довжини повідомлення.
До модифікованого повідомленням дописують 64-бітове представлення довжини даних (кількість біт в повідомленні). Тобто довжина повідомлення T стає кратною 512 (T mod 512 = 0). Якщо довжина вихідного повідомлення перевищує 264 - 1 , то дописують тільки молодші 64 біта. Крім цього, для зазначеного 64-бітного представлення довжини спочатку записуються молодші 32 біта, а потім старші 32 біта[7].
3. Ініціалізація буфера.
Для обчислень ініціалізуются 4 змінних розміром по 32 біта і задаються початкові значення (шістнадцятирічне подання):
A = 67 45 23 01;
B = EF CD AB 89;
C = 98 BA DC FE;
D = 10 32 54 76.
У цих змінних будуть зберігатися результати проміжних обчислень. Початковий стан ABCD називається ініціалізованим вектором[8].
4. Обчислення хешу в циклі.
Оригінал тексту розбивається на блоки T, довжиною 512 біт. Для кожного блоку в циклі виконується процедура, наведена на рис.2. Результат обробки всіх блоків вихідного повідомлення в вигляді об'єднання 32-бітних значень змінних ABCD і буде хешем.
Рис.2.1.1 Шаг основного розрахункового циклу
У кожному раунді над змінними ABCD і блоком вихідного тексту Т в циклі (16 ітерацій) виконуються однотипні перетворення за такою схемою.
Рис.2.1.2. Одна ітерація циклу раунду
Умовні позначення.
RF - раундова функція, яка визначається за наступною таблицею.
Таблиця 2.1.1.
Раундові функції RF
-
№ раунду
Позначення функції
Формула розрахунку
1
F
F(B, C, D) = (B ∧ C) ∨ (¬B ∧ D)
2
G
G(B, C, D) = (B ∧ D) ∨ (¬D ∧ C)
3
H
H(B, C, D) = B ⊕ C ⊕ D
4
I
I(B, C, D) = C ⊕ (¬D ∨ B)
2) tj - j-а 32-бітова частина блоку вихідного повідомлення Т зі зворотним порядком проходження байт;
3) ki - ціла частина константи, яка визначається за формулою
ki = 232 * | sin(i + 16 * (r - 1)) |,
де i - номер ітерації циклу (i = 1..16);
r - номер раунду (r = 1..4).
Аргумент функції sin вимірюється в радіанах.
4) ⊞ - додавання за модулем 232.
5) <<< si – циклічний зсув вліво на si розрядів.
Використовувана 32-бітова частина блоку вихідного повідомлення tj і величина циклічного сдвигу вліво si залежать ві номеру ітерації та приведені в таблиці 2.1.2.
Після 4 раундів нове (модифіковане) значення кожної з змінних ABCD складається (⊞) з вихідним (значенням змінної до 1-го раунду)[9].
5. Перестановка байт в змінних ABCD. Після обробки всіх блоків вихідного повідомлення для кожної змінної виконується зворотна перестановка байт, і в результаті ми отримаємо наш MD5 хеш[10].
Таблиця 2.1.2.
Величини, що використовуються на етапі циклу раунду
№ Ітерації |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
|
Раунд 1 |
tj |
t1 |
t2 |
t3 |
t4 |
t5 |
t6 |
t7 |
t8 |
t9 |
t10 |
t11 |
t12 |
t13 |
t14 |
t15 |
t16 |
sj |
7 |
12 |
17 |
22 |
7 |
12 |
17 |
22 |
7 |
12 |
17 |
22 |
7 |
12 |
17 |
22 |
|
Раунд 2 |
tj |
t2 |
t7 |
t12 |
t1 |
t6 |
t11 |
t16 |
t5 |
t10 |
t15 |
t4 |
t9 |
t14 |
t3 |
t8 |
t13 |
sj |
5 |
9 |
14 |
20 |
5 |
9 |
14 |
20 |
5 |
9 |
14 |
20 |
5 |
9 |
14 |
20 |
|
Раунд 3 |
tj |
t6 |
t9 |
t12 |
t15 |
t2 |
t5 |
t8 |
t11 |
t14 |
t1 |
t4 |
t7 |
t10 |
t13 |
t16 |
t3 |
sj |
4 |
11 |
16 |
23 |
4 |
11 |
16 |
23 |
4 |
11 |
16 |
23 |
4 |
11 |
16 |
23 |
|
Раунд 4 |
tj |
t1 |
t8 |
t15 |
t6 |
t16 |
t4 |
t11 |
t2 |
t9 |
t13 |
t7 |
t14 |
t5 |
t12 |
t3 |
t10 |
sj |
6 |
10 |
15 |
21 |
6 |
10 |
15 |
21 |
6 |
10 |
15 |
21 |
6 |
10 |
15 |
21 |
|
