Содержание
Криптогафическая хэш-функция Whirlpool
- Whirlpool
- криптографическая хэш-функция, разработанная Винсентом Риджменом (Vincent Rijmen) и Пауло Баретто (Paolo Barreto). Впервые опубликована в ноябре 2000 года. Осуществляет хэширование входного сообщения с длиной до бит. Ообрена европейской организацией NESSIE (New European Schemes for Signature, Integrity and Encryption - Новые европейские схемы подписей, целостности и шифрования)
Whirlpool использует структуру Меркля-Дамгарда и одностороннюю функцию сжатия Миагучи-Пренеля для формирования 512-блока зашифрованого текста . Поскольку внутренний блок шифрования работает с 512-битными входными сообщениями, то исходное сообщение необходимо разбить на блоки по 512 бит. При этом последний блок, который содержит конец сообщения, может оказаться неполным.
Для решения данной проблемы в Whirlpool используется дополнение входного сообщения. Результатом дополнения сообщения является сообщение , длина которого кратна 512 бит. Пусть — длина исходного сообщения. Для того, чтобы получить , необходимо сделать 3 операции:
- К концу сообщения приписать бит «1» ;
- Приписать x битов «0» так, чтобы длина полученной строки была кратна 256 нечетное число раз;
- Приписать 256-битное представление числа .
Полученная строка разбивается на 512-битовые блоки , , , которые используются для генерации последовательности хэш-значений , , ( - строка из 512 «0» бит). Для вычисления , шифрует , используя в качестве ключа , и выполняет между и . Значением хэш-функции является .
Раунды
Шифр Whirlpool использует 10 раундов. Размер блока и размер ключа - 512 бит. Ключом для раунда является .
Функция раунда
512 бит входного блока группируются в 64 байта . Затем эти байты записываются
в матрицу размером 8 * 8:
В дальнейшем нам придется работать в конечном поле . Элементы это байты, они могут складываться с помощью операции XOR. Модель конечного поля зависит от выбора неприводимого многочлена степени 8. Для Whirlpool этим многочленом является .
Процедуры, входящие в функцию раунда:
- сдвиг столбцов матрицы состояния на различную величину (ShiftColumns?);
- перемешивание данных каждого столбца матрицы состояния (SubBytes?);
- умножение каждого столбец матрицы состояния на матрицу констант в (MixRows?);
- сложение ключа раунда с матрицей состояния (AddRoundKey?).
ShiftColumns?
Процедура ShiftColumns? обеспечивает сдвиг столбцов матрицы состояния на различную величину. Столбец сдвигается на байт (Столбец 0 не изменяется, столбец 7 сдвигается на 7 байт.) В результате в матрице состояния записаны новые 8 байт.
SubBytes?
Процедура SubBytes? обеспечивает перемешивание данных каждого столбца матрицы состояния. Байт представляют в виде двух шестнадцатеричных цифр. Левая цифра определяет строку, а правая - столбец таблицы подстановки. Две шестнадцатеричных цифры в пересечении строки и столбца определяют новый байт.
Ниже приведена таблица подстановки (S-блок) для преобразования байтов. Например, два байта, и , которые отличаются только одним битом, преобразованы к и , которые отличаются пятью битами.
Таблица может быть вычислена алгебраически, используя поле с неприводимым полиномом . - миниблоки вычисляют степень, равную шестнадцатеричному значению входа; - миниблок использует псевдослучайный генератор чисел.
Каждая шестнадцатеричная цифра в байте передается миниблок ( и ).
Результаты блока и складываются с помощью XOR, и передаются на миниблок .
Чтобы получить старшие 4 бита результата, выполняется XOR между выходами миниблоков и .
Чтобы получить младшие 4 бита результата, выполняется XOR между выходами миниблоков и .
MixRows?
Преобразование MixRows? - матричное преобразование, где байты интерпретируются полиномы с коэффициентами в . Каждый столбец матрицы состояния умножается на матрицу констант С
Операции умножения на матрицу констант в выполняются с использованием полинома .
AddRoundKey?
В преобразовании AddRoundKey? байт матрицы состояния складывается в поле с соответствующим байтом матрицы состояний ключей раунда. Результат - новый байт в новой матрице состояний.
Константы раунда
Каждая константа раунда является матрицей 8 x 8, где только первая строка имеет значения, отличные от нуля. Остальная часть входов содержит все нули. Значения для первой строки в каждой матрице констант могут быть вычислены, используя преобразование SubBytes?. Другими словами, использует первые восемь входов в таблице преобразования SubBytes?; использует вторые восемь входов, и т. д. Ниже показан пример , где первая строка - третьи восемь входов в таблице SubBytes?.
Расширение ключа
Для каждого раунда необходим 512-битный ключ шифрования. Для решения данной проблемы во многих алгоритмах вводится так называемая процедура расширения ключа. В Whirlpool расширение ключа реализуется следующим образом:
где - ключ раунда, - константа раунда, а - функция раунда;
Таким образом, из известного ключа производится необходимая последовательность ключей для каждого раунда блочного шифра .
Анализ
Хотя Whirlpool не был всесторонне изучен или проверен, он базируется на устойчивой схеме Миагучи-Пренеля - (Miyaguchi-Preneel), а для функции сжатия использует шифр, который основан на AES.
Кроме того, размер дайджеста сообщения тот же, что и в SHA-512. Поэтому, как ожидается, Whirlpool будет очень сильной функцией криптографического хэширования. Однако необходимы серьезные испытания и исследования, чтобы подтвердить это. Единственный установленный недостаток - Whirlpool, который использует шифр как функцию сжатия, не может быть так же эффективен, как SHA-512, особенно когда он реализуется на аппаратных средствах.
КатегорияКриптография