MD4

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

MD4 (Message Digest 4) — хеш-функція, розроблена професором Массачусетського університету Рональдом Рівестом в 1990 році, і вперше описана в RFC 1186. Для довільного вхідного повідомлення функція генерує 128-розрядне хеш-значення, зване дайджестом повідомлення. Цей алгоритм використовується в протоколі аутентифікації MS-CHAP, розробленому корпорацією Майкрософт для виконання процедур перевірки автентичності віддалених робочих станцій Windows. Є попередником MD5.

Алгоритм MD4[ред. | ред. код]

Передбачається, що на вхід подано повідомлення, що складається з b біт, хеш якого нам належить обчислити. Тут b  — довільне невід'ємне ціле число; воно може бути нулем, не зобов'язано бути кратним восьми, і може бути як завгодно великим. Запишемо повідомлення побітово, у вигляді:

Нижче наведено 5 кроків, які використовуються для обчислення хешу повідомлення.

Крок 1. Додавання відсутніх бітів.[ред. | ред. код]

Повідомлення розширюється так, щоб його довжина в бітах за модулем 512 дорівнювала 448. Таким чином, в результаті розширення, повідомленням бракує 64 біта до довжини, кратної 512 бітам. Розширення виробляється завжди, навіть якщо повідомлення спочатку має потрібну довжину.

Розширення проводиться таким чином: один біт, що дорівнює 1, додається до повідомлення, а потім додаються біти, рівні 0, до тих пір, поки довжина повідомлення не стане рівною 448 по модулю 512. У підсумку, до повідомлення додається як мінімум 1 біт, і як максимум 512.

Крок 2. Додавання довжини повідомлення.[ред. | ред. код]

64-бітове представлення ~ b ~ (довжини повідомлення перед додаванням набивальних бітів) додається до результату попереднього кроку. У малоймовірному випадку, коли b більше, ніж 264, використовуються тільки 64 молодших біта. Ці біти додаються у вигляді двох 32-бітних слів, і першим додається слово, що містить молодші розряди.

На цьому етапі (після додавання бітів і довжини повідомлення) ми отримуємо повідомлення довжиною кратною 512 бітам. Це еквівалентно тому, що це повідомлення має довжину, кратну 16-ти 32-бітним словами.

Крок 3. Ініціалізація MD-буфера.[ред. | ред. код]

Для обчислення хешу повідомлення використовується буфер, що складається з 4 слів (32-бітних регістрів): (H1, H2, H3, H4). Ці регістри ініціалізуються наступними шістнадцятирозрядними числами:

       word : 67 45 23 01
       word : ЕF СD АВ 89
       word : 98 BA DC FE
       word : 10 32 54 76

Крок 4. Обробка повідомлення блоками по 16 слів.[ред. | ред. код]

Перш за все, оголосимо три порозрядні функції F, G, H, які приймають на вхід три 32-бітні числа:




Також оголосимо константи:

y[0..15]=0
y[16..31]='5A827999'
y[32.. 47]='6ED9EBA1'

z[0..15]=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
z[16..31]=[0,4,8,12,1,5,9,13,2,6,10,14,3,7,11,15]
z[32..47]= [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]

s[0..15]=[3,7,11,19,3,7,11,19,3,7,11,19,3,7,11,19]
s[16..31]=[3,5,9,13,3,5,9,13,3,5,9,13,3,5,9,13]
s[32..47]=[3,9,11,15,3,9,11,15,3,9,11,15,3,9,11, 15]

Потік вхідних даних складається із 16 одночасно загружених слів в масив X. Далі виконуються наступні дії для кожних 16 слів:

(А,В,C,D) = (Н1,Н2,Н3,Н4)
Виконати перший раунд.
Виконати другий раунд.
Виконати третій раунд.
(Н1,Н2,Н3,Н4) = (Н1+А, Н2+В,Н3+С,H4+D)

Самі раунди це наступний ітеративний процес:

//Раунд 1
for(int i=0;i<16;i++){
    t = A + f(B,C,D)+x[z[j]] + y[j].
    (A,B,C,D) = (D,t <<< s[j],B,C)
}

//Раунд 2
for(int i=16;i<32;i++){
    t = A + g(B,C,D)+x[z[j]] + y[j].
    (A,B,C,D) = (D,t <<< s[j],B,C)
}

//Раунд 3
for(int i=32;i<48;i++){
    t = A + h(B,C,D)+x[z[j]] + y[j].
    (A,B,C,D) = (D,t <<< s[j],B,C)
}

Де <<< - циклічний зсув вліво.

Крок 5. Формування хешу.[ред. | ред. код]

Результатом (хеш-функцією) буде конкатенація H1, H2, H3, H4.

Безпека[ред. | ред. код]

Рівень безпеки, закладений у MD4, був розрахований на створення досить стійких гібридних систем електронного цифрового підпису, заснованих на MD4 і криптосистемі з відкритим ключем. Рональд Рівест вважав, що алгоритм хешування MD4 можна використовувати і для систем, які потребують сильної криптостійкості. Але в той же час він відзначав, що MD4 створювався передусім як дуже швидкий алгоритм хешування, тому він може бути поганий в плані криптостійкості. Як показали подальші дослідження, він був правий, і для додатків, де важлива насамперед криптостійкість, став використовуватися алгоритм MD5.

Уразливості[ред. | ред. код]

Уразливості в MD4 були продемонстровані у статті Берта ден Бура та Антона Босселарса в 1991 році. Перша колізія була знайдена Гансом Доббертіном в 1996 році.

Див. також[ред. | ред. код]