Это старая версия (1.68) КриптографическаяХэшФункцияWhirlpool.

Содержание

Криптогафическая хэш-функция Whirlpool

Whirlpool
криптографическая хэш-функция, разработанная Винсентом Риджменом (Vincent Rijmen) и Пауло Баретто (Paolo Barreto). Впервые опубликована в ноябре 2000 года. Осуществляет хэширование входного сообщения с длиной до 2 sup {256} бит. Ообрена европейской организацией NESSIE (New European Schemes for Signature, Integrity and Encryption - Новые европейские схемы подписей, целостности и шифрования)

Whirlpool использует структуру Меркля-Дамгарда и одностороннюю функцию сжатия Миагучи-Пренеля для формирования 512-блока зашифрованого текста W. Поскольку внутренний блок шифрования W работает с 512-битными входными сообщениями, то исходное сообщение необходимо разбить на блоки по 512 бит. При этом последний блок, который содержит конец сообщения, может оказаться неполным.

Для решения данной проблемы в Whirlpool используется дополнение входного сообщения. Результатом дополнения сообщения M является сообщение M  prime, длина которого кратна 512 бит. Пусть L — длина исходного сообщения. Для того, чтобы получить M  prime, необходимо сделать 3 операции:

  1. К концу сообщения M приписать бит «1» ;
  2. Приписать x битов «0» так, чтобы длина полученной строки L+1+x была кратна 256 нечетное число раз;
  3. Приписать 256-битное представление числа L.

Полученная строка разбивается на 512-битовые блоки M sub 1, M sub 2, M sub t, которые используются для генерации последовательности хэш-значений H sub 1, H sub 2, H sub t (H sub 0 - строка из 512 «0» бит). Для вычисления H sub i, W шифрует M sub i, используя в качестве ключа H sub {i-1}, и выполняет XOR между H sub {i-1} и M sub i. Значением хэш-функции является H sub t.

Раунды

Шифр Whirlpool использует 10 раундов. Размер блока и размер ключа - 512 бит. Ключом для i раунда является K sub i.

Функция раунда

512 бит входного блока группируются в 64 байта a sub 0 .. a sub 63. Затем эти байты записываются

в матрицу размером 8 * 8: 
left | 
 matrix {
  ccol {a sub 0 above a sub 1 above a sub 2 above a sub 3 above a sub 4 above a sub 5 above a sub 6 above a sub 7} 
  ccol {a sub 8 above a sub 9 above a sub 10 above a sub 11 above a sub 12 above a sub 13 above a sub 14 above a sub 15}  
  ccol {a sub 16 above a sub 17 above a sub 18 above a sub 19 above a sub 20 above a sub 21 above a sub 22 above a sub 23}  
  ccol {a sub 24 above a sub 25 above a sub 26 above a sub 27 above a sub 28 above a sub 29 above a sub 30 above a sub 31} 
 ccol {a sub 32 above a sub 33 above a sub 34 above a sub 35 above a sub 36 above a sub 37 above a sub 38 above a sub 39} 
 ccol {a sub 40 above a sub 41 above a sub 42 above a sub 43 above a sub 44 above a sub 45 above a sub 46 above a sub 47} 
 ccol {a sub 48 above a sub 49 above a sub 50 above a sub 51 above a sub 52 above a sub 53 above a sub 54 above a sub 55} 
ccol {a sub 56 above a sub 57 above a sub 58 above a sub 59 above a sub 60 above a sub 61 above a sub 62 above a sub 63} 
 } 
right | .

В дальнейшем нам придется работать в конечном поле GF(2 sup 8 ). Элементы GF(2 sup 8 ) это байты, они могут складываться с помощью операции XOR. Модель конечного поля GF(2 sup 8 ) зависит от выбора неприводимого многочлена степени 8. Для Whirlpool этим многочленом является  X sup 8 + X sup 4 + X sup 3 + X sup 2 + 1.

Процедуры, входящие в функцию раунда:

  1. сдвиг столбцов матрицы состояния на различную величину (ShiftColumns?);
  2. перемешивание данных каждого столбца матрицы состояния (SubBytes?);
  3. умножение каждого столбец матрицы состояния на матрицу констант в GF(2 sup 8 )(MixRows?);
  4. сложение ключа раунда с матрицей состояния (AddRoundKey?).

ShiftColumns?

Процедура ShiftColumns? обеспечивает сдвиг столбцов матрицы состояния на различную величину. Столбец j сдвигается на j байт (Столбец 0 не изменяется, столбец 7 сдвигается на 7 байт.) В результате в матрице состояния записаны новые 8 байт.

SubBytes?

Процедура SubBytes? обеспечивает перемешивание данных каждого столбца матрицы состояния. Байт представляют в виде двух шестнадцатеричных цифр. Левая цифра определяет строку, а правая - столбец таблицы подстановки. Две шестнадцатеричных цифры в пересечении строки и столбца определяют новый байт.

Ниже приведена таблица подстановки (S-блок) для преобразования байтов. Например, два байта, 5A sub 16 и 5B sub 16, которые отличаются только одним битом, преобразованы к 5B sub 16 и 88 sub 16, которые отличаются пятью битами.

Таблица может быть вычислена алгебраически, используя поле GF(2 sup 4 ) с неприводимым полиномом (x sup 4 + x + 1). E - миниблоки вычисляют степень, равную шестнадцатеричному значению входа; R - миниблок использует псевдослучайный генератор чисел.

Каждая шестнадцатеричная цифра в байте передается миниблок ( E и E sup -1 ).

Результаты блока E и E sup -1 складываются с помощью XOR, и передаются на миниблок R.

Чтобы получить старшие 4 бита результата, выполняется XOR между выходами миниблоков E и R.

Чтобы получить младшие 4 бита результата, выполняется XOR между выходами миниблоков E sup -1 и R.

MixRows?

Преобразование MixRows? - матричное преобразование, где байты интерпретируются полиномы с коэффициентами в GF(2 sup 8 ). Каждый столбец матрицы состояния умножается на матрицу констант С

Операции умножения на матрицу констант в GF(2 sup 8 ) выполняются с использованием полинома  X sup 8 + X sup 4 + X sup 3 + X sup 2 + 1.

AddRoundKey?

В преобразовании AddRoundKey? байт матрицы состояния складывается в поле GF(2 sup 8 ) с соответствующим байтом матрицы состояний ключей раунда. Результат - новый байт в новой матрице состояний.

Константы раунда

Каждая константа раунда RC sup r является матрицей 8 x 8, где только первая строка имеет значения, отличные от нуля. Остальная часть входов содержит все нули. Значения для первой строки в каждой матрице констант могут быть вычислены, используя преобразование SubBytes?. Другими словами, RC sup 1 использует первые восемь входов в таблице преобразования SubBytes?; RC sup 2 использует вторые восемь входов, и т. д. Ниже показан пример RC sup 3, где первая строка - третьи восемь входов в таблице SubBytes?.

Расширение ключа

Для каждого раунда r , 0<= r <= 10 необходим 512-битный ключ шифрования. Для решения данной проблемы во многих алгоритмах вводится так называемая процедура расширения ключа. В Whirlpool расширение ключа реализуется следующим образом:

K sup 0 = K

K sup r = p\[RC sup r \] * K sup {r - 1}, r >= 0

где K sup r - ключ раунда, RC sup r - константа раунда, а p\[\] - функция раунда;

Таким образом, из известного ключа K производится необходимая последовательность K sup 0 ...,K sup 10 ключей для каждого раунда блочного шифра W.

Анализ

Хотя Whirlpool не был всесторонне изучен или проверен, он базируется на устойчивой схеме Миагучи-Пренеля - (Miyaguchi-Preneel), а для функции сжатия использует шифр, который основан на AES. Кроме того, размер дайджеста сообщения тот же, что и в SHA-512. Поэтому, как ожидается, Whirlpool будет очень сильной функцией криптографического хэширования. Однако необходимы серьезные испытания и исследования, чтобы подтвердить это. Единственный установленный недостаток - Whirlpool, который использует шифр как функцию сжатия, не может быть так же эффективен, как SHA-512, особенно когда он реализуется на аппаратных средствах.


КатегорияКриптография