6.4. Исправление недостатков
113
Злоумышленнику удастся всего лишь выбрать сообщение
m
, аутентифициро-
вать его в системе с помощью значения
h
(
m
k
X
)
и затем попытаться найти
X
путем полного перебора вариантов. С итеративной функцией хэширования,
однако, перед злоумышленником открываются более радужные перспективы.
Он находит строки
m
и
m
0
, которые при хэшировании функцией
h
приводят
к коллизии. Используя атаку, в основе которой лежит парадокс задачи о днях
рождения, это можно выполнить всего лишь примерно за
2
n/
2
шагов. Затем
злоумышленник аутентифицирует в системе сообщение
m
и заменяет его со-
общением
m
0
. Напомним, что значение
h
вычисляется итеративно, поэтому,
если при хэшировании части второго сообщения возникнет коллизия, а все
оставшиеся входные значения будут такими же, как и для первого сообщения,
значение хэш-кода тоже не изменится. Поскольку хэширование сообщений
m
и
m
0
дает одно и то же значение,
h
(
m
k
X
) =
h
(
m
0
k
X
)
для всех
X
.
Мы привели пример типичного различителя. Он устанавливает собствен-
ные “правила игры” (условия, при которых он пытается осуществить атаку)
и затем атакует систему. Цель, как и прежде, состоит в том, чтобы найти раз-
личие между функцией хэширования и идеальной функцией хэширования,
но в данном случае это очень легко. Если атака завершится удачно, значит,
перед нами итеративная
функция хэширования, а если неудачно — идеальная
функция хэширования.
6.4
Исправление недостатков
Нам нужна функция хэширования, которая будет вести себя как случай-
ное отображение. К сожалению, все известные
функции хэширования дан-
ному требованию не соответствуют. Неужели придется выполнять проверку
на наличие проблемы удлинения сообщения во всех местах, где используется
функция хэширования? А как насчет коллизий при частичном хэшировании
сообщений? И есть ли у
функций хэширования еще какие-нибудь слабые сто-
роны, которые нужно проверять?
Оставлять функцию хэширования такой, как она есть, со всеми недостат-
ками — весьма неудачная идея. Поверьте нам: всегда найдется такой способ
использования функции хэширования, который их раскроет. Даже если вы
задокументируете все известные недостатки, их не будут проверять в реаль-
ных системах. Более того, если бы вы могли контролировать процесс разра-
ботки системы, то обязательно столкнулись бы с
проблемой сложности. Пред-
положим, функция хэширования имеет три слабых места, блочный шифр —
два, схема цифровой подписи — четыре и т.д. Чтобы убедиться в этом, при-
дется проверить сотни вариантов взаимодействия этих слабых мест, что прак-