С момента создания в 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, обнаруженный Тайдзо Сираем[англ.] и Кёдзи Сибутани[англ.][1], впоследствии исправлен, и конечная (третья) версия, названная для краткости просто Whirlpool, принята ISO в стандарте ISO/IEC 10118-3:2004 в 2004 году.
Описание
Основная версия — хеш-функции — третья; в отличие от первой версии, S-box определён, а диффузная матрица заменена на новую после доклада Сирая и Сибутани[1].
Whirlpool состоит из повторного применения функции сжатия, основой которой является специальный 512-битный блочный шифр с 512-битным ключом.
Whirlpool построен на специальном блочном шифре, который работает с 512-битными данными.
В преобразованиях промежуточный результат вычисления хеша называется хеш-состоянием или просто состоянием. При вычислениях состояние обычно представляется матрицей состояния. Для Whirlpool это матрица в . Следовательно, 512-битные блоки данных должны быть преобразованы в этот формат перед дальнейшими вычислениями. Это достигается введением функции :
Проще говоря, заполнение матрицы состояния данными происходит построчно. При этом каждый байт матрицы представляет собой соответствующий многочлен в .
Преобразования
Нелинейное преобразование (S-box)
Функция состоит из параллельного применения блока подстановки (S-box) ко всем байтам матрицы состояния:
Блок подстановки описывается следующей таблицей замен:
Таблица 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-битного хеша Whirlpool. Авторы Whirlpool утверждают, что созданная ими хеш-функция удовлетворяет следующим требованиям криптостойкости:
Генерация коллизии требует порядка вычислений хеша WHIRLPOOL (стойкость к коллизиям второго рода).
Для заданной поиск такого сообщения , что , потребует порядка вычислений хеша WHIRLPOOL (необратимость).
Для заданного сообщения обнаружение другого сообщения , для которого , потребует порядка вычислений хеша WHIRLPOOL (стойкость к коллизиям первого рода).
Невозможно обнаружить систематические корреляции между любой линейной комбинацией входных бит и любой линейной комбинацией бит хеша или предсказать, какие биты хеша изменят своё значение при изменении определённых входных бит (стойкость к линейному криптоанализу и дифференциальному криптоанализу).
К данному заявлению авторы Whirlpool добавили примечание:
Эти утверждения вытекают из значительного запаса прочности относительно всех известных атак. Тем не менее, мы понимаем, что невозможно сделать не спекулятивные утверждения о неизвестных вещах.
Криптоанализ
На сегодняшний день WHIRLPOOL устойчива ко всем видам криптоанализа. На протяжении 8 лет существования Whirlpool не было зарегистрировано ни одной атаки на неё.
Как видно из таблицы, сгенерировать коллизию для 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") =
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
Добавление символов в строку, конкатенация строк и другие изменения также влияют на результат.
↑ 12Florian Mendel, Christian Rechberger, Martin Schläffer, Søren S. Thomsen.The Rebound Attack: Cryptanalysis of Reduced Whirlpool and Grøstl(англ.) (24 февраля 2009). — презентация нового способа криптоанализа и его применения для криптоанализа хеш-функций Whirlpool и Grøstl. Дата обращения: 25 июня 2019. Архивировано 28 сентября 2011 года.
NESSIE(англ.). — англ.New European Schemes for Signatures, Integrity and Encryption, новые европейские проекты по цифровой подписи, целостности и шифрованию. Дата обращения: 25 июня 2019.