Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

книги / Практическая криптография

..pdf
Скачиваний:
6
Добавлен:
12.11.2023
Размер:
16.23 Mб
Скачать

6.3 Недостатки функций хэширования

111

Функция SHA-256 работает намного медленнее, чем SHA-1. Хэширова­ ние длинных сообщений с помощью SHA-256 занимает примерно столько же времени, как шифрование сообщения с помощью AES или Twofish, а может,

инемного больше. Это не так уж плохо. Поскольку для криптографического сообщества хэширование оказалось более сложной проблемой, чем шифро­ вание, не удивительно, что функция хэширования работает медленнее, чем функция шифрования. Напротив, удивляет высокая скорость работы SHA-1

иMD5. С другой стороны, возможности осуществления атак на эти быстрые функции хэширования исследованы очень мало — во всяком случае несопо­ ставимо меньше, чем возможности нападения на блочные шифры.

Функция SHA-384 довольно бесполезна. Для вычисления ее результата необходимо проделать столько же работы, как и для функции SHA-512, а за­ тем отбросить некоторые биты. Непонятно, зачем для этого понадобилось вво­ дить отдельную функцию. Рекомендуем придерживаться функций SHA-256

иSHA-512.

6.3Недостатки функций хэширования

Ксожалению, все описанные функции хэширования имеют ряд недостат­ ков, которые вынуждают забраковать эти функции в соответствии с нашим определением безопасности.

6.3.1 Удлинение сообщения

Один из самых серьезных недостатков всех рассмотренных функций хэ­ ширования — удлинение сообщения. Этот недостаток приводит к реальным проблемам, а между тем его было бы так легко избежать. Вот в чем состоит проблема. Некоторое сообщение т разбивается на блоки ттц,..., mjt и хэши­ руется, в результате чего получается значение Я. Теперь возьмем сообще­ ние т /, которое разбивается на блоки т\ ,... ,mjt,mjt+i- Поскольку первые к блоков сообщения т! идентичны первым к блокам сообщения тп, значение h(m) соответствует промежуточному результату, полученному при вычисле­ нии h(m!) после обработки первых к блоков сообщения т1. Получается, что h(m!) = h'{h(m), mfc+i). Используя MD5 или любую функцию семейства SHA, необходимо конструировать сообщение т! таким образом, чтобы в его состав включались биты дополнения и поле длины сообщения. Впрочем, это не про­ блема, поскольку метод построения таких полей широко известен.

Проблема удлинения сообщения возникла из-за того, что в конце вычисле­ ния результата функции хэширования не выполняется никакой специальной обработки данных. Как следствие этого, значение h(m) снабжает злоумыш­ ленника самой непосредственной информацией относительно промежуточно­ го состояния, полученного после сжатия первых к блоков сообщения т'.

112

Глава 6. Функции хэширования

 

Данное свойство, очевидно, никак не укладывается в концепцию случай­

ного отображения, которым, как мы привыкли думать, является функция хэширования. Что еще более печально, это свойство автоматически выбра­ ковывает все рассмотренные функции хэширования в соответствии с нашим определением безопасности. Все, что нужно различителю, — это построить несколько подходящих пар (т , т!) и проверить функцию хэширования на наличие упомянутого свойства. Данное свойство, конечно же, не может быть присуще идеальной функции хэширования, поэтому соответствующий различитель можно классифицировать как атаку. Сама же атака потребует от злоумышленника вычисления всего нескольких значений функции хэширо­ вания, а следовательно, является очень быстрой.

Как данное свойство может повредить системе? Представим себе систему, в которой пользователь А отсылает сообщение пользователю Б и хочет аутен­ тифицировать его, послав значение h(X |га), где X — это некий секретный ключ, известный только пользователям А и Б, а т — сообщение. Если бы h была идеальной функцией хэширования, данную систему аутентификации можно было бы считать вполне надежной. К сожалению, благодаря свой­ ству удлинения злоумышленник Е может присоединить к сообщению га свой собственный текст и обновить код аутентичности h в соответствии с новым сообщением. Система аутентификации, которая позволяет злоумышленнику изменять сообщение, конечно же, совершенно непригодна с точки зрения без­ опасности.

6.3.2Коллизия при частичном хэшировании сообщений

Второй недостаток функций хэширования связан с наличием у большин­ ства из них итеративной структуры. Поясним это на примере конкретного различителя.

Первым шагом любого различителя является задание условий, при кото­ рых будет проводиться поиск различия между функцией хэширования и иде­ альной функцией хэширования. Иногда эти условия очень просты: дана функ­ ция хэширования, требуется найти коллизию. Попытаемся немного услож­ нить условия работы различителя. Предположим, у нас есть система, кото­ рая проводит аутентификацию сообщения га с помощью значения h(m |X ), где X — ключ аутентификации. Злоумышленник может выбрать сообщение га, однако система позволяет аутентифицировать только одно сообщение4.

При использовании идеальной функции хэширования с результатом раз­ мера п уровень безопасности описанной выше системы будет равен п бит.

больш инство систем позволяют аутентифицировать только ограниченное количество сообщений; наш пример — это всего лишь предельный случай, когда количество сообщений равно единице. На практике многие системы отсылают вместе с сообщением его номер, что для данного типа атак равноценно возможности выбора только одного сообщения.

6.4 Исправление недостатков

113

Злоумышленнику удастся всего лишь выбрать сообщение т, аутентифициро­ вать его в системе с помощью значения h(m |X) и затем попытаться найти X путем полного перебора вариантов. С итеративной функцией хэширования, однако, перед злоумышленником открываются более радужные перспективы. Он находит строки т и т!, которые при хэшировании функцией h приводят к коллизии. Используя атаку, в основе которой лежит парадокс задачи о днях рождения, это можно выполнить всего лишь примерно за 2П/2 шагов. Затем злоумышленник аутентифицирует в системе сообщение т и заменяет его со­ общением т' . Напомним, что значение h вычисляется итеративно, поэтому, если при хэшировании части второго сообщения возникнет коллизия, а все оставшиеся входные значения будут такими же, как и для первого сообщения, значение хэш-кода тоже не изменится. Поскольку хэширование сообщений т и т! дает одно и то же значение, h(m |X) = h{m' |X) для всех X.

Мы привели пример типичного различителя. Он устанавливает собствен­ ные “правила игры” (условия, при которых он пытается осуществить атаку) и затем атакует систему. Цель, как и прежде, состоит в том, чтобы найти раз­ личие между функцией хэширования и идеальной функцией хэширования, но в данном случае это очень легко. Если атака завершится удачно, значит, перед нами итеративная функция хэширования, а если неудачно — идеальная функция хэширования.

6.4 Исправление недостатков

Нам нужна функция хэширования, которая будет вести себя как случай­ ное отображение. К сожалению, все известные функции хэширования дан­ ному требованию не соответствуют. Неужели придется выполнять проверку на наличие проблемы удлинения сообщения во всех местах, где используется функция хэширования? А как насчет коллизий при частичном хэшировании сообщений? И есть ли у функций хэширования еще какие-нибудь слабые сто­ роны, которые нужно проверять?

Оставлять функцию хэширования такой, как она есть, со всеми недостач ками — весьма неудачная идея. Поверьте нам: всегда найдется такой способ использования функции хэширования, который их раскроет. Даже если вы задокументируете все известные недостатки, их не будут проверять в реаль­ ных системах. Более того, если бы вы могли контролировать процесс разра­ ботки системы, то обязательно столкнулись бы с проблемой сложности. Пред­ положим, функция хэширования имеет три слабых места, блочный шифр — два, схема цифровой подписи — четыре и т.д. Чтобы убедиться в этом, при­ дется проверить сотни вариантов взаимодействия этих слабых мест, что прак-

114

Глава 6. Функции хэширования

тически невозможно. Поэтому необходимо исправить саму функцию хэширо­ вания.

Следует отметить, что это нестандартная точка зрения. Большинство криптографов вполне устраивают итеративные функции хэширования; опи­ санные проблемы не устраняются даже в новых системах. Некоторые пользо­ ватели функций хэширования предпринимают массу усилий, чтобы избежать проблем. Большинство же удачливых пользователей так и живут, оставаясь в счастливом неведении относительно того, какие неприятности могли с ними приключиться. Между тем неприятности все же случаются и довольно часто. Каждая из этих проблем может быть исправлена путем применения к систе­ ме какого-нибудь специального метода, но нам кажется, что это неправильно

иследует исправить саму функцию хэширования.

6.4.1Полное исправление

До сих пор нам не встречалась литература, посвященная исправлению недостатков функций хэширования. Здесь лишь изложены выводы, к кото­ рым мы пришли в процессе написания этой книги. Все проблемы могут быть устранены, если использовать функцию хэширования дважды. Мы убежде­ ны, что данное решение позволяет избавиться от всех упомянутых недостат­ ков функций хэширования. Но разработка криптографических функций — дело сложное, поэтому дать стопроцентную гарантию пока нельзя. Наше ре­ шение еще не было проанализировано другими экспертами, что обычно зани­ мает долгие годы (если, конечно, им кто-то заинтересуется). Такова жизнь.

Пусть h — одна из рассмотренных функций хэширования. Вместо того чтобы использовать в качестве функции хэширования т i—> h(m ), будем ис­ пользовать функцию т h(h(m) |т)5. Как видите, перед хэшированием сообщения т к его началу было дописано значение h(m). Благодаря этому итеративное вычисление хэш-кода будет сразу же зависеть от всех битов сооб­ щения, что сделает невозможными атаки, осуществляемые путем частичного хэширования или путем удлинения сообщений.

Определение 6. Пусть h — итеративная функция хэширования. Тогда функция хэширования hoBL определяется выражением

hD BLM ■= h(h(m) |m).

Если h является одной из рассмотренных ранее функций хэширования, то мы убеждены, что предложенная конструкция будет обладать уровнем безопасности в п бит, где п — размер результата функции хэширования.

53апись х !-*• f ( x ) — еще один способ обозначения функции. Его применяют тогда, когда не хотят присваивать функции имя. Например, I W I 2 - это функция, которая возводит в квадрат свой аргумент.

6.4 Исправление недостатков

115

Недостатком этого подхода является низкая скорость работы. Сообщение приходится хэшировать дважды, что занимает в два раза больше времени по сравнению с обычным хэшированием. Лично нас это не огорчает, потому что мы всегда ставим безопасность выше скорости. В мире и так достаточно быстрых небезопасных систем, так зачем же разрабатывать еще одну? Тем неменее скорость хэширования является “узким местом” производительности некоторых приложений, поэтому нужно придумать что-нибудь более эффек­ тивное.

Еще одним недостатком этого подхода является необходимость буфериза­ ции всего сообщения тть. Мы больше не сможем подсчитывать хэш-код потока данных по мере их поступления. Некоторые приложения нуждаются в этой возможности, и функция hoBL для них просто не подойдет.

6.4.2 Более эффективное исправление

Как же сохранить полную скорость исходной функции хэширования? Здесь можно немного схитрить. Вместо h(m) можно использовать функцию h(h(m)) и объявить, что ее уровень безопасности составляет всего п/2 бит. Хитрость состоит в том, что обычно от n-битовой функции хэширования ожи­ дают обеспечения уровня безопасности п бит в тех ситуациях, где атака на основе коллизий невозможна6. Все атаки на основе коллизий при частичном хэшировании сообщений используют парадокс задачи о днях рождения, по­ этому, если снизить уровень безопасности до п/2 бит, эти атаки больше не будут подпадать под заявленный уровень безопасности.

В большинстве ситуаций подобное снижение уровня безопасности было бы неприемлемым, но нам повезло. Функции хэширования изначально раз­ рабатывались с учетом возможности осуществления атак на основе коллизий, поэтому размеры результатов функций хэширования довольно велики. Если применить данный прием к функции SHA-256, то будет получена функция хэширования со 128-битовым уровнем безопасности, что в точности соответ­ ствует нашим требованиям.

Некоторые могут возразить, что все n-битовые функции хэширования и так обеспечивают только n/2-битовый уровень безопасности. Это верная точка зрения. К сожалению, если не конкретизировать реальное положение вещей, функции хэширования будут неправильно эксплуатироваться и будет предполагаться, что они должны обеспечивать n-битовый уровень безопас­ ности. Например, многие хотят использовать SHA-256 для хэширования 256битовых ключей алгоритма AES, полагая, что это обеспечит 256-битовый уро­ вень безопасности. Как уже отмечалось, мы используем 256-битовые ключи

вДаже в документации к SHA-256 говорится, что n-битовая функция хэширования должна требовать выполнения 2П шагов для обнаружения прообраза заданного значения.

116

Глава 6. Функции хэширования

для достижения 128-битового уровня безопасности, что в точности совпадает со сниженным уровнем безопасности “исправленной” версии SHA-256. Такое совпадение неслучайно. В обоих случаях разрыв между размером крипто­ графического значения и заявленным уровнем безопасности вызван наличи­ ем атак на основе коллизий. Поскольку мы полагаем, что атаки на основе коллизий существуют всегда, различие между размерами результатов функ­ ций хэширования и уровнями безопасности прекрасно укладывается в нашу концепцию.

Приведем более формальное определение нашего исправления. Определение 7. Пусть h итеративная функция хэширования. Тогда функция хэширования hd определяется выражением hd := h(h(m )) и име­ ет заявленный уровень безопасности, равный min(fc,n/2), где к уровень безопасности функции h, ап размер результата функции хэширования.

В большинстве случаев мы будем применять данную конструкцию к функ­ циям семейства SHA. Для любой функции хэширования SHA-Х , где X рав­ няется 1, 256, 384 или 512, мы определим SHAd — X как функцию, которая отображает т на SHA - X(SHA - Х(т )). В частности, SHAj — 256 — это всего лишь функция т SHA — 256(SHA — 256(m)).

Однако все эти конструкции слишком новы, а потому еще не заслужили доверия. К счастью, можно показать, что наша исправленная функция хэ­ ширования hd обладает, как минимум, такой же стойкостью к атакам, что и исходная функция hJ. Аналогичный подход повторного хэширования ис­ пользуется в алгоритме НМАС для защиты от атак с удлинением сообщения. И функция hnBL, и функция hd позволяют избежать проблемы удлинения сообщения, которая представляет наибольшую угрозу для реальных систем. Вопрос о том, действительно ли функция hj^BL обеспечивает n-битовый уро­ вень безопасности, пока остается открытым. Мы предпочитаем доверять обе­ им функциям на n /2-битовом уровне безопасности, поэтому на практике ре­ комендовали бы использовать более эффективную функцию hd.

6.5Какую функцию хэширования выбрать

Альтернатив не так уж много. Мы бы рекомендовали выбрать одну из функций семейства SHA^. Вопрос состоит лишь в том, какой размер хэшкода и соответственно какая производительность нужны вашей системе.7

73десь мы вновь немного схитрили. Повторное хэширование сокращает множество зна­ чений функции, и осуществлять атаки, в основе которых лежит парадокс задачи о днях рождения, становится немного проще. Данный эффект, однако, имеет очень небольшое влияние и хорошо укладывается в рамки приближений, используемых нами во всех дру­ гих случаях.

6.б Работа на будущее

117

Как уже отмечалось, криптографическое сообщество провело совсем мало работы по изучению функций хэширования. В отличие от блочных шифров, которые часто подвергались различающим атакам, на функции хэширования в большинстве случаев осуществлялись атаки на основе коллизий. Таким об­ разом, еще никто не анализировал функции хэширования с практической точки зрения на предмет соответствия нашему определению безопасности. К счастью, фортуна улыбнулась нам, и функция hi уже позволяет использо­ вать сниженный, n /2-битный уровень безопасности, так что это не проблема. Семейство функций SHA разрабатывалось специально с учетом атак на осно­ ве коллизий, поэтому они должны обеспечивать, как минимум, такой уровень безопасности.

Приведенные аргументы, очевидно, свидетельствуют не в пользу функ­ ции SHAd-1, поскольку ее 80-битового уровня безопасности явно недостаточ­ но для долговременного применения. У нас остаются SHAd-256 и SHAd-512. (Использовать SHAd-384 нет смысла, потому что, проделав такой же объем работы, вы можете получить и SHAd-512.)

Поскольку желательный уровень безопасности наших систем — 128 бит, выбор в качестве функции хэширования SHAd-256 очевиден. Для обеспечения более высоких уровней безопасности следует использовать SHAd-512. Не ду­ майте, однако, что действительно сможете достигнуть такого уровня безопас­ ности — для этого вам понадобился бы хороший блочный шифр с ключами, размер которых превышает 256 бит. И разумеется, падение производительно­ сти, вызванное применением функции SHAd-512, делает ее неприемлемой для многих систем. В подобных случаях вам придется ограничиться 128-битовым уровнем безопасности и функцией SHAd-256.

6.6 Работа на будущее

Над функциями хэширования еще нужно работать и работать. В целом нам кажется, что навыки открытого криптографического сообщества отно­ сительно разработки и взлома функций хэширования находятся примерно на том же уровне, на котором находились наши навыки работы с блочными шифрами в середине 80-х годов прошлого века. Нам предстоит узнать еще очень многое о том, как создавать и взламывать функции хэширования. Хо­ рошим началом могло бы стать осуществление атак на версии функций SHA с сокращенным количеством раундов. Пока же, к сожалению, в этой области не наблюдается никакого прогресса.

Глава 7

Коды аутентичности сообщений

Код аутентичности сообщения (message authentication code MAC)

представляет собой число, которое мешает злоумышленнику подделывать со­ общения. Применение шифрования не дает злоумышленнику читать текст сообщений, но ни в коей мере не мешает ему изменять эти сообщения. На помощь приходит MAC. Как и функции шифрования, коды аутентичности сообщений используют секретный ключ К, известный пользователям А и Б, но неизвестный злоумышленнику Е. Пользователь А отсылает пользователю Б не только само сообщение т , но и значение MAC этого сообщения, вычис­ ленное с помощью соответствующей функции. Пользователь Б проверяет, соответствует ли значение MAC, полученное вместе с сообщением, настояще­ му значению MAC этого сообщения. Если значения не совпадают, сообщение отбрасывается как не прошедшее аутентификацию. Теперь злоумышленник Е не сможет изменить сообщение: не зная ключа К , он не сможет подсчитать правильное значение MAC, которое следовало бы отправить вместе с изме­ ненным сообщением.

В этой главе речь идет только об аутентификации. Как комбинировать шифрование и аутентификацию, рассматривается в главе 8, “Безопасный ка­ нал общения”.

7.1Что такое MAC

Код аутентичности сообщения, или MAC, — это функция, которая при­ нимает на вход два аргумента (ключ К фиксированной длины и сообщение т произвольной длины) и выдает значение фиксированной длины. Функцию вычисления MAC мы будем обозначать как MAC (if, га). Для обеспечения аутентификации сообщения пользователь А отсылает не только сообщение га, но и код аутентичности этого сообщения МАС(АГ, га).

7.2 Идеальная функция вычисления MAC

119

Вначале обсудим особенности функции вычисления MAC. Будьте осто­ рожны: корректное использование функции вычисления MAC — процедура намного более сложная, чем простое применение к сообщению. Мы еще вер­ немся к этой проблеме в разделе 7.8.

7.2Идеальная функция вычисления MAC

Вначале необходимо определить идеальную функцию вычисления MAC. Затем мы определим безопасную функцию вычисления MAC как такую, ко­ торую невозможно отличить от идеальной. Думаем, никого не удивит тот факт, что идеальная функция вычисления MAC является случайным отоб­ ражением. Пусть п — это длина значения MAC в битах.

Определение 8. Идеальная функция вычисления MAC — это случайное отображение всех возмоэюных входных значений на множество п-битовых выходных значений.

Идеальная функция вычисления MAC во многом схожа с идеальной функ­ циейхэширования. И та и другая являются случайными отображениями. Ос­ новное различие между ними заключается в более “мягком” определении без­ опасности функции вычисления MAC, что делает их более эффективными, чем функции хэширования.

7.3 Безопасность MAC

Как уже отмечалось, функция вычисления MAC имеет два входных ар­ гумента — ключ К и сообщение т . Ключ К неизвестен злоумышленнику или, точнее, известен не полностью. В оставшейся части системы может быть слабое место, которое обеспечит злоумышленника частичной информацией оключе К . Пусть к — это неопределенность, которая имеется у злоумышлен­ ника относительно значения К . Под словом “неопределенность” мы понимаем количество битов значения К , которые неизвестны злоумышленнику. В бо­ лее общем случае, если неопределенность равна к, то К может иметь около возможных значений (разумеется, с точки зрения злоумышленника)1.

Определение 9. Пусть п длина значения MAC, а к — неопределенность в битах, которой обладает злоумышленник относительно ключа К. Атака на функцию вычисления MAC — это нетривиальный метод обнаружения

л я формализации неопределенности можно было бы воспользоваться понятием эн­ тропии, но это отвлекло бы нас от текущей темы обсуждения. Для самых дотошных: к это энтропия значения К (в битах) при заданном объеме информации, имеющейся у зло­ умышленника.

120

Глава 7. Коды аутентичности сообщений

различия между функцией вычисления MAC и идеальной функцией вычис­ ления MAC менее чем за 2nun(n'fc) шагов.

Другими словами, функция вычисления MAC — это случайное отобра­ жение, уровень безопасности которого ограничен к битами. Это совсем не то, что обычное случайное отображение. В обычном случайном отображении злоумышленник знает все; в нашем же случае у него есть некая неопределен­ ность относительно значения К . (Если злоумышленник полностью уверен в значении К, тогда к = 0, а значит, уровень безопасности равен нулю и нам нечего обсуждать.)

Разумеется, заявленный уровень безопасности конкретной функции MAC может быть ниже, чем размер ее результата. В этом случае злоумышлен­ ник ограничен 2min(s,fc) шагами, где s — заявленный уровень безопасности. Неопределенность злоумышленника относительно значения К может быть использована для того, чтобы сделать функции вычисления MAC более эф­ фективными, чем функции хэширования.

Следует отметить, что никто другой, кроме нас, не определяет безопас­ ность MAC подобным образом. Большинство исследователей подходят к опре­ делению безопасности MAC с более ограниченной точки зрения. В частности, они используют модель атак, в которой злоумышленник по своему желанию выбирает п различных сообщений и получает значение MAC для каждого из этих сообщений. В результате у злоумышленника должно оказаться п+1 сооб­ щение, каждое с правильным значением MAC. Данная модель не учитывает некоторых типов атак, например атак со связанным ключом и атак, кото­ рые предполагают, что у злоумышленника имеется частичная информация о ключе. Вот почему мы предпочитаем наши определения безопасности, ко­ торые оказываются корректными даже тогда, когда функция используется неправильно или в необычном для нее окружении.

7.4СВС-МАС

Это метод превращения блочного шифра в функцию вычисления MAC. Ключ К при этом используется в качестве ключа шифрования. Основная идея алгоритма СВС-МАС заключается в том, чтобы зашифровать сообще­ ние т с помощью блочного шифра, используя режим СВС, и затем откинуть все блоки шифрованного текста кроме последнего. Для сообщения, состоя­ щего из блоков P i,.. . , Рк, значение MAC вычисляется следующим образом:

Н0 := IV,

H i - E K i P i Q H i - 1),

MAC := # fc.