Хэш-функции
Требования к криптографическим хэш-функциям
Хэш-функцией называется односторонняя функция, предназначенная для получения дайджеста или "отпечатков пальцев" файла, сообщения или некоторого блока данных.
Хэш-код создается функцией Н:
h = H (M)
гдеМ является сообщением произвольной длины и h является хэш-кодом фиксированной длины.
Рассмотрим требования, которым должна соответствовать хэш-функция для того, чтобы она могла использоваться в качестве аутентификатора сообщения.
Чтобы хэш-функция Н могла использоваться в качестве аутентификатора сообщения, она должна обладать следующими свойствами:
- Хэш-функция Н должна применяться к блоку данных любой длины.
- Хэш-функция Н должна создавать выход фиксированной длины.
- Н(М) относительно легко (за полиномиальное время) вычисляется для любого значения М.
- Для любого данного значения хэш-кода h вычислительно невозможно найти M такое, что Н(M)=h.
- Для любого данного М вычислительно невозможно найти М′ ≠ M такое, что H(M)=H(M′).
- Вычислительно невозможно найти произвольную пару (M,M′) такую, что H(M)=H(M′).
Первые три свойства требуют, чтобы хэш-функция создавала хэш-код для любого сообщения.
Четвертое свойство означает, что хэш-функция должна обладать свойством односторонности: легко создать хэш-код по данному сообщению, но невозможно восстановить сообщение по хэш-коду. Это свойство важно, если для аутентификации с помощью хэш-функции используется секретное значение. Само секретное значение может не посылаться, тем не менее, если хэш-функция не является односторонней, противник может легко раскрыть секретное значение следующим образом. Перехватив передаваемое сообщение, атакующий получает сообщение М и хэш-код h=Н(S||M). Если атакующий может инвертировать хэш-функцию, то он получает S||M=H–1(h). Так как атакующий теперь знает и М, и S||M, получить S совсем просто.
Пятое свойство гарантирует, что невозможно найти другое сообщение, чье значение хэш-функции совпадало бы со значением хэш-функции данного сообщения. Это предотвращает подделку сообщения, когда в качестве аутентификатора используется защищенный от изменения хэш-код. Предположим, что противник может прочитать сообщение и, следовательно, вычислить его хэш-код. Но так как противник не знает секретного ключа, он не имеет возможности изменить сообщение так, чтобы получатель этого не обнаружил. Если данное свойство не выполняется, атакующий может выполнить следующую последовательность действий: перехватить сооб-щение и его зашифрованный хэш-код, вычислить хэш-код сообщения, со-здать альтернативное сообщение с тем же самым хэш-кодом, заменить ис-ходное сообщение на поддельное. Поскольку хэш-коды этих сообщений совпадают, получатель не обнаружит подмены.
Хэш-функция, которая удовлетворяет первым пяти свойствам, называется простой или слабой хэш-функцией. Если кроме того выполняется шестое свойство, то такая функция называется сильной хэш-функцией. Шестое свойство защищает против класса атак, известных как атака "день рождения".
"Парадокс дня рождения"
Так называемый "парадокс дня рождения" состоит в следующем.
Первая задача. Каким должно быть число k, чтобы для данного значения X и значений Y1, …, Yk, каждое из которых принимает значения от 1 до n, вероятность того, что хотя бы для одного Yi выполнялось равенство X=Y
P (X = Y) ≥ 0.5
Для одного значения Y вероятность того, что X=Y, равна 1/n.
P (X = Y) = 1/n
Соответственно, вероятность того, что X ≠ Y, равна 1 – 1/n.
P (X ≠ Y) = 1 – 1/n
Если создать k значений, то вероятность того, что ни для одного из них не будет совпадений, равна произведению вероятностей, соответствующих одному значению, т.е. (1 – 1/n)k.
Следовательно, вероятность по крайней мере одного совпадения равна
P (X = Yi) = 1 – (1 – 1/n)k
По формуле бинома Ньютона
Таким образом, для хэш-кода длиной m бит достаточно выбрать 2m-1 сообщений, чтобы вероятность совпадения хэш-кодов была больше 0,5.
Теперь рассмотрим вторую задачу. Обозначим P(n,k) вероятность того, что в множестве из k элементов, каждый из которых может принимать n значений, есть хотя бы два с одинаковыми значениями. Чему должно быть равно k, чтобы P(n,k) была бы больше 0,5?
Число различных способов выбора элементов таким образом, чтобы при этом не было дублей, равно
Всего возможных способов выбора элементов равно
Вероятность того, что дублей нет, равна
Вероятность того, что есть дубли, соответственно равна
Известно, что Если хэш-код имеет длину m бит, т.е. принимает 2m значений, то
Подобный результат называется "парадоксом дня рождения", потому что в соответствии с приведенными выше рассуждениями для того, чтобы вероятность совпадения дней рождения у двух человек была больше 0,5, в группе должно быть всего 23 человека. Этот результат кажется удивительным, возможно, потому, что для каждого отдельного человека вероятность того, что с его днем рождения совпадет день рождения у кого-то другого в группе, достаточно мала.
Вернемся к рассмотрению свойств хэш-функций. Предположим, что используется 64-битный хэш-код. Можно считать, что это вполне достаточная и, следовательно, безопасная длина для хэш-кода. Например, если защищенный хэш-код h передается с соответствующим незашифрованным сообщением М, то противнику необходимо будет найти М ′ такое, что
Н (М′) = Н (М)
для того, чтобы подменить сообщение и обмануть получателя. В среднем противник должен перебрать 263 сообщений для того, чтобы найти другое сообщение, у которого хэш-код равен перехваченному сообщению.
Тем не менее, возможны различного рода атаки, основанные на "парадоксе дня рождения". Возможна следующая стратегия:
- Противник создает 2m/2 вариантов сообщения, каждое из ко-торых имеет некоторый определенный смысл. Противник под-готавливает такое же количество сообщений, каждое из которых является поддельным и предназначено для замены насто-ящего сообщения.
- Два набора сообщений сравниваются в поисках пары сообщений, имеющих одинаковый хэш-код. Вероятность успеха в соответствии с "парадоксом дня рождения" больше, чем 0,5. Если соответствующая пара не найдена, то создаются дополни-тельные исходные и поддельные сообщения до тех пор, пока не будет найдена пара.
- Атакующий предлагает отправителю исходный вариант сообщения для подписи. Эта подпись может быть затем присоединена к поддельному варианту для передачи получателю. Так как оба варианта имеют один и тот же хэш-код, подпись будет соответствовать обоим сообщениям. Противник подписал поддельное сообщение, не зная при этом ключа, защищающего хэш-код.
Таким образом, если используется 64-битный хэш-код, то для подбора двух сообщений с одинаковым хэш-кодом в среднем необходимо перебрать 232 сообщений.
Вследствие этого длина хэш-кода должна быть достаточно большой. Длина, равная 64 битам, в настоящее время не считается безопасной. Пред-почтительнее, чтобы длина составляла не менее 100 битов.