- •Введение
- •1.2 Пример хеш-функции.
- •Ключевые функции хеширования
- •Бесключевые функции хеширования
- •Обзор блочного шифрования.
- •Логика выполнения sha-1
- •Сравнение sha-1 и md5
- •Краткое описание алгоритма гост 28147-89
- •Алгоритм вычисления шаговой функции хэширования
- •Генерация ключей
- •Шифрующее преобразование
- •Перемешивающее преобразование
- •Различные атаки на хеш-функции.
1.2 Пример хеш-функции.
Следующая хеш-функция была предложена Шаумом, ван Хейстом и Пфицманом, (Schaum, van Heyst, Pfitzmann) она основана на возведении в степень в конечном простом поле , где и - простое число. Пусть примитивный элемент в , и . Рассмотрим отображение
,
которое определяется т.о., что
.
Лемма 1.2.1. Эффективный алгоритм вычисления коллизии для функции существует тогда и только тогда, когда существует эффективный алгоритм вычисления такого , что .
Доказательство. Пусть имеется эффективный алгоритм вычисления коллизии для функции , т.е. . Тогда
или , или
.
Пусть . Тогда или .
При найдем однозначно
.
При или имеем . Поэтому , что противоречит определению коллизии. Наконец, пусть . Тогда
.
Отсюда найдем . Значит или . Проверкой равенства установим, какой из двух случаев имеет место в действительности. Доказательство обратного утверждения очевидно. Лемма доказана.
Т.о. это хорошая хеш-функция с точки зрения трудности вычисления коллизий, т.к. известно, что вычисление дискретных логарифмов является трудной задачей. Однако она имеет два недостатка. Во-первых, не позволяет сжимать сообщения сколь угодно большой длины, во-вторых, это очень медленная функция, т.к. использует возведение в степень в конечном поле. Первый из недостатков может быть сравнительно легко устранен. Обозначим через пространство двоичных векторов длины . Пусть имеется любая функция
.
Построим функцию , где . Т.е. - множество всех двоичных векторов, длина которых не меньше . Через обозначим длину вектора . Через обозначим конкатенацию векторов , т.е. вектор получается приписыванием к справа вектора .
Сначала рассмотрим случай . Пусть , тогда и можно представить как конкатенацию
,
где и , где . Здесь - наименьшее целое число . Сформулируем алгоритм вычисления значения функции .
В алгоритме используется вспомогательный вектор
Шаг 1. Положим .
Шаг 2. , где - вектор из нулей длины .
Шаг 3. , где выбирается т.о., что .
Шаг 4. Вычислить .
Шаг 5. Для всех вычислить
.
Шаг 6. Положить .
Лемма 1.2.2.
1) Отображение инъективно;
2)Пусть имеется эффективный алгоритм вычисления коллизии для , тогда имеется эффективный алгоритм вычисления коллизии для .
Доказательство. Докажем 1). Пусть
и . Тогда и при . Т.к. , где и , то . Т.е. . Докажем 2). Пусть , где , - коллизия для . Построим коллизию для . Обозначим
где дополняется до с помощью нулей, а дополняется до с помощью нулей. Величины, вычисленные в п.п. 4),5) обозначим через для и для . Рассмотрим три случая.
-
пусть . Тогда, очевидно, и . Имеем цепочку равенств
.
Т.о. , есть коллизия для .
-
пусть . Тогда и . Как и выше, имеем равенство
Если , то получили коллизию для . В противном случае Отсюда
Т.о. или нашли коллизию для , или выполняются равенства и и т.д. На последнем шаге выполнено, если до того не нашли коллизию для , равенство
.
Значит, получили коллизию для или . В последнем случае , что невозможно в силу инъективности отображения .
3) пусть но . Тогда можно считать, что , т.е. . Действуя как при рассмотрении п.2), построим коллизию для или придем к равенству
.
Заметим, что - ый бит в равен 0, а - ый бит в векторе равен 1. Значит, это коллизия для . Т.о. лемма доказана.
При мы должны изменить алгоритм вычисления . Пусть . Определим функцию т.о., что
.
В алгоритме используется вспомогательный вектор , .
Шаг 1. Положить
.
Шаг 2. Положить .
Шаг 3. Для всех , вычислить
.
Шаг 4. Положить .
Лемма 1.2.3.
1) Отображение инъективно;
2) не существует таких что и ;
3)пусть имеется эффективный алгоритм вычисления коллизий для функции , тогда имеется эффективный алгоритм вычисления коллизий для .
Доказательство. Утверждения 1), 2) легко следуют из определения функции . Докажем 3). Пусть таковы, что и . Пусть
, .
Рассмотрим два случая. 1) Пусть . Тогда имеем коллизию для или , что невозможно в силу инъективности ; 2) пусть . Тогда построим коллизию для или придем к системе равенств
Это противоречит п.2) леммы. Т.о. лемма доказана.
-
Хеш-функций на основе одношаговых сжимающих функций.
Разобранный в предыдущем разделе метод является вариантом общего метода построения хеш-функций. Пусть - любая функция
при некоторых натуральных . Требуется построить функцию
.
Сообщение разбивается на блоки
,
где . Если длина сообщения в битах не кратна , то последний блок дополняется т.о., что . Тогда , где последовательность вычисляется по следующему правилу. Блок фиксирован, например, . Далее
. (1)
Однако в отличие от изложенного выше случая здесь не удается доказать, что коллизия для всегда приводит к коллизии для .
Если функция зависит от ключа, то этот вектор можно положить равным нулевому вектору. Если же функция не зависит от ключа, то для исключения возможности перебора коротких сообщений (при попытках обращения хеш-функции) этот вектор можно составить из фрагментов, указывающих дату, время, номер сообщения и т.п.
При таком подходе свойства хеш-функции полностью определяются свойствами одношаговой сжимающей функции .
Лемма 1.4.1. Если функция хеширования h построена ни основе одношаговой сжимающей функции f по правилу (1), то из устойчивости к коллизиям функции f следует устойчивость к коллизиям функции h.
Действительно, если у функции h имеется коллизия, то на некотором шаге i должна существовать коллизия у функции f (при определении коллизий функцию следует рассматривать как функцию от одного переменного, полученного конкатенацией переменных в один входной вектор).
Особо выделяют два важных типа криптографических хеш-функций — ключевые и бесключевые. Первые применяются в системах с симметричными ключами. Они дают возможность без дополнительных средств гарантировать как правильность источника данных, так и целостность данных в системах с доверяющими друг другу пользователями.
Бесключевые хеш-функции дают возможность с помощью дополнительных средств (например, шифрования, использования защищенного канала или цифровой подписи) гарантировать целостность данных. Эти хеш-функции могут применяться в системах как с доверяющими, так и не доверяющими друг другу пользователями. Рассмотрим их более подробно.