о 0), не обов'язково кратне 8. Для обчислення MD5 хеш-функції необхідно виконати наступні 5 кроків. p align="justify"> Крок 1: вирівнювання потоку.
Вхідний потік вирівнюється так, що б його довжина стала конгруентної (порівнянної) з 448 по модулю 512. Вирівнювання відбувається наступним чином: до потоку додається один біт '1 ', а потім біти '0' до тих пір, поки довжина потоку не буде порівнянна з 448 по модулю 512. Вирівнювання відбувається завжди, навіть якщо довжина потоку була вже порівнянна з 448 по модулю 512. Таким чином до потоку додається мінімум 1 біт, максимум - 512. p align="justify"> Крок 2: додавання довжини.
бітове представлення довжини вхідного потоку (довжини потоку до вирівнюється) додається до результату предидущего кроки. Якщо довжина потоку перевершує 2 ^ 64, то додаються молодші 64 біт. Ці біти додаються як 2 32-бітних слова, молодше слово додається першим. Таким чином на цьому кроці довжина потоку стає кратною 512 бітам або 16 32-бітним словами. Далі будемо розглядати вхідний потік як масив M [0 ... N-1] слів довжиною N.
Крок 3: ініціалізація MD буфера.
Буфер з 4 слів {A, B, C, D} використовується для обчислення хеш функції, який ініціалізується в наступні значення:
A = 0x67452301 = 0xEFCDAB89 = 0x98BADCFE = 0x10325476
Визначимо чотири допоміжні функції, кожна з яких бере три параметри розмірів в слово і виробляє результат - слово.
(x, y, z) = (x & y) | (~ x & z) (x, y, z) = (x & z) | (y & ~ z)
H (x, y, z) = x ^ y ^ z (x, y, z) = y ^ (x | ~ z)
Нагадаємо, що & - побітовое І, | - побітовое АБО, ^ - побітовое виключає АБО, ~ - побітовое заперечення. Функція F для кожного біта дає наступний результат: якщо X, то Y, інакше Z.
На цьому кроці також використовується таблиця T [1 .. 64], яка побудована за допомогою функції синуса:
T = int (4294967296 * abs (sin (i))), де int () - ціла частина. Наприклад:
T [1] = int (4294967296 * abs (sin (i))) = int (3614090360,282 ...) = 3614090360.
Також слід визначити операцію x <<
Код
// обробити вхідний потік блоками по 16 слів
for i = 0 to N/16 - 1 do
{
// копіювати блок i в Xj = 0 to 15 do [j] = M [i * 16 + j]
// Зберегти значення A, B, C, D
AA = A = B = C = D
// прохід 1
// нехай [abcd ksi] позначає операцію
// a = b + ((a + F (b, c, d) + X [k] + T ) <<
//...