Хеш-функции с повышенной криптостойкостью Whirlpool криптографическая хеш-функция, разработанная Vincent Rijmen и Paulo S. L. M. Barreto. Впервые опубликована в ноябре 2000 года. Осуществляет хеширование входного сообщения с длиной до 2256 бит. Выходное значение хеш-функции Whirlpool, называемое хешем, составляет 512 бит. 3.1 История Whirlpool Хеш-функция 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 , был впоследствии исправлен, и конечная (третья) версия, названная для краткости просто WHIRLPOOL, была принята ISO (англ. International Organization for Standardization, международная организация по стандартизации) в стандарте ISO/IEC 10118-3:2004 в 2004 году. 3.2 Описание Whirlpool В отличие от первой версии, в последней (третьей) S-box определен, а диффузная матрица заменена на новую после доклада Taizo Shirai и Kyoji Shibutani. Whirlpool состоит из повторного применения функции сжатия, основой которой является специальный 512-битный блочный шифр W с 512-битным ключом. В алгоритме используются операции в поле Галуа по модулю неприводимого многочлена Многочлены для краткости записываются в шестнадцатеричном представлении. Например, запись означает. Символом _ обозначается оператор композиции. Выражение _ означает композицию функций и. Для обозначения композиции последовательности функций используется символ: - множество матриц над; - циркулянтная матрица, первая строка которой состоит из элементов. Как уже говорилось выше, Whirlpool построена на специальном блочном шифре W, который работает с 512-битными данными. В преобразованиях промежуточный результат вычисления хеша называется хеш-состоянием или просто состоянием. При вычислениях состояние обычно представляется матрицей состояния. Для Whirlpool это матрица в. Следовательно, 512-битные блоки данных должны быть преобразованы в этот формат перед дальнейшими вычислениями. Проще говоря, заполнение матрицы состояния данными происходит построчно. При этом каждый байт матрицы представляет собой соответствующий многочлен. 3.3 Преобразования Whirlpool Функция состоит из параллельного применения блока подстановки (S-box) ко всем байтам матрицы состояния: Блок подстановки описывается в таблице 1. Перестановка циклически сдвигает каждый столбец матрицы состояния так, что столбец j сдвигается вниз на j позиций: Задача данного преобразования перемешать байты строк матрицы состояния между собой. Линейная диффузия это линейное преобразование, матрицей которого является MDS матрица , то есть: Другими словами, матрица состояния умножается справа на матрицу C. MDS матрица это такая матрица над конечным полем K, что если взять её в качестве матрицы линейного преобразования из пространства в пространство, то любые два вектора из пространства вида будут иметь как минимум различий в компонентах. То есть набор векторов вида образует код, обладающий свойством максимальной разнесённости (англ. Maximum Distance Separable code). Таким кодом является, например, код Рида-Соломона. В Whirlpool свойство максимальной разнесённости MDS матрицы означает, что общее количество меняющихся байт вектора и вектора не меньше . Другими словами, любое изменение только одного байта приводит к изменению всех 8 байтов . В этом и состоит задача линейной диффузии. Как уже упоминалось выше, MDS матрица в последней (третьей) версии Whirlpool была изменена благодаря статье Taizo Shirai и Kyoji Shibutani. Они проанализировали MDS матрицу второй версии Whirlpool и указали на возможность повышения устойчивости Whirlpool к дифференциальному криптоанализу. Также они предложили 224 кандидата на место новой MDS матрицы. Из этого списка авторы Whirlpool выбрали вариант, наиболее легко реализуемый в аппаратном обеспечении. Функция добавления ключа представляет собой побитовое сложение (XOR) матриц состояния и ключа. Первая строка матрицы cr является результатом применения блока подстановки S к байтовым числам. Остальные 7 строк нулевые. Таким образом, из известного ключа K производится необходимая последовательность K0,...,KR ключей для каждого раунда блочного шифра W. Специальный 512-битный блочный шифр в качестве параметра использует 512-битный ключ K и выполняет следующую последовательность преобразований, где ключи K0,...,KR порождены описанной выше процедурой расширения ключа. В хеш-функции Whirlpool число раундов R = 10. Таблица 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 | 66x | 3Ax | 69x | 09x | 70x | B6x | d0x | Edx | ccx | 42x | 98x | A4x | 28x | 5cx | F8x | 86x | Whirlpool, как и любая другая хеш-функция, должна осуществлять хеширование сообщения произвольной длины. Поскольку внутренний блок шифрования W работает с 512-битными входными сообщениями, то исходное сообщение необходимо разбить на блоки по 512 бит. При этом последний блок, который содержит конец сообщения, может оказаться не полным. Для решения данной задачи Whirlpool использует алгоритм Меркле-Дамгаарда дополнения входного сообщения. Результатом дополнения сообщения является сообщение, длина которого кратна 512. Пусть L длина исходного сообщения. Тогда получается в несколько шагов: - к концу сообщения приписать бит «1»; - приписать x битов «0» так, чтобы длина полученной строки L + 1 + x была кратна 256 нечетное число раз; - наконец, приписать 256-битное представление числа L. Дополненное сообщение записывается в виде и разбивается на 512-битные блоки для дальнейшей обработки. В Whirlpool применяется схема хеширования Miyaguchi-Preneel блоков дополненного сообщения последовательно шифруются блочным шифром W: Е?Е??????????????????????????7? где IV (англ. initialization vector, вектор инициализации) 512-битная строка, заполненная "0". Дайджестом для сообщения M является выходное значение Ht функции сжатия, преобразованное обратно в 512-битную строку. 3.4 Криптостойкость Whirlpool Хеш-функция 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 добавили примечание: Эти утверждения вытекают из значительного запаса прочности относительно всех известных атак. Тем не менее, мы понимаем, что невозможно сделать не спекулятивные утверждения о неизвестных вещах. Таблица 2 - Результаты криптоанализа хеш-функций Whirlpool и Grшstl по методу Th Rebound Attack Хеш-функция | Число раундов | Сложность | Требуемый объём памяти | Тип коллизии | Whirlpool | 4.5 / 10 | | | коллизия | | 5.5 / 10 | | | Полусвободная коллизия | | 7.5 / 10 | | | Полусвободная почти коллизия | Grшstl-256 | 6 / 10 | | | полусвободная коллизия | ЗАКЛЮЧЕНИЕ В ходе лабораторной работе были изучены вычисление вручную значение хеш-функции Adler-32, составление программы на VBA для вычисления значения хеш-функции Adler-32 заданного текстового файла. ПРИЛОЖЕНИЕ 1 (обязательное) Прямая реализация алгоритма uint32_t adler32(unsigned char *data, int len){ uint32_t sum1 = 1; uint32_t sum2 = 0; for (i = 0; i < len; i++){ sum1 = (sum1 + buf[i]) % BASE; sum2 = (sum2 + sum1) % BASE; } return (sum2 << 16) | sum1; } Более эффективная реализация алгоритма Adler32 из библиотеки zlib: uint32_t adler32(uint32_t adler, const unsigned char* buf, unsigned len){ uint32_t sum2; unsigned n; /* Обработка частных случаев...*/ /* do length NMAX blocks -requires just one modulo operation */ while (len >= NMAX) { len -= NMAX; n = NMAX / 16; /* NMAX is divisible by 16 */ do { DO16(buf); /* 16 sums unrolled */ buf += 16; } while (--n); adler %= BASE; sum2 %= BASE; } /* Обработка оставшихся элементов массива...*/ /* return recombined sums */ return adler | (sum2 << 16); } ПРИЛОЖЕНИЕ 2 (обязательное) Превращение Adler32 в кольцевой хеш inline uint32_t roll(int32_t adler, unsigned char oldbyte, unsigned char newbyte, unsigned len){ int32_t sum2 = (adler >> 16) & 0xffff; adler &= 0xffff; adler += newbyte oldbyte; if(adler >= (int32_t) BASE) adler -= BASE; else if(adler < 0) adler += BASE; sum2 = (int32_t) (sum2 len * oldbyte + adler 1) % (int32_t) BASE; if(sum2 < 0){ sum2 += BASE; return adler | (sum2 << 16); } |