46. Функции хэширования. Требования предъявляемые к функциям хэширования. Ключевые функции хэширования. Безключевые функции хэширования.
Для решения задач обеспечения целостности наблюдаемости и подлинности информации применяются криптографические контрольные суммы. Методы формирования криптографических контрольных сумм можно разделить на два класса: на базе симметричных криптографических преобразований (коды аутентификации сообщений (КАС)) и использующие несимметричные преобразования (цифровые подписи) с применением секретных ключей. Такие функции могут применяться как непосредственно в качестве криптографической контрольной суммы, так и в других преобразованиях. Например, для формирования цифровой подписи необходима эффективная функция отображения сообщения в образ небольшой фиксированной длины (хэш-значение, хэш-код или просто хэш). Эти функции называют функциями хэширования или хэш-функциями.
Функцией хэширования (в
широком смысле) называется функция ,
удовлетворяющая минимум двум требованиям [1]:
1.
Сжатие – функция отображает
входное сообщение
произвольной
конечной длины в хэш-значение
небольшой
фиксированной длины, при этом входное сообщение будем называть прообразом.
2.
Простота вычисления – для заданной функции
и
сообщения
,
вычисляется
не выше чем с полиномиальной сложностью.
Все существующие функции хэширования можно разделить на два больших класса: бесключевые хэш-функции, зависящие только от сообщения, и хэш-функции с секретным ключом, зависящие как от сообщения, так и от секретного ключа.
Подклассом бесключевых хэш-функций являются коды обнаружения изменений (modification detection codes, MDC-коды). В криптографии применяются специфические подклассы MDC-кодов, являющиеся однонаправленными и бесколлизионными хэш-функциями, которые получили широкое распространение в системах цифровой подписи.
Функции выработки кодов аутентификации сообщений (КАС) являются подклассом ключевых хэш-функций и обладают дополнительным свойством вычислительной стойкости.
По используемым внутренним преобразованиям функции хэширования можно разделить на:
· функции, использующие битовые логические преобразования. Эти функции применяют к входному сообщению побитовые нелинейные операции “И”, “ИЛИ”, “НЕ”, “ИСКЛЮЧАЮЩЕЕ ИЛИ”, различные сдвиги и, как правило, являются многоцикловыми;
· функции, использующие блочные симметричные шифры. Используются в основном для реализации функций выработки КАС;
· функции, использующие преобразования в группах, полях и кольцах с целочисленным или полиномиальным базисом;
· функции, использующие матричные преобразования.
Ключевые функции хеширования
В криптографических приложениях к ключевым функциям хеширования предъявляются следующие основные требования:
— невозможность фабрикации;
— невозможность модификации.
Первое требование означает высокую сложность подбора сообщения с правильным значением свертки. Второе — высокую сложность подбора для заданного сообщения с известным значением свертки другого сообщения с правильным значением свертки.
Иногда эти свойства объединяют в
одно более сильное свойство — свойство вычислительной устойчивости. Это
требование означает высокую сложность подбора для заданного множества сообщений(быть
может, пустого) с известными значениями сверток еще одного сообщения х,
,
с правильным значением свертки (возможен случай
).
Ключевые функции применяются в ситуациях, когда стороны доверяют друг другу и могут иметь общий секретный ключ. Обычно в этих условиях не требуется, чтобы система обеспечивала защиту в случае отказа получателя от факта получения сообщения или его подмены. Поэтому от ключевых хеш-функций не требуется устойчивости к коллизиям.
Обычные атаки на ключевые хеш-функции заключаются в имитации, то есть в передаче сфабрикованных сообщений в пустом канале, а также в подмене передаваемых сообщений с целью навязывания приемной стороне ложных сообщений.
Заметим, что из свойства вычислительной устойчивости вытекает невозможность определения ключа, используемого хеш-функцией, так как знание ключа дает возможность вычислять значение свертки для любого набора данных. В то же время обратное утверждение неверно, так как подбор значения функции хеширования возможен в некоторых случаях без предварительного определения ключа.
В качестве примера рассмотрим широко распространенную хеш-функцию, построенную на основе одношаговой сжимающей функции вида
где— алгоритм
блочного шифрования.
Для вычисления значения
h(M)
сообщение
Μ
представляется в виде
последовательности
n-битовых
блоков . Если при
этом длина сообщения не кратна длине блока, то последний блок неким специальным
образом дополняется до полного блока. Алгоритм вычисления свертки имеет
следующий вид:
(2)
Такой режим в ГОСТе 28147-89 называется режимом выработки имитовставки.
В случае когда ключ добавляется в
конец сообщения согласно формуле , знание
коллизии для функции
h,
то есть пары
,
такой, что
,
позволяет вычислять значения
для любого
ключа к. Поэтому трудоемкость модификации сообщения
оценивается
не величиной
а сравнима
с трудоемкостью поиска коллизии, оцениваемой величиной
, так как в
данном случае применима атака, основанная на парадоксе "дней рождений".
В связи с этим более предпочтительными являются способы введения ключа, при которых ключ вставляется в сообщение не один, а, по крайней мере, два раза. Два таких способа:
где—
дополнения ключа к до размера, кратного
длине блока п. Для
определенных бесключевых хеш-функций
h
такой подход позволяет
строить эффективно вычислимые и устойчивые к атакам ключевые хеш-функции.
Недостатком
такого метода является слишком
большая длина
η свертки. Дело в том,
что для целей проверки целостности обычно выбирают длину свертки
n
в пределах 32-64, а для
аутентификации необходимо условие
Бесключевые функции хеширования
Обычно требуется, чтобы бесключевые хеш-функции обладали следующими свойствами:
1) однонаправленность,
2) устойчивость к коллизиям,
3) устойчивость к нахождению второго прообраза, означающими соответственно высокую сложность нахождения сообщения с заданным значением свертки; пары сообщений с одинаковыми значениями свертки; второго сообщения с тем же значением свертки для заданного сообщения с известным значением свертки.
Например, хеш-функция CRC-32, представляющая собой контрольную сумму, является линейным отображением и поэтому не удовлетворяет ни одному из этих трех свойств.
Для построения примера
хеш-функции, удовлетворяющей свойству 1), рассмотрим функцию, заданную
формулой
—
алгоритм блочного шифрования. Такая функция является однонаправленной по обоим
аргументам. Поэтому на ее основе можно построить хеш-функцию по правилу (1),
определив одношаговую сжимающую функцию одной из следующих формул:
Первая из этих функций лежит в основе российского стандарта хеш-функции, а вторая — в основе американского стандарта SHA.
Справедливо следующее
Утверждение 1. Если функция хеширования h построена на основе одношаговой сжимающей функции f по правилу (1), то из устойчивости к коллизиям функции f следует устойчивость к коллизиям функции h.
[Действительно, если у функции
h
имеется коллизия, то на
некотором шаге
i
должна существовать коллизия у
функции f
(при определении коллизий функцию следует
рассматривать как функцию от одного переменного, полученного конкатенацией
переменных
в один
входной вектор)].
Укажем взаимозависимость между свойствами 1) и 2).
Утверждение 2. Если хеш-функция устойчива к коллизиям, то она устойчива к нахождению второго прообраза.
[Действительно, если для заданной пары сообщение-свертка можно подобрать второй прообраз, то полученная пара сообщений будет составлять коллизию.]
Утверждение 3. Устойчивая к коллизиям хеш-функция не обязана быть однонаправленной.
В качестве примера несжимающей функции приведем функцию h(x) = χ, которая, очевидно, является устойчивой к коллизиям и к нахождению второго прообраза, но не является однонаправленной.
В качестве примера сжимающей хеш-функции рассмотрим функцию h, определенную условиями
h(x) = (1, χ) , если битовая длина χ равна п,
h(x) = (0, g(x)), если битовая длина χ больше п,
где g(x) — сжимающая n-битовая функция, устойчивая к коллизиям. Функция h также является устойчивой к коллизиям и к нахождению второго прообраза, но, очевидно, не является однонаправленной.
Утверждение 4. Пусть
—
хеш-функция и
.
Тогда если существует эффективный алгоритм обращения функции
h,
то существует вероятностный алгоритм нахождения коллизии функции
h
с вероятностью успеха,
большей 1/2.
Доказательство. Будем случайно и
равновероятно выбирать сообщение х, вычислять и
сравнивать
. Покажем,
что данный алгоритм имеет вероятность успеха
. Под
успехом мы понимаем построение
,
отличного от х
Пусть
— разбиение
X
на классы, состоящие из
сообщений с одинаковыми значениями хеш-функции. Ясно, что
.
Легко заметить, что выполняются следующие соотношения:
Утверждение доказано.
Заметим, что трудоемкость подбора
прообраза для однонаправленной функции или трудоемкость поиска второго
прообраза оцениваются величиной. В то же
время трудоемкость поиска коллизии оценивается величиной
, так как
в данной ситуации применима атака, основанная на парадоксе "дней рождений".
Рассмотрим конкретные примеры хеш-функций, построенных на основе некоторых алгоритмов преобразования блоков.
Пусть— алгоритм
блочного шифрования,
n
— размер блока,
l
— размер ключа, и
G
— некоторое
отображение, ставящее в соответствие вектору длины
η
вектор длины
l.
Примеры бесключевых хеш-функций дают известные алгоритмы MD-4, MD-5 и SHA. Они оперируют с блоками длины и, совпадающей с длиной результирующего значения свертки, причем η = 128 для алгоритма MD-4, и η = = 160 для MD-5 и SHA. Указанные алгоритмы спроектированы специально с учетом эффективной реализации на 32-разрядных ЭВМ.
При их использовании исходное
сообщение Μ
разбивается на блоки
длиной т = 512 бит. Последний блок формируется путем дописывания к концу
сообщения комбинации до
получения блока размера 448 бит, к которому затем добавляется комбинация из 64
бит, представляющая битовую длину сообщения. Затем вычисляется значение свертки
согласно процедуре (1) с использованием одношаговой сжимающей функции, заданной
формулой
где
χ
—блок сообщения длины т =
512 бит, Η—
блок из η
бит, а Ех
— некоторое преобразование множества блоков. Значение начального вектора
определяется в описании преобразования Ех.
В стандарте хеш-функции ГОСТ Ρ 34.11-94 приняты значения n = т — 512. Одношаговая сжимающая функция f(x, Η), используемая для вычисления последовательности
значений, построена
на базе четырех параллельно работающих схем блочного шифрования (ГОСТ 28147-89),
каждая из которых имеет 256-битовый ключ и оперирует с блоками размера 64 бита.
Каждый из ключей вычисляется в соответствии с некоторой линейной функцией от
блока исходного сообщения
и значения
. Значение
является
линейной функцией от результата шифрования, блока исходного сообщения
и значения
. После
вычисления значения
для
последовательности блоков
применяют
еще два шага вычисления согласно формуле:
где Ζ — сумма по модулю два всех блоков сообщения, a L — длина сообщения.
Анализ условий применения функций хэширования и практического их использования позволил сформулировать требования, предъявляемые к применяемым в криптографии бесключевым хэш-функциям. Они состоят в следующем:
3.
Стойкость к вычислению прообраза – невозможность нахождения
неизвестного прообраза для любых предварительно заданных хэш-значений, т.е. для
заданной хэш-функции вычислительно
невозможно найти неизвестный прообраз
при
предварительно заданном хэш-значении
для
любого значения
.
Под термином “вычислительно невозможно” здесь и далее будем понимать, что
алгоритм, выполняющий данное преобразование, обладает не менее чем
экспоненциальной сложностью.
4.
Стойкость к вычислению второго прообраза – невозможность
нахождения любого другого прообраза, который давал бы такое же хэш-значение, как
и заданный, т.е. для заданной хэш-функции
и
прообраза
вычислительно
невозможно найти другой прообраз
,
для которого выполнялось бы условие
.
5.
Стойкость к коллизиям – невозможность нахождения двух прообразов
для которых вырабатывалось бы одинаковое значение, т.е. для заданной хэш-функции
вычислительно
невозможно найти два прообраза
и
,
,
для которых выполнялось бы условие
.
Требование стойкости к коллизиям является более жестким, чем требование стойкости к вычислению второго прообраза, так как предполагает произвольный выбор двух прообразов.
Однонаправленной
хэш-функцией называется функция ,
удовлетворяющая требованиям сжатия, простоты вычисления, стойкости к вычислению
прообраза и стойкости к вычислению второго прообраза.
Бесколлизионной
хэш-функцией называется функция ,
удовлетворяющая требованиям сжатия, простоты вычисления, стойкости к вычислению
второго прообраза и стойкости к коллизиям.
На практике обычно используются хэш-функции, являющиеся одновременно бесколлизионными и однонаправленными.
Однонаправленные хэш-функции могут применяться для решения других задач, например, выработки ключей и псевдослучайных чисел. Для применения в таких задачах хэш-функция должна удовлетворять следующим требованиям [2]:
6. Отсутствие корреляции – входные и выходные биты не должны коррелировать, т.е. изменение любого входного бита приводит к большим непредсказуемым изменениям выходных бит.
7.
Стойкость к близким коллизиям – для заданной однонаправленной
функции вычислительно
невозможно найти два прообраза
и
,
для которых хэш-значения
и
отличались
бы на малое количество бит.
8.
Стойкость к частичной однонаправленности – вычислительно
невозможно восстановить любую часть входного сообщения так же, как и все
сообщение. Более того, по любой известной части входного сообщения вычислительно
невозможно восстановить оставшуюся часть (восстановление
неизвестных
бит требует не менее чем
операций).
9. Возможность работы в режиме растягивания – возможность вычисления хэш-функции при длине входного сообщения меньше чем длина хэш-значения.
Требование, предъявляемое к применяемым в криптографии хэш-функциям с секретным ключом, следующее:
вычислительная стойкость – невозможность нахождения хэш-значения для
заданного сообщения без известного секретного ключа, т.е. для заданной ключевой
хэш-функции и
одной или более корректных пар прообразов и хэш-значений
и
неизвестном секретном ключе
вычислительно
невозможно найти другую корректную пару
для
любого
.
Требование
вычислительной стойкости предполагает выполнение требования стойкости ключа (по
одной или более корректных пар прообразов и хэш-значения
вычислительно
невозможно восстановить секретный ключ
),
однако, требование стойкости ключа не предполагает выполнение требования
вычислительной стойкости.
Функция хэширования с
секретным ключом является
функцией выработки КАС, если выполняются требования сжатия,
вычислительной простоты (при известном сеансовом ключе) и вычислительной
стойкости.
Следует различать функции выработки КАС и однонаправленные хэш-функции с секретным ключом, являющимся частью сообщения, так как они обладают различными свойствами. В функциях выработки КАС секретный ключ применяется к каждому блоку сообщения, а в однонаправленных хэш-функциях ключ используется префиксным (в начале сообщения), постфиксным (в конце сообщения) или комбинированным методом, что снижает стойкость функции.