Whirlpool (криптографія)

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

Whirlpool — криптографічна геш-функція, розроблена Вінсентом Рейменом і Пауло Баррето. Опублікована в листопаді 2000 року. Гешування вхідне повідомлення з довжиною до 2256 біт. Вихідне значення геш-функції Whirlpool, називане гешем, становить 512 біт.

Назва

Галактика Вир, на честь якої названо геш-функцію.

Геш-функцію Whirlpool названо на честь Галактики Вир в сузір'ї Гончі Пси — першої галактики зі спостережуваною спіральною структурою.

Модифікації

З моменту створення у 2000 році Whirlpool двічі модифікувалась.

Першу версію, Whirlpool-0, представлено як кандидата в проекті NESSIE (Шаблон:Lang-en, нові європейські проекти з цифрового підпису, цілісності й шифрування).

Модифікацію Whirlpool-0, названу Whirlpool-T, у 2003 році додано в перелік рекомендованих до використання криптографічних функцій NESSIE Шаблон:Webarchive. Зміни стосувалися блоку підстановки (S-скриня) Whirlpool: у першій версії структуру S-скрині не було описано, і він генерувався довільно, що створювало певні проблеми при апаратній реалізації Whirlpool. У версії Whirlpool-T S-скриня «набула» чіткої структури.

Дефект в дифузних матрицях Whirlpool-T, виявлений Taizo Shirai і Kyoji Shibutani[1], пізніше було виправлено, і кінцеву (третю) версію, названу просто Whirlpool, прийнято ISO в стандарті ISO/IEC 10118-3:2004 Шаблон:Webarchive у 2004 році.

Опис

Вступ

У даній статті описується остання (третя) версія Whirlpool. На відміну від першої версії, S-скриню визначено, а дифузну матрицю замінено новою після доповіді Taizo Shirai і Kyoji Shibutani[1].

Whirlpool складається з повторного застосування функції стиснення, основою якої є спеціальний 512-бітний блочний шифр W з 512-бітним ключем.

Використовувані позначення та операції

В алгоритмі використовуються операції в полі Галуа  GF(28) за модулем незвідного многочлена  p8(x)=x8+x4+x3+x2+1.

Многочлени для коротко записуються в шістнадцятковому поданні. Наприклад, запис  11Dx означає  p8(x).

Для позначення композиції послідовності функцій fm,fm+1,...,fn1,fn,mn використовується символ mr=n:
mr=nfrfnfn1fm+1fm.
  • Mm×n[GF(28)] — множина матриць m×n над  GF(28).
cir(a0,a1,...,am1)[a0a1am1am1a0am2a1a2a0],
або просто  cir(a0,a1,...,am1)=ccij=a(ji)modm,0i,jm1.

Формат даних

Як було сказано вище, Whirlpool побудовано на спеціальному блочному шифрі W, який працює з 512-бітними даними.

У перетвореннях проміжний результат обчислень гешу називається геш-станом або просто станом. При обчисленнях стан зазвичай подається матрицею стану. Для Whirlpool це матриця в M8×8[GF(28)]. Отже, 512-бітні блоки даних перед подальшими обчисленнями слід перетворити в цей формат. Цього досягають уведенням функції  μ:

μ:GF(28)64M8×8[GF(28)],μ(a)=bbij=a8i+j,0i,j7.

Простіше кажучи, заповнення матриці стану даними виконується порядково. При цьому кожен байт матриці являє собою відповідний многочлен в  GF(28).

Перетворення

Нелінійне перетворення γ (S-скриня)

Функція γ:M8×8[GF(28)]M8×8[GF(28)] складається з паралельного застосування блоку підстановки (S-скрині) S:GF(28)GF(28),xS[x] до всіх байтів матриці стану:

γ(a)=bbij=S[aij],0i,j7.

Блок підстановки описується такою таблицею замін:

Таблиця 1. Блок підстановки
00x 01x 02x 03x 04x 05x 06x 07x 08x 09x 0Ax 0Bx 0cx 0dx 0Ex 0Fx

00x

18x 23x c6x E8x 87x B8x 01x 4Fx 36x A6x d2x F5x 79x 6Fx 91x 52x

10x

60x Bcx 9Bx 8Ex A3x 0cx 7Bx 35x 1dx E0x d7x c2x 2Ex 4Bx FEx 57x

20x

15x 77x 37x E5x 9Fx F0x 4Ax dAx 58x c9x 29x 0Ax B1x A0x 6Bx 85x

30x

Bdx 5dx 10x F4x cBx 3Ex 05x 67x E4x 27x 41x 8Bx A7x 7dx 95x d8x

40x

FBx EEx 7cx 66x ddx 17x 47x 9Ex cAx 2dx BFx 07x Adx 5Ax 83x 33x

50x

63x 02x AAx 71x c8x 19x 49x d9x F2x E3x 5Bx 88x 9Ax 26x 32x B0x

60x

E9x 0Fx d5x 80x BEx cdx 34x 48x FFx 7Ax 90x 5Fx 20x 68x 1Ax AEx

70x

B4x 54x 93x 22x 64x F1x 73x 12x 40x 08x c3x Ecx dBx A1x 8dx 3dx

80x

97x 00x cFx 2Bx 76x 82x d6x 1Bx B5x AFx 6Ax 50x 45x F3x 30x EFx

90x

3Fx 55x A2x EAx 65x BAx 2Fx c0x dEx 1cx Fdx 4dx 92x 75x 06x 8Ax

A0x

B2x E6x 0Ex 1Fx 62x d4x A8x 96x F9x c5x 25x 59x 84x 72x 39x 4cx

B0x

5Ex 78x 38x 8cx d1x A5x E2x 61x B3x 21x 9cx 1Ex 43x c7x Fcx 04x

c0x

51x 99x 6dx 0dx FAx dFx 7Ex 24x 3Bx ABx cEx 11x 8Fx 4Ex B7x EBx

d0x

3cx 81x 94x F7x B9x 13x 2cx d3x E7x 6Ex c4x 03x 56x 44x 7Fx A9x

E0x

2Ax BBx c1x 53x dcx 0Bx 9dx 6cx 31x 74x F6x 46x Acx 89x 14x E1x

F0x

16x 3Ax 69x 09x 70x B6x d0x Edx ccx 42x 98x A4x 28x 5cx F8x 86x

Циклічна перестановка π

Перестановка π:M8×8[GF(28)]M8×8[GF(28)] циклічно зсуває кожен стовпець матриці стану так, що стовпець j зсувається вниз на j позицій:

π(a)=bbij=a(ij)mod8,j,0i,j7.

Завдання даного перетворення — перемішати байти рядків матриці стану між собою.

Лінійна дифузія θ

Лінійна дифузія θ:M8×8[GF(28)]M8×8[GF(28)] — це лінійне перетворення, матрицею якого є MDS-матриця  C=cir(01x,01x,04x,01x,08x,05x,02x,09x), тобто:

C=cir(01x,01x,04x,01x,08x,05x,02x,09x)=[01x01x04x01x08x05x02x09x09x01x01x04x01x08x05x02x02x09x01x01x04x01x08x05x05x02x09x01x01x04x01x08x08x05x02x09x01x01x04x01x01x08x05x02x09x01x01x04x04x01x08x05x02x09x01x01x01x04x01x08x05x02x09x01x],
так що
θ(a)=bb=aC.

Іншими словами, матриця стану множиться справа на матрицю  C. Нагадаємо, що операції додавання і множення елементів матриць виконуються в  GF(28).

MDS-матриця — це така матриця над скінченним полем  K, що якщо взяти її в якості матриці лінійного перетворення  f(x)=(MDS)x з простору  Kn в простір  Km, то будь-які два вектори з простору  Kn+m виду  (x,f(x)) будуть мати принаймні  m+1 відмінностей в компонентах. Тобто набір векторів виду  (x,f(x)) утворює код, що має властивість максимальної рознесеності (Шаблон:Lang-en). Таким кодом є, наприклад, код Ріда-Соломона.

У Whirlpool властивість максимальної рознесеності MDS-матриці означає, що загальна кількість мінливих байтів вектора  x і вектора  f(x)=(MDS)x не менша ніж  8+1=9. Іншими словами, будь-яке змінення тільки одного байта  x призводить до змінення всіх 8 байтів  f(x). В цьому і полягає завдання лінійної дифузії.

Як уже згадувалося вище, MDS-матрицю в останній (третій) версії Whirlpool було змінено завдяки статті Taizo Shirai і Kyoji Shibutani[1]. Вони проаналізували MDS-матрицю другої версії Whirlpool і вказали на можливість підвищення стійкості Whirlpool до диференціального криптоаналізу. Також вони запропонували 224 кандидати на місце нової MDS-матриці. З цього списку автори Whirlpool вибрали варіант, який найлегше реалізується в апаратному забезпеченні.

Додавання ключа σ[k]

Функція додавання ключа σ[k]:M8×8[GF(28)]M8×8[GF(28)] являє собою побітове додавання (XOR) матриць стану  a і ключа kM8×8[GF(28)]:

σ[k](a)=bbi,j=ai,jki,j,0i,j7.

Константи раунду cr

В кожному раунді  r,r>0 використовується матриця констант crM8×8[GF(28)], така, що:

c0jrS[8(r1)+j],0j7,
cijr0,1i7,0j7.

Звідси видно, що перший рядок матриці cr є результатом застосування блоку підстановки S до байтових чисел [8(r1)+j],0j7.

Решта 7 рядків — нульові.

Функція раунду ρ[k]

Для кожного раунду  r функція раунду — це складене перетворення ρ[k]:M8×8[GF(28)]M8×8[GF(28)], параметром k якого є матриця ключа kM8×8[GF(28)]. Описується функція раунду таким чином:

ρ[k]σ[k]θπγ.

Розширення ключа

Для кожного раунду  r,0rR необхідний 512-бітний ключ шифрування. Для вирішення даної проблеми в багатьох алгоритмах вводиться так звана процедура розширення ключа. У Whirlpool розширення ключа реалізується в такий спосіб:

 K0=K,
 Kr=ρ[cr](Kr1),r>0.

Таким чином, з відомого ключа K створюється необхідна послідовність K0,...,KR ключів для кожного раунду блочного шифру W.

Блочний шифр W

Спеціальний 512-бітовий блочний шифр W[K]:M8×8[GF(28)]M8×8[GF(28)] як параметр використовує 512-бітовий ключ K і виконує таку послідовність перетворень:

W[K]=(1r=Rρ[Kr])σ[K0],

де ключі K0,...,KR породжені описаною вище процедурою розширення ключа. В геш-функції Whirlpool число раундів R=10.

Доповнення вхідного повідомлення

Whirlpool, як і будь-яка інша геш-функція, повинна здійснювати гешування повідомлення довільної довжини. Оскільки внутрішній блок шифрування W працює з 512-бітними вхідними повідомленнями, то вихідне повідомлення необхідно розбити на блоки по 512 біт. При цьому останній блок, який містить кінець повідомлення, може виявитися неповним.

Для вирішення даного завдання Whirlpool використовує алгоритм Меркла-Демґарда доповнення вхідного повідомлення. Результатом доповнення повідомлення M є повідомлення M, довжина якого кратна 512. Нехай L — довжина початкового повідомлення. Тоді M отримується за декілька кроків:

  1. До кінця повідомлення M приписати біт «1».
  2. Приписати x бітів «0» так, щоб довжина отриманого рядка L+1+x була кратна 256 непарне число разів.
  3. Нарешті, приписати 256-бітне подання числа L.

Доповнене повідомлення M записується у вигляді

M=ML100xL256

і розбивається на 512-бітові блоки для подальшої обробки.

Функція стиснення

Функція стиснення Whirlpool

У Whirlpool застосовується схема гешування Miyaguchi-Preneel.

 t блоків mi,1it доповненого повідомлення M послідовно шифруються блочним шифром W:

 ηi=μ(mi),
 H0=μ(IV),
Hi=W[Hi1](ηi)Hi1ηi,1it,

де IV (ініціалізаційний вектор) — 512-бітний рядок, заповнений «0».

Обчислення гешу

Дайджестом для повідомлення M є початкове значення Ht функції стиснення, перетворене назад у 512-бітний рядок:

Whirlpool(M)μ1(Ht).

Криптостійкість

Геш-функція H вважається криптографічно стійкою, якщо вона задовольняє трьом основним вимогам, на яких ґрунтується більшість застосувань геш-функцій у криптографії: незворотність, стійкість до колізій першого роду і стійкість до колізій другого роду.

Нехай hn — довільний n-бітний підрядок 512-бітного гешу Whirlpool. Автори Whirlpool стверджують, що створена ними хеш-функція задовольняє таким вимогам криптостійкості:

  • Генерування колізії потребує порядку 2n/2 обчислень гешу WHIRLPOOL (стійкість до колізій другого роду).
  • Для заданої hn пошук такого повідомлення M, що H(M)=hn, потребує порядку 2n обчислень гешу WHIRLPOOL (необоротність).
  • Для заданого повідомлення M виявлення іншого повідомлення N, для якого H(N)=H(M), потребує порядку 2n обчислень гешу WHIRLPOOL (стійкість до колізій]] першого роду).
  • Неможливо виявити систематичні кореляції між будь-якою лінійною комбінацією вхідних біт і будь-якою лінійною комбінацією біт гешу або передбачити, які біти гешу змінять своє значення при зміні певних вхідних бітів (стійкість до лінійного криптоаналізу і диференціального криптоаналізу).

До даної заяви автори Whirlpool додали примітку:

Ці твердження випливають зі значного запасу міцності щодо всіх відомих атак. Проте, ми розуміємо, що неможливо робити не спекулятивні твердження щодо невідомих речей.

На нинішній день WHIRLPOOL стійка до всіх видів криптоаналізу. Протягом 8 років існування Whirlpool не було зареєстровано жодної атаки на неї.

Однак у 2009 році було опубліковано новий спосіб атаки на геш-функції — Шаблон:Нп[2][3]. Першими «піддослідними» нової атаки стали геш-функції Whirlpool і Шаблон:Нп. Результати проведеного криптоаналізу наведено в таблиці.

Таблиця 2. Результати криптоаналізу геш-функцій Whirlpool і Grøstl методом Rebound attack[2][3]
Геш-функція Число раундів Складність Потрібний обсяг пам'яті Тип колізії
Whirlpool 4.5/10 2120 216 колізія
5.5/10 2120 216 напіввільна колізія
7.5/10 2128 216 напіввільна майже колізія
Grøstl-256 6/10 2120 270 напіввільна колізія

Автори дослідження використовували такі поняття і терміни:

  •  IV — ініціалізаційний вектор
  •  M — повідомлення, яке підлягає гешуванню
  •  h(M,IV) — геш-функція
  • функція стиснення  f:Ht=f(Mt,Ht1),H0=IV

Типи колізій:

  • колізія:
    •  IV — фіксований
    • f(Mt,IV)=f(Mt,IV),MtMt
  • майже колізія:
    •  IV — фіксований
    • fMt=f(Mt,IV),fMt=f(Mt,IV),MtMt
    • невелике число біт гешів fMt і fMt різні
  • напіввільна колізія:
    • f(Mt,Ht1)=f(Mt,Ht1),MtMt
  • вільна колізія:
    • f(Mt,Ht1)=f(Mt,Ht1),MtMt1,HtHt1

Як видно з таблиці, згенерувати колізію для Whirlpool вдалося лише для її «урізаного» варіанту в 4.5 раунду. До того ж складність необхідних обчислень досить висока.

Застосування

Whirlpool — вільно поширювана геш-функція. Тому вона знаходить широке застосування у відкритому програмному забезпеченні. Тут наведено деякі приклади використання Whirlpool:

Приклади гешів

Для зручності 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

Примітки

Шаблон:Примітки

Посилання

Стандарти

Програмні реалізації

Апаратні реалізації

Шаблон:Геш-функції та коди аутентифікації повідомленняШаблон:Стандарти ISO