Whirlpool (криптографія)
Whirlpool — криптографічна геш-функція, розроблена Вінсентом Рейменом і Пауло Баррето. Опублікована в листопаді 2000 року. Гешування вхідне повідомлення з довжиною до біт. Вихідне значення геш-функції Whirlpool, називане гешем, становить 512 біт.
Геш-функцію 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-бітним ключем.
В алгоритмі використовуються операції в полі Галуа за модулем незвідного многочлена .
Многочлени для коротко записуються в шістнадцятковому поданні. Наприклад, запис означає .
- Символом позначається оператор композиції[en]. Вираз означає композицію функцій і .
- Для позначення композиції послідовності функцій використовується символ :
- — множина матриць над
- — циркулянтна матриця , перший рядок якої складається з елементів тобто:
- або просто
Як було сказано вище, Whirlpool побудовано на спеціальному блочному шифрі , який працює з 512-бітними даними.
У перетвореннях проміжний результат обчислень гешу називається геш-станом або просто станом. При обчисленнях стан зазвичай подається матрицею стану. Для Whirlpool це матриця в . Отже, 512-бітні блоки даних перед подальшими обчисленнями слід перетворити в цей формат. Цього досягають уведенням функції :
Простіше кажучи, заповнення матриці стану даними виконується порядково. При цьому кожен байт матриці являє собою відповідний многочлен в .
Функція складається з паралельного застосування блоку підстановки (S-скрині) до всіх байтів матриці стану:
Блок підстановки описується такою таблицею замін:
|
||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
||||||||||||||||
|
||||||||||||||||
|
||||||||||||||||
|
||||||||||||||||
|
||||||||||||||||
|
||||||||||||||||
|
||||||||||||||||
|
||||||||||||||||
|
||||||||||||||||
|
||||||||||||||||
|
||||||||||||||||
|
||||||||||||||||
|
||||||||||||||||
|
||||||||||||||||
|
Перестановка циклічно зсуває кожен стовпець матриці стану так, що стовпець зсувається вниз на позицій:
Завдання даного перетворення — перемішати байти рядків матриці стану між собою.
Лінійна дифузія — це лінійне перетворення, матрицею якого є 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-бітові блоки для подальшої обробки.
У Whirlpool застосовується схема гешування Miyaguchi-Preneel.
блоків доповненого повідомлення послідовно шифруються блочним шифром :
де (ініціалізаційний вектор) — 512-бітний рядок, заповнений «0».
Дайджестом для повідомлення є початкове значення функції стиснення, перетворене назад у 512-бітний рядок:
Геш-функція вважається криптографічно стійкою, якщо вона задовольняє трьом основним вимогам, на яких ґрунтується більшість застосувань геш-функцій у криптографії: незворотність, стійкість до колізій першого роду і стійкість до колізій другого роду.
Нехай — довільний -бітний підрядок 512-бітного гешу Whirlpool. Автори Whirlpool стверджують, що створена ними хеш-функція задовольняє таким вимогам криптостійкості:
- Генерування колізії потребує порядку обчислень гешу WHIRLPOOL (стійкість до колізій другого роду).
- Для заданої пошук такого повідомлення , що , потребує порядку обчислень гешу WHIRLPOOL (необоротність).
- Для заданого повідомлення виявлення іншого повідомлення , для якого , потребує порядку обчислень гешу WHIRLPOOL (стійкість до колізій]] першого роду).
- Неможливо виявити систематичні кореляції між будь-якою лінійною комбінацією вхідних біт і будь-якою лінійною комбінацією біт гешу або передбачити, які біти гешу змінять своє значення при зміні певних вхідних бітів (стійкість до лінійного криптоаналізу і диференціального криптоаналізу).
До даної заяви автори Whirlpool додали примітку:
Ці твердження випливають зі значного запасу міцності щодо всіх відомих атак. Проте, ми розуміємо, що неможливо робити не спекулятивні твердження щодо невідомих речей.
На нинішній день WHIRLPOOL стійка до всіх видів криптоаналізу. Протягом 8 років існування Whirlpool не було зареєстровано жодної атаки на неї.
Однак у 2009 році було опубліковано новий спосіб атаки на геш-функції — Rebound attack[ru][2][3]. Першими «піддослідними» нової атаки стали геш-функції Whirlpool і Grøstl[ru]. Результати проведеного криптоаналізу наведено в таблиці.
Геш-функція | Число раундів | Складність | Потрібний обсяг пам'яті | Тип колізії |
---|---|---|---|---|
Whirlpool | колізія | |||
напіввільна колізія | ||||
напіввільна майже колізія | ||||
Grøstl-256 | напіввільна колізія |
Автори дослідження використовували такі поняття і терміни:
- — ініціалізаційний вектор
- — повідомлення, яке підлягає гешуванню
- — геш-функція
- функція стиснення
Типи колізій:
- колізія:
- — фіксований
- майже колізія:
- — фіксований
- невелике число біт гешів і різні
- напіввільна колізія:
- вільна колізія:
Як видно з таблиці, згенерувати колізію для Whirlpool вдалося лише для її «урізаного» варіанту в 4.5 раунду. До того ж складність необхідних обчислень досить висока.
Whirlpool — вільно поширювана геш-функція. Тому вона знаходить широке застосування у відкритому програмному забезпеченні. Тут наведено деякі приклади використання Whirlpool:
- Jacksum — вільно поширювана утиліта для обчислення контрольних сум
- Crypto++[en] — вільно поширювана C++ бібліотека класів криптографічних примітивів
- TrueCrypt — програма для шифрування «на льоту»
- FreeOTFE — вільна безплатна програма з відкритим кодом, призначена для шифрування «на льоту». Випускається для операційних систем Windows і Windows Mobile (FreeOTFE4PDA)
- DarkCrypt — вільно поширювана крипто- і стеганографічна утиліта у вигляді плагіну для Total Commander
Для зручності 512 біт (64 байти) гешу Whirlpool часто подають у вигляді 128-значного шістнадцяткового числа.
Як говорилося вище, алгоритм зазнав дві зміни з моменту випуску в 2000 році. Нижче наведено приклади гешів, обчислених для ASCII-тексту панграми The quick brown fox jumps over the lazy dog для всіх трьох версій 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») =
228FBF76B2A93469D4B25929836A12B7D7F2A0803E43DABA0C7FC38BC11C8F2A 9416BBCF8AB8392EB2AB7BCB565A64AC50C26179164B26084A253CAF2E012676
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
Додавання символів у рядок, конкатенація рядків й інші зміни також впливають на результат.
Приклади гешів для «нульового» рядка:
Whirlpool-0("") = B3E1AB6EAF640A34F784593F2074416ACCD3B8E62C620175FCA0997B1BA23473 39AA0D79E754C308209EA36811DFA40C1C32F1A2B9004725D987D3635165D3C8
Whirlpool-T("") = 470F0409ABAA446E49667D4EBE12A14387CEDBD10DD17B8243CAD550A089DC0F EEA7AA40F6C2AAAB71C6EBD076E43C7CFCA0AD32567897DCB5969861049A0F5A
Whirlpool("") = 19FA61D75522A4669B44E39C1D2E1726C530232130D407F89AFEE0964997F7A7 3E83BE698B288FEBCF88E3E03C4F0757EA8964E59B63D93708B138CC42A66EB3
Середовище виконання | Код | Результат |
---|---|---|
PHP 5.0 | echo hash( 'whirlpool', 'test' ); |
b913d5bbb8e461c2c5961cbe0edcdadfd29f068225ceb37da6defcf89849368f 8c6c2eb6a4c4ac75775d032a0ecfdfe8550573062b653fe92fc7b8fb3b7be8d6 |
Ruby | puts Whirlpool.calc_hex('test') |
b913d5bbb8e461c2c5961cbe0edcdadfd29f068225ceb37da6defcf89849368f 8c6c2eb6a4c4ac75775d032a0ecfdfe8550573062b653fe92fc7b8fb3b7be8d6 |
- ↑ а б в Taizo Shirai, Kyoji Shibutani (2003). On the diffusion matrix employed in the Whirlpool hashing function (PDF) (англ.). Архів оригіналу (PDF) за 29 лютого 2012. Процитовано 16 ноября 2009.
- ↑ а б Florian Mendel, Christian Rechberger, Martin Schläffer, Søren S. Thomsen. (2009). The Rebound Attack: Cryptanalysis of Reduced Whirlpool and Grøstl (PDF) (англ.). Архів оригіналу (PDF) за 28 вересня 2011. Процитовано 27 листопада 2009.
- ↑ а б Florian Mendel, Christian Rechberger, Martin Schläffer, Søren S. Thomsen. (2009). The Rebound Attack: Cryptanalysis of Reduced Whirlpool and Grøstl (англ.). Процитовано 27 листопада 2009.[недоступне посилання з грудня 2019]
- Whirlpool homepage (англ.). Архів оригіналу за 29 лютого 2012. Процитовано 15 листопада 2009.
- Calculate a Whirlpool hash (англ.). Архів оригіналу за 29 лютого 2012. Процитовано 16 листопада 2009.
- The ISO/IEC 10118-3:2004 standard (англ.). Архів оригіналу за 29 лютого 2012. Процитовано 15 листопада 2009.
- NESSIE (англ.). Архів оригіналу за 29 лютого 2012. Процитовано 15 листопада 2009.
- Portfolio of recommended cryptographic primitives (PDF) (англ.). Архів оригіналу (PDF) за 12 серпня 2011. Процитовано 15 листопада 2009.
- A Java implementation of all three revisions of Whirlpool (англ.). Архів оригіналу за 29 лютого 2012. Процитовано 15 листопада 2009.
- A Matlab Implementation of the Whirlpool Hashing Function (англ.). Архів оригіналу за 29 лютого 2012. Процитовано 15 листопада 2009.
- Perl Whirlpool module at CPAN (англ.). Архів оригіналу за 31 липня 2013. Процитовано 5 квітня 2018.
- Ruby Whirlpool library (англ.). Архів оригіналу за 29 лютого 2012. Процитовано 15 листопада 2009.
- Efficient architecture and hardware implementation of the Whirlpool hash function (англ.). Архів оригіналу за 29 лютого 2012. Процитовано 18 листопада 2009.
- High-Speed Parallel Architecture of the Whirlpool Hash Function (PDF) (англ.). Архів оригіналу (PDF) за 29 лютого 2012. Процитовано 18 листопада 2009.