Геш-функцію Whirlpool названо на честь Галактики Вир в сузір'ї Гончі Пси — першої галактики зі спостережуваною спіральною структурою.
Модифікації
З моменту створення у 2000 році Whirlpool двічі модифікувалась.
Першу версію, Whirlpool-0, представлено як кандидата в проекті NESSIE (англ.New European Schemes for Signatures, Integrity and Encryption, нові європейські проекти з цифрового підпису, цілісності й шифрування).
Модифікацію Whirlpool-0, названу Whirlpool-T, у 2003 році додано в перелік рекомендованих до використання криптографічних функцій NESSIE [Архівовано 12 серпня 2011 у Wayback Machine.]. Зміни стосувалися блоку підстановки (S-скриня) Whirlpool: у першій версії структуру S-скрині не було описано, і він генерувався довільно, що створювало певні проблеми при апаратній реалізації Whirlpool. У версії Whirlpool-T S-скриня «набула» чіткої структури.
Дефект в дифузних матрицях Whirlpool-T, виявлений Taizo Shirai і Kyoji Shibutani[1], пізніше було виправлено, і кінцеву (третю) версію, названу просто Whirlpool, прийнято ISO в стандарті ISO/IEC 10118-3:2004 [Архівовано 12 липня 2006 у Wayback Machine.] у 2004 році.
Опис
Вступ
У даній статті описується остання (третя) версія Whirlpool. На відміну від першої версії, S-скриню визначено, а дифузну матрицю замінено новою після доповіді Taizo Shirai і Kyoji Shibutani[1].
Whirlpool складається з повторного застосування функції стиснення, основою якої є спеціальний 512-бітний блочний шифр з 512-бітним ключем.
Як було сказано вище, Whirlpool побудовано на спеціальному блочному шифрі , який працює з 512-бітними даними.
У перетвореннях проміжний результат обчислень гешу називається геш-станом або просто станом. При обчисленнях стан зазвичай подається матрицею стану. Для Whirlpool це матриця в . Отже, 512-бітні блоки даних перед подальшими обчисленнями слід перетворити в цей формат. Цього досягають уведенням функції :
Простіше кажучи, заповнення матриці стану даними виконується порядково. При цьому кожен байт матриці являє собою відповідний многочлен в .
Перетворення
Нелінійне перетворення (S-скриня)
Функція складається з паралельного застосування блоку підстановки (S-скрині) до всіх байтів матриці стану:
Блок підстановки описується такою таблицею замін:
Таблиця 1. Блок підстановки
Циклічна перестановка
Перестановка циклічно зсуває кожен стовпець матриці стану так, що стовпець зсувається вниз на позицій:
Завдання даного перетворення — перемішати байти рядків матриці стану між собою.
Лінійна дифузія
Лінійна дифузія — це лінійне перетворення, матрицею якого є MDS-матриця, тобто:
так що
Іншими словами, матриця стану множиться справа на матрицю . Нагадаємо, що операції додавання і множення елементів матриць виконуються в .
MDS-матриця — це така матриця над скінченним полем, щоо якщо взяти її в якості матриці лінійного перетворення з простору в простір , то будь-які два вектори з простору виду будуть мати принаймні відмінностей в компонентах. Тобто набір векторів виду утворює код, що має властивість максимальної рознесеності (англ.Maximum Distance Separable code). Таким кодом є, наприклад, код Ріда-Соломона.
У Whirlpool властивість максимальної рознесеності MDS-матриці означає, що загальна кількість мінливих байтів вектора і вектора не менша ніж . Іншими словами, будь-яке змінення тільки одного байта призводить до змінення всіх 8 байтів . В цьому і полягає завдання лінійної дифузії.
Як уже згадувалося вище, MDS-матрицю в останній (третій) версії Whirlpool було змінено завдяки статті Taizo Shirai і Kyoji Shibutani[1]. Вони проаналізували MDS-матрицю другої версії Whirlpool і вказали на можливість підвищення стійкості Whirlpool до диференціального криптоаналізу. Також вони запропонували 224 кандидати на місце нової MDS-матриці. З цього списку автори Whirlpool вибрали варіант, який найлегше реалізується в апаратному забезпеченні.
Додавання ключа
Функція додавання ключа являє собою побітове додавання (XOR) матриць стану і ключа :
Константи раунду
В кожному раунді використовується матриця констант , така, що:
Звідси видно, що перший рядок матриці є результатом застосування блоку підстановки до байтових чисел .
Решта 7 рядків — нульові.
Функція раунду
Для кожного раунду функція раунду — це складене перетворення , параметром якого є матриця ключа . Описується функція раунду таким чином:
Розширення ключа
Для кожного раунду необхідний 512-бітний ключ шифрування. Для вирішення даної проблеми в багатьох алгоритмах вводиться так звана процедура розширення ключа. У Whirlpool розширення ключа реалізується в такий спосіб:
Таким чином, з відомого ключа створюється необхідна послідовність ключів для кожного раунду блочного шифру.
Блочний шифр
Спеціальний 512-бітовий блочний шифр як параметр використовує 512-бітовий ключ і виконує таку послідовність перетворень:
де ключі породжені описаною вище процедурою розширення ключа. В геш-функції Whirlpool число раундів .
Доповнення вхідного повідомлення
Whirlpool, як і будь-яка інша геш-функція, повинна здійснювати гешування повідомлення довільної довжини. Оскільки внутрішній блок шифрування працює з 512-бітними вхідними повідомленнями, то вихідне повідомлення необхідно розбити на блоки по 512 біт. При цьому останній блок, який містить кінець повідомлення, може виявитися неповним.
Для вирішення даного завдання Whirlpool використовує алгоритм Меркла-Демґарда доповнення вхідного повідомлення. Результатом доповнення повідомлення є повідомлення , довжина якого кратна 512. Нехай — довжина початкового повідомлення. Тоді отримується за декілька кроків:
До кінця повідомлення приписати біт «1».
Приписати бітів «0» так, щоб довжина отриманого рядка була кратна непарне число разів.
Нарешті, приписати 256-бітне подання числа .
Доповнене повідомлення записується у вигляді
і розбивається на 512-бітові блоки для подальшої обробки.
Дайджестом для повідомлення є початкове значення функції стиснення, перетворене назад у 512-бітний рядок:
Криптостійкість
Геш-функція вважається криптографічно стійкою, якщо вона задовольняє трьом основним вимогам, на яких ґрунтується більшість застосувань геш-функцій у криптографії: незворотність, стійкість до колізій першого роду і стійкість до колізій другого роду.
Нехай — довільний -бітний підрядок 512-бітного гешу Whirlpool. Автори Whirlpool стверджують, що створена ними хеш-функція задовольняє таким вимогам криптостійкості:
Генерування колізії потребує порядку обчислень гешу WHIRLPOOL (стійкість до колізій другого роду).
Для заданої пошук такого повідомлення , що , потребує порядку обчислень гешу WHIRLPOOL (необоротність).
Для заданого повідомлення виявлення іншого повідомлення , для якого , потребує порядку обчислень гешу WHIRLPOOL (стійкість до колізій]] першого роду).
Неможливо виявити систематичні кореляції між будь-якою лінійною комбінацією вхідних біт і будь-якою лінійною комбінацією біт гешу або передбачити, які біти гешу змінять своє значення при зміні певних вхідних бітів (стійкість до лінійного криптоаналізу і диференціального криптоаналізу).
До даної заяви автори Whirlpool додали примітку:
Ці твердження випливають зі значного запасу міцності щодо всіх відомих атак. Проте, ми розуміємо, що неможливо робити не спекулятивні твердження щодо невідомих речей.
На нинішній день WHIRLPOOL стійка до всіх видів криптоаналізу. Протягом 8 років існування Whirlpool не було зареєстровано жодної атаки на неї.
Однак у 2009 році було опубліковано новий спосіб атаки на геш-функції — Rebound attack[ru][2][3].
Першими «піддослідними» нової атаки стали геш-функції Whirlpool і Grøstl[ru]. Результати проведеного криптоаналізу наведено в таблиці.
Таблиця 2. Результати криптоаналізу геш-функцій Whirlpool і Grøstl методом Rebound attack[2][3]
Геш-функція
Число раундів
Складність
Потрібний обсяг пам'яті
Тип колізії
Whirlpool
колізія
напіввільна колізія
напіввільна майже колізія
Grøstl-256
напіввільна колізія
Автори дослідження використовували такі поняття і терміни:
— ініціалізаційний вектор
— повідомлення, яке підлягає гешуванню
— геш-функція
функція стиснення
Типи колізій:
колізія:
— фіксований
майже колізія:
— фіксований
невелике число біт гешів і різні
напіввільна колізія:
вільна колізія:
Як видно з таблиці, згенерувати колізію для Whirlpool вдалося лише для її «урізаного» варіанту в 4.5 раунду. До того ж складність необхідних обчислень досить висока.
Застосування
Whirlpool — вільно поширювана геш-функція. Тому вона знаходить широке застосування у відкритому програмному забезпеченні. Тут наведено деякі приклади використання Whirlpool:
Whirlpool-0("The quick brown fox jumps over the lazy dog") =
4F8F5CB531E3D49A61CF417CD133792CCFA501FD8DA53EE368FED20E5FE0248C
3A0B64F98A6533CEE1DA614C3A8DDEC791FF05FEE6D971D57C1348320F4EB42D
Whirlpool-T("The quick brown fox jumps over the lazy dog") =
3CCF8252D8BBB258460D9AA999C06EE38E67CB546CFFCF48E91F700F6FC7C183
AC8CC3D3096DD30A35B01F4620A1E3A20D79CD5168544D9E1B7CDF49970E87F1
Whirlpool("The quick brown fox jumps over the lazy dog") =
B97DE512E91E3828B40D2B0FDCE9CEB3C4A71F9BEA8D88E75C4FA854DF36725F
D2B52EB6544EDCACD6F8BEDDFEA403CB55AE31F03AD62A5EF54E42EE82C3FB35
Навіть невелика зміна вихідного тексту повідомлення (в даному випадку підміняється одна буква: символ «d» замінюється на символ «e») призводить до повної зміни гешу: Whirlpool-0(«The quick brown fox jumps over the lazy eog») =
Whirlpool-T("The quick brown fox jumps over the lazy eog") =
C8C15D2A0E0DE6E6885E8A7D9B8A9139746DA299AD50158F5FA9EECDDEF744F9
1B8B83C617080D77CB4247B1E964C2959C507AB2DB0F1F3BF3E3B299CA00CAE3
Whirlpool("The quick brown fox jumps over the lazy eog") =
C27BA124205F72E6847F3E19834F925CC666D0974167AF915BB462420ED40CC5
0900D85A1F923219D832357750492D5C143011A76988344C2635E69D06F2D38C
Додавання символів у рядок, конкатенація рядків й інші зміни також впливають на результат.