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

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск
Криптографическая
хеш-функция
Miyaguchi-Preneel.PNG
Название

WHIRLPOOL

Разработчики

Vincent Rijmen (англ.), Paulo S. L. M. Barreto (англ.)

Впервые опубликован

Ноябрь 2000

Стандарты

NESSIE Portfolio (2003), ISO/IEC 10118-3:2004 (2004)

Размер хеша

512 бит

Число раундов

10

Тип

хеш-функция

Whirlpool — криптографическая хеш-функция, разработанная Vincent Rijmen (англ.) и Paulo S. L. M. Barreto (англ.). Впервые опубликована в ноябре 2000 года. Осуществляет хеширование входного сообщения с длиной до 2^{256} бит. Выходное значение хеш-функции Whirlpool, называемое хешем, составляет 512 бит.

История[править | править исходный текст]

Название[править | править исходный текст]

Галактика Водоворот (M51), в честь которой названа хеш-функция.

Хеш-функция Whirlpool названа в честь Галактики Водоворот (M51) в созвездии Гончие Псы — первой галактики с наблюдаемой спиральной структурой.

Модификации[править | править исходный текст]

С момента создания в 2000 году Whirlpool дважды подвергалась модификации.

Первая версия, WHIRLPOOL-0, была представлена в качестве кандидата в проекте NESSIE (англ. New European Schemes for Signatures, Integrity and Encryption, новые европейские проекты по цифровой подписи, целостности и шифрованию).

Модификация WHIRLPOOL-0, названная WHIRLPOOL-T, в 2003 году была добавлена в перечень рекомендованных к использованию криптографических функций NESSIE. Изменения касались блока подстановки ( S-box (англ.)) Whirlpool: в первой версии структура S-box (англ.) не была описана, и он генерировался совершенно произвольно, что создавало определённые проблемы при аппаратной реализации Whirlpool. В версии WHIRLPOOL-T S-box (англ.) «приобрёл» чёткую структуру.

Дефект в диффузных матрицах WHIRLPOOL-T, обнаруженный Taizo Shirai (англ.) и Kyoji Shibutani (англ.)[1], был впоследствии исправлен, и конечная (третья) версия, названная для краткости просто WHIRLPOOL, была принята ISO (англ. International Organization for Standardization, международная организация по стандартизации) в стандарте ISO/IEC 10118-3:2004 в 2004 году.

Описание[править | править исходный текст]

Введение[править | править исходный текст]

В данной статье описывается последняя(третья) версия Whirlpool. В отличие от первой версии S-box (англ.) определен, а диффузная матрица заменена на новую после доклада Taizo Shirai (англ.) и Kyoji Shibutani (англ.)[1].

Whirlpool состоит из повторного применения функции сжатия (англ.), основой которой является специальный 512-битный блочный шифр W с 512-битным ключом.

Используемые обозначения и операции[править | править исходный текст]

В алгоритме используются операции в поле Галуа \ GF(2^8) по модулю неприводимого многочлена \ p_8(x) = x^8 + x^4 + x^3 + x^2 + 1.

Многочлены для краткости записываются в шестнадцатеричном представлении. Например, запись \ 11D_x означает \ p_8(x).


Для обозначения композиции последовательности функций f_m, f_{m+1},...,f_{n-1}, f_n, m \leq n используется символ \bigcirc_m^{r=n}:
\bigcirc_m^{r=n} f_r \equiv f_n \circ f_{n-1} \circ \dots \circ f_{m+1} \circ f_m.


  • M_{m \times n}[GF(2^8)] — множество матриц m \times n над \ GF(2^8).



cir(a_0, a_1, . . . , a_{m-1}) \equiv
\begin{bmatrix}
a_0     & a_1    & \dots  & a_{m-1}  \\
a_{m-1} & a_0    & \dots  & a_{m-2}  \\
\vdots  & \vdots & \ddots & \vdots   \\
a_1     & a_2    & \dots  & a_0      \\
\end{bmatrix},
или просто \ cir(a_0, a_1, . . . , a_{m-1}) = c \Leftrightarrow c_{ij} = a_{(j-i) mod m}, 0 \leq i,j \leq m-1.

Формат данных[править | править исходный текст]

Как уже говорилось выше, Whirlpool построена на специальном блочном шифре W, который работает с 512-битными данными.

В преобразованиях промежуточный результат вычисления хеша называется хеш-состоянием или просто состоянием. При вычислениях состояние обычно представляется матрицей состояния. Для Whirlpool это матрица в M_{8 \times 8}[GF(2^8)]. Следовательно, 512-битные блоки данных должны быть преобразованы в этот формат перед дальнейшими вычислениями. Это достигается введением функции \ \mu:

\mu: GF(2^8)^{64} \to M_{8 \times 8}[GF(2^8)], \qquad \mu(a) = b \Leftrightarrow b_{ij} = a_{8i+j}, 0 \leq i,j \leq 7.

Проще говоря, заполнение матрицы состояния данными происходит построчно. При этом каждый байт матрицы представляет собой соответствующий многочлен в \ GF(2^8).

Преобразования[править | править исходный текст]

Нелинейное преобразование \gamma (S-box)[править | править исходный текст]

Функция \gamma: M_{8 \times 8}[GF(2^8)] \to M_{8 \times 8}[GF(2^8)] состоит из параллельного применения блока подстановки ( S-box (англ.)) S: GF(2^8) \to GF(2^8), x \to S[x] ко всем байтам матрицы состояния:

\gamma(a)=b \Leftrightarrow b_{ij} = S[a_{ij}], 0 \leq i,j \leq 7.

Блок подстановки описывается следующей таблицей замен:

Таблица 1. Блок подстановки
 00_x  01_x  02_x  03_x  04_x  05_x  06_x  07_x  08_x  09_x  0A_x  0B_x  0c_x  0d_x  0E_x  0F_x

00_x

 18_x  23_x  c6_x  E8_x  87_x  B8_x  01_x  4F_x  36_x  A6_x  d2_x  F5_x  79_x  6F_x  91_x  52_x

10_x

 60_x  Bc_x  9B_x  8E_x  A3_x  0c_x  7B_x  35_x  1d_x  E0_x  d7_x  c2_x  2E_x  4B_x  FE_x  57_x

20_x

 15_x  77_x  37_x  E5_x  9F_x  F0_x  4A_x  dA_x  58_x  c9_x  29_x  0A_x  B1_x  A0_x  6B_x  85_x

30_x

 Bd_x  5d_x  10_x  F4_x  cB_x  3E_x  05_x  67_x  E4_x  27_x  41_x  8B_x  A7_x  7d_x  95_x  d8_x

40_x

 FB_x  EE_x  7c_x  66_x  dd_x  17_x  47_x  9E_x  cA_x  2d_x  BF_x  07_x  Ad_x  5A_x  83_x  33_x

50_x

 63_x  02_x  AA_x  71_x  c8_x  19_x  49_x  d9_x  F2_x  E3_x  5B_x  88_x  9A_x  26_x  32_x  B0_x

60_x

 E9_x  0F_x  d5_x  80_x  BE_x  cd_x  34_x  48_x  FF_x  7A_x  90_x  5F_x  20_x  68_x  1A_x  AE_x

70_x

 B4_x  54_x  93_x  22_x  64_x  F1_x  73_x  12_x  40_x  08_x  c3_x  Ec_x  dB_x  A1_x  8d_x  3d_x

80_x

 97_x  00_x  cF_x  2B_x  76_x  82_x  d6_x  1B_x  B5_x  AF_x  6A_x  50_x  45_x  F3_x  30_x  EF_x

90_x

 3F_x  55_x  A2_x  EA_x  65_x  BA_x  2F_x  c0_x  dE_x  1c_x  Fd_x  4d_x  92_x  75_x  06_x  8A_x

A0_x

 B2_x  E6_x  0E_x  1F_x  62_x  d4_x  A8_x  96_x  F9_x  c5_x  25_x  59_x  84_x  72_x  39_x  4c_x

B0_x

 5E_x  78_x  38_x  8c_x  d1_x  A5_x  E2_x  61_x  B3_x  21_x  9c_x  1E_x  43_x  c7_x  Fc_x  04_x

c0_x

 51_x  99_x  6d_x  0d_x  FA_x  dF_x  7E_x  24_x  3B_x  AB_x  cE_x  11_x  8F_x  4E_x  B7_x  EB_x

d0_x

 3c_x  81_x  94_x  F7_x  B9_x  13_x  2c_x  d3_x  E7_x  6E_x  c4_x  03_x  56_x  44_x  7F_x  A9_x

E0_x

 2A_x  BB_x  c1_x  53_x  dc_x  0B_x  9d_x  6c_x  31_x  74_x  F6_x  46_x  Ac_x  89_x  14_x  E1_x

F0_x

 16_x  3A_x  69_x  09_x  70_x  B6_x  d0_x  Ed_x  cc_x  42_x  98_x  A4_x  28_x  5c_x  F8_x  86_x

Циклическая перестановка \pi[править | править исходный текст]

Перестановка \pi: M_{8 \times 8}[GF(2^8)] \to M_{8 \times 8}[GF(2^8)] циклически сдвигает каждый столбец матрицы состояния так, что столбец j сдвигается вниз на j позиций:

\pi(a)=b \Leftrightarrow b_{ij} = a_{(i-j) mod 8, j}, 0 \leq i,j \leq 7.

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

Линейная диффузия \theta[править | править исходный текст]

Линейная диффузия \theta: M_{8 \times 8}[GF(2^8)] \to M_{8 \times 8}[GF(2^8)] — это линейное преобразование, матрицей которого является MDS матрица (англ.) \ C = cir(01_x, 01_x, 04_x, 01_x, 08_x, 05_x, 02_x, 09_x), то есть:



C = cir(01_x, 01_x, 04_x, 01_x, 08_x, 05_x, 02_x, 09_x) =
\begin{bmatrix}
01_x & 01_x & 04_x & 01_x & 08_x & 05_x & 02_x & 09_x \\
09_x & 01_x & 01_x & 04_x & 01_x & 08_x & 05_x & 02_x \\
02_x & 09_x & 01_x & 01_x & 04_x & 01_x & 08_x & 05_x \\
05_x & 02_x & 09_x & 01_x & 01_x & 04_x & 01_x & 08_x \\
08_x & 05_x & 02_x & 09_x & 01_x & 01_x & 04_x & 01_x \\
01_x & 08_x & 05_x & 02_x & 09_x & 01_x & 01_x & 04_x \\
04_x & 01_x & 08_x & 05_x & 02_x & 09_x & 01_x & 01_x \\
01_x & 04_x & 01_x & 08_x & 05_x & 02_x & 09_x & 01_x \\
\end{bmatrix},
так что
\theta(a)=b \Leftrightarrow b = a \cdot C.

Другими словами, матрица состояния умножается справа на матрицу \ C. Напомним, что операции сложения и умножения элементов матриц производятся в \ GF(2^8).


MDS матрица (англ.) — это такая матрица над конечным полем \ K, что если взять её в качестве матрицы линейного преобразования \ f(x)=(MDS)x из пространства \ K^n в пространство \ K^m, то любые два вектора из пространства \ K^{n+m} вида \ (x, f(x)) будут иметь как минимум \ m+1 различий в компонентах. То есть набор векторов вида \ (x, f(x)) образует код, обладающий свойством максимальной разнесённости (англ. Maximum Distance Separable code). Таким кодом является, например, код Рида-Соломона.


В 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 выбрали вариант, наиболее легко реализуемый в аппаратном обеспечении.

Добавление ключа \sigma[k][править | править исходный текст]

Функция добавления ключа \sigma[k]: M_{8 \times 8}[GF(2^8)] \to M_{8 \times 8}[GF(2^8)] представляет собой побитовое сложение (XOR) матриц состояния \ a и ключа  k \in M_{8 \times 8}[GF(2^8)]:

\sigma[k](a)=b \Leftrightarrow b_{i,j} = a_{i,j} \oplus k_{i,j}, 0 \leq i,j \leq 7.

Константы раунда c^r[править | править исходный текст]

В каждом раунде \ r, r > 0 используется матрица констант c^r \in M_{8 \times 8}[GF(2^8)] такая, что:

c_{0j}^r \equiv S[8(r-1)+j], \qquad 0 \leq j \leq 7,
c_{ij}^r \equiv 0, \qquad \qquad \qquad \qquad 1 \leq i \leq 7, 0 \leq j \leq 7.

Отсюда видно, что первая строка матрицы c^r является результатом применения блока подстановки S к байтовым числам [8(r-1)+j], 0 \leq j \leq 7.

Остальные 7 строк — нулевые.

Функция раунда \rho[k][править | править исходный текст]

Для каждого раунда \ r функция раунда — это составное преобразование \rho[k]: M_{8 \times 8}[GF(2^8)] \to M_{8 \times 8}[GF(2^8)], параметром k которого является матрица ключа  k \in M_{8 \times 8}[GF(2^8)]. Описывается функция раунда следующим образом:

\rho[k] \equiv \sigma[k] \circ \theta \circ \pi \circ \gamma.

Расширение ключа[править | править исходный текст]

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

\ K^0 = K,
\ K^r = \rho[c^r](K^{r-1}), r > 0.

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

Блочный шифр W[править | править исходный текст]

Специальный 512-битный блочный шифр W[K]: M_{8 \times 8}[GF(2^8)] \to M_{8 \times 8}[GF(2^8)] в качестве параметра использует 512-битный ключ K и выполняет следующую последовательность преобразований:

W[K] = \left( \bigcirc_1^{r=R} \rho[K^r] \right) \circ \sigma[K^0],

где ключи K^0,...,K^R порождены описанной выше процедурой расширения ключа. В хеш-функции 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' = \overbrace{M}^{L} \| 1 \| \overbrace{0 \dots 0}^{x} \| \overbrace{L}^{256}

и разбивается на 512-битные блоки для дальнейшей обработки.

Функция сжатия[править | править исходный текст]

Функция сжатия Whirlpool

В Whirlpool применяется схема хеширования Miyaguchi-Preneel (англ.).

\ t блоков m_i, 1 \leq i \leq t дополненного сообщения M' последовательно шифруются блочным шифром W:


\ \eta_i = \mu (m_i),
\ H_0 = \mu (IV),
H_i = W[H_{i-1}](\eta_i)\oplus H_{i-1}\oplus \eta_i, 1 \leq i \leq t,

где IV (англ. initialization vector, вектор инициализации (англ.)) — 512-битная строка, заполненная "0".

Вычисление хеша[править | править исходный текст]

Дайджестом для сообщения M является выходное значение H_t функции сжатия, преобразованное обратно в 512-битную строку:

Whirlpool(M) \equiv \mu^{-1}(H_t).

Криптостойкость[править | править исходный текст]

Хеш-функция H считается криптографически стойкой, если она удовлетворяет трём основным требованиям, на которых основано большинство применений хеш-функций в криптографии: необратимость, стойкость к коллизиям первого рода и стойкость к коллизиям второго рода.

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

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

К данному заявлению авторы Whirlpool добавили примечание:

Эти утверждения вытекают из значительного запаса прочности относительно всех известных атак. Тем не менее мы понимаем, что невозможно сделать не спекулятивные утверждения о неизвестных вещах.

Криптоанализ[править | править исходный текст]

На сегодняшний день WHIRLPOOL устойчива ко всем видам криптоанализа. На протяжении 8 лет существования Whirlpool не было зарегистрировано ни одной атаки на неё.

Однако, в 2009 году был опубликован новый способ атаки на хеш-функции — The Rebound Attack (англ.)[2][3]. Первыми «подопытными» новой атаки стали хеш-функции Whirlpool и Grøstl. Результаты проведённого криптоанализа приведены в таблице.

Таблица 2. Результаты криптоанализа хеш-функций Whirlpool и Grøstl по методу The Rebound Attack (англ.)[2][3]
Хеш-функция Число раундов Сложность Требуемый объём памяти Тип коллизии
Whirlpool 4.5/10 2^{120} 2^{16} коллизия
5.5/10 2^{120} 2^{16} полусвободная коллизия
7.5/10 2^{128} 2^{16} полусвободная почти коллизия
Grøstl-256 6/10 2^{120} 2^{70} полусвободная коллизия

Авторы исследования использовали следующие понятия и термины:

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

  • коллизия:
    • \ IV — фиксирован
    • f(M_t, IV) = f(M_t', IV), M_t \neq M_t'
  • почти коллизия:
    • \ IV — фиксирован
    • f_{M_t} = f(M_t, IV), f_{M_t'} = f(M_t', IV), M_t \neq M_t'
    • небольшое число бит хешей f_{M_t} и f_{M_t'} различны
  • полусвободная коллизия:
    • f(M_t, H_{t-1}) = f(M_t', H_{t-1}), M_t \neq M_t'
  • свободная коллизия:
    • f(M_t, H_{t-1}) = f(M_t', H_{t-1}'), M_t \neq M_{t-1}', H_t \neq H_{t-1}'


Как видно из таблицы, сгенерировать коллизию для Whirlpool удалось лишь для её «урезанного» варианта в 4.5 раунда. К тому же, сложность необходимых вычислений довольно высока.

Применение[править | править исходный текст]

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

  • Crypto++ — свободно распространяемая C++ библиотека классов криптографических примитивов
  • TrueCrypt — программа для шифрования «на лету»
  • 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

Примечания[править | править исходный текст]

  1. 1 2 3 Taizo Shirai, Kyoji Shibutani. On the diffusion matrix employed in the Whirlpool hashing function (англ.) (2003). — NESSIE public report. Проверено 16 ноября 2009. Архивировано из первоисточника 29 февраля 2012.
  2. 1 2 Florian Mendel, Christian Rechberger, Martin Schläffer, Søren S. Thomsen. The Rebound Attack: Cryptanalysis of Reduced Whirlpool and Grøstl (англ.) (2009). — презентация нового способа криптоанализа и его применения для криптоанализа хеш-функций Whirlpool и Grøstl. Проверено 27 ноября 2009.
  3. 1 2 Florian Mendel, Christian Rechberger, Martin Schläffer, Søren S. Thomsen. The Rebound Attack: Cryptanalysis of Reduced Whirlpool and Grøstl (англ.) (2009). — статья о новом способе криптоанализа и его применении для криптоанализа хеш-функций Whirlpool и Grøstl. Проверено 27 ноября 2009.

Ссылки[править | править исходный текст]

Стандарты[править | править исходный текст]

Программные реализации[править | править исходный текст]

Аппаратные реализации[править | править исходный текст]