В криптографии односторонняя функция сжатия — это функция, которая преобразует два входа фиксированной длины в выход фиксированной длины. [1] Преобразование является «односторонним» , что означает, что для конкретного выхода сложно вычислить входы, которые сжимаются до этого выхода. Односторонние функции сжатия не связаны с обычными алгоритмами сжатия данных , которые вместо этого могут быть инвертированы точно (сжатие без потерь) или приблизительно (сжатие с потерями) к исходным данным.
Односторонние функции сжатия используются, например, в конструкции Меркла–Дамгарда внутри криптографических хеш-функций .
Односторонние функции сжатия часто строятся из блочных шифров . Некоторые методы превращения любого обычного блочного шифра в одностороннюю функцию сжатия — это Davies–Meyer , Matyas–Meyer–Oseas , Miyaguchi–Preneel (функции сжатия с длиной одного блока) и MDC-2/Meyer–Schilling , MDC-4 , Hirose (функции сжатия с длиной двух блоков). Эти методы подробно описаны ниже. ( MDC-2 также является названием хэш-функции, запатентованной IBM .)
Другой метод — 2BOW (или NBOW в целом), который представляет собой «высокоскоростную многоблочную хэш-функцию на основе блочных шифров» [1] и обычно достигает (асимптотических) скоростей от 1 до 2 независимо от размера хэша (только с небольшими постоянными накладными расходами). Этот метод еще не подвергался серьезному анализу безопасности, поэтому с ним следует обращаться осторожно.
Функция сжатия смешивает два фиксированных входных данных и создает один фиксированный выходной сигнал того же размера, что и один из входных данных. Это также можно рассматривать как то, что функция сжатия преобразует один большой фиксированный входной сигнал в более короткий фиксированный выходной сигнал.
Например, вход A может быть 128 бит, вход B 128 бит, и они сжимаются вместе в один выход 128 бит. Это эквивалентно тому, что один 256-битный вход сжимается в один выход 128 бит.
Некоторые функции сжатия не сжимают вдвое, а сжимают на какой-то другой фактор. Например, вход A может быть 256 бит, а вход B 128 бит, которые сжимаются в один выход из 128 бит. То есть, в общей сложности 384 входных бита сжимаются вместе в 128 выходных бит.
Смешивание производится таким образом, что достигается полный лавинный эффект . То есть каждый выходной бит зависит от каждого входного бита.
Односторонняя функция — это функция, которую легко вычислить, но трудно инвертировать. Односторонняя функция сжатия (также называемая хэш-функцией) должна иметь следующие свойства:
В идеале хотелось бы, чтобы «неосуществимость» в стойкости к прообразу и стойкости ко второму прообразу означала работу примерно где — число бит в выходных данных хэш-функции. Однако, особенно для стойкости к второму прообразу, это сложная проблема. [ необходима цитата ]
Распространенное использование односторонних функций сжатия — конструкция Меркла–Дамгарда внутри криптографических хэш-функций. Наиболее широко используемые хэш-функции, включая MD5 , SHA-1 (которая устарела [2] ) и SHA-2, используют эту конструкцию.
Функция хэширования должна быть способна преобразовывать сообщение произвольной длины в вывод фиксированной длины. Этого можно добиться, разбив входные данные на ряд блоков одинакового размера и последовательно обрабатывая их с помощью односторонней функции сжатия. Функция сжатия может быть специально разработана для хэширования или построена на основе блочного шифра. Последний обработанный блок также должен быть дополнен длиной , что имеет решающее значение для безопасности этой конструкции.
При применении дополнения длины (также называемого MD-усилением) атаки не могут находить коллизии быстрее, чем парадокс дней рождения ( , размер блока в битах), если используемая функция устойчива к коллизиям. [3] [4] Таким образом, конструкция хэша Меркла–Дамгарда сводит проблему поиска правильной хэш-функции к поиску правильной функции сжатия.
Вторая атака на прообраз (при наличии сообщения, которое злоумышленник находит для удовлетворения другим сообщением, может быть выполнена согласно Келси и Шнайеру [5] для сообщения -message-block за время . Сложность этой атаки достигает минимума для длинных сообщений, когда и приближается к минимуму, когда сообщения короткие.
Односторонние функции сжатия часто строятся на основе блочных шифров.
Блочные шифры принимают (как и односторонние функции сжатия) два входных сигнала фиксированного размера ( ключ и открытый текст ) и возвращают один единственный выходной сигнал ( шифротекст ), который имеет тот же размер, что и входной открытый текст.
Однако современные блочные шифры являются лишь частично односторонними. То есть, имея открытый текст и шифротекст, невозможно найти ключ, который зашифрует открытый текст в шифротекст. Но имея шифротекст и ключ, можно найти соответствующий открытый текст, просто используя функцию дешифрования блочного шифра. Таким образом, чтобы превратить блочный шифр в одностороннюю функцию сжатия, необходимо добавить некоторые дополнительные операции.
Некоторые методы превращения любого обычного блочного шифра в одностороннюю функцию сжатия — это Дэвис–Майер, Матьяс–Майер–Осеас, Миягучи–Пренель (функции сжатия с длиной одного блока) и MDC-2, MDC-4, Хиросе (функции сжатия с длиной двух блоков).
Функции сжатия с длиной одного блока выводят то же количество бит, что и обработанное базовым блочным шифром. Следовательно, функции сжатия с длиной двух блоков выводят в два раза большее количество бит.
Если блочный шифр имеет размер блока , скажем, 128 бит, методы с одинарной длиной блока создают хэш-функцию с размером блока 128 бит и производят хэш из 128 бит. Методы с двойной длиной блока создают хэши с удвоенным размером хэша по сравнению с размером блока используемого блочного шифра. Таким образом, 128-битный блочный шифр можно превратить в 256-битную хэш-функцию.
Эти методы затем используются внутри конструкции Меркла–Дамгарда для построения фактической хэш-функции. Эти методы подробно описаны ниже.
Использование блочного шифра для построения односторонней функции сжатия для хэш-функции обычно несколько медленнее, чем использование специально разработанной односторонней функции сжатия в хэш-функции. Это связано с тем, что все известные безопасные конструкции выполняют планирование ключей для каждого блока сообщения. Блэк, Кокран и Шримптон показали, что невозможно построить одностороннюю функцию сжатия, которая делает только один вызов блочного шифра с фиксированным ключом. [6] На практике разумные скорости достигаются при условии, что планирование ключей выбранного блочного шифра не является слишком тяжелой операцией.
Но в некоторых случаях это проще, потому что одна реализация блочного шифра может использоваться как для блочного шифра, так и для хэш-функции. Это также может сэкономить место в коде в очень маленьких встроенных системах, таких как, например, смарт-карты или узлы в автомобилях или других машинах.
Таким образом, хэш-скорость или скорость дает представление об эффективности хэш-функции, основанной на определенной функции сжатия. Скорость итерированной хэш-функции описывает соотношение между числом операций блочного шифра и выходными данными. Точнее, скорость представляет собой соотношение между числом обработанных битов ввода , выходной битовой длиной блочного шифра и необходимыми операциями блочного шифра для получения этих выходных битов. Как правило, использование меньшего количества операций блочного шифра приводит к лучшей общей производительности всей хэш-функции, но это также приводит к меньшему значению хэш-функции, что может быть нежелательным. Скорость выражается формулой:
Функцию хеширования можно считать безопасной только в том случае, если выполняются как минимум следующие условия:
Представленные ниже конструкции: Дэвиса–Мейера, Матьяса–Мейера–Осеаса, Миягучи–Пренеля и Хиросе, как было показано, являются безопасными при анализе черного ящика . [7] [8] Цель состоит в том, чтобы показать, что любая атака, которая может быть найдена, не более эффективна, чем атака дня рождения при определенных предположениях. Модель черного ящика предполагает, что используется блочный шифр, который случайно выбирается из набора, содержащего все соответствующие блочные шифры. В этой модели злоумышленник может свободно шифровать и расшифровывать любые блоки, но не имеет доступа к реализации блочного шифра. Функция шифрования и расшифровки представлена оракулами, которые получают пару либо открытого текста и ключа, либо зашифрованного текста и ключа. Затем оракулы отвечают случайно выбранным открытым текстом или зашифрованным текстом, если пара была запрошена в первый раз. Они оба разделяют таблицу для этих триплетов, пары из запроса и соответствующего ответа, и возвращают запись, если запрос был получен во второй раз. Для доказательства есть алгоритм поиска коллизий, который делает случайно выбранные запросы к оракулам. Алгоритм возвращает 1, если два ответа приводят к коллизии с участием хэш-функции, которая построена из функции сжатия, применяющей этот блочный шифр (0 в противном случае). Вероятность того, что алгоритм вернет 1, зависит от количества запросов, которые определяют уровень безопасности.
Функция сжатия единичного блока Дэвиса-Майера подает каждый блок сообщения ( ) как ключ к блочному шифру. Она подает предыдущее значение хэша ( ) как открытый текст для шифрования. Затем выходной шифртекст также подвергается операции XOR (⊕) с предыдущим значением хэша ( ) для получения следующего значения хэша ( ). В первом раунде, когда нет предыдущего значения хэша, он использует постоянное заранее заданное начальное значение ( ).
В математической нотации уравнение Дэвиса–Мейера можно описать следующим образом:
Схема имеет скорость (k — размер ключа):
Если блочный шифр использует, например, 256-битные ключи, то каждый блок сообщения ( ) представляет собой 256-битный фрагмент сообщения. Если тот же блочный шифр использует размер блока 128 бит, то входные и выходные хеш-значения в каждом раунде составляют 128 бит.
Вариации этого метода заменяют XOR любой другой групповой операцией, например, сложением 32-битных беззнаковых целых чисел.
Примечательным свойством конструкции Дэвиса–Майера является то, что даже если базовый блочный шифр полностью безопасен, возможно вычислить фиксированные точки для конструкции: для любого можно найти значение такое, что : нужно просто установить . [9] Это свойство, которым случайные функции, безусловно, не обладают. До сих пор ни одна практическая атака не была основана на этом свойстве, но следует знать об этой «особенности». Фиксированные точки могут быть использованы во второй атаке прообраза (при наличии сообщения , злоумышленник находит другое сообщение для удовлетворения ) Келси и Шнайера [5] для сообщения -message-block за время . Если конструкция не позволяет легко создавать фиксированные точки (например, Matyas–Meyer–Oseas или Miyaguchi–Preneel), то эта атака может быть выполнена за время. В обоих случаях сложность выше, но ниже , когда сообщения длинные, и что, когда сообщения становятся короче, сложность атаки приближается к .
Безопасность конструкции Дэвиса–Майера в модели идеального шифра была впервые доказана Р. Винтерницем. [10]
Функцию одностороннего сжатия Матиаса–Майера–Осеаса с длиной блока можно считать двойственной (противоположной) функции Дэвиса–Майера.
Он подает каждый блок сообщения ( ) как открытый текст для шифрования. Затем выходной шифртекст также подвергается операции XOR (⊕) с тем же блоком сообщения ( ) для получения следующего значения хэша ( ). Предыдущее значение хэша ( ) подается как ключ к блочному шифру. В первом раунде, когда нет предыдущего значения хэша, он использует постоянное заранее заданное начальное значение ( ).
Если блочный шифр имеет разные размеры блока и ключа, то хэш-значение ( ) будет иметь неправильный размер для использования в качестве ключа. Шифр также может иметь другие специальные требования к ключу. Затем хэш-значение сначала проходит через функцию для преобразования/дополнения, чтобы подойти в качестве ключа для шифра.
В математической нотации уравнение Матьяша–Майера–Осеаса можно описать следующим образом:
Схема имеет ставку:
Вторая атака прообраза (при наличии сообщения злоумышленник находит другое сообщение для удовлетворения ) может быть выполнена согласно Келси и Шнайеру [5] для сообщения -message-block за время . Сложность выше, но ниже, когда сообщения длинные, и что когда сообщения становятся короче, сложность атаки приближается к .
Функция сжатия одностороннего блока длины Миягучи–Пренеля является расширенным вариантом функции Матьяса–Майера–Осеаса. Она была независимо предложена Сёдзи Миягучи и Бартом Пренелем .
Он подает каждый блок сообщения ( ) как открытый текст для шифрования. Затем выходной шифртекст подвергается операции XOR (⊕) с тем же блоком сообщения ( ), а затем также подвергается операции XOR с предыдущим значением хеша ( ) для получения следующего значения хеша ( ). Предыдущее значение хеша ( ) подается как ключ к блочному шифру. В первом раунде, когда нет предыдущего значения хеша, он использует постоянное заранее заданное начальное значение ( ).
Если блочный шифр имеет разные размеры блока и ключа, то хэш-значение ( ) будет иметь неправильный размер для использования в качестве ключа. Шифр также может иметь другие специальные требования к ключу. Затем хэш-значение сначала проходит через функцию для преобразования/дополнения, чтобы подойти в качестве ключа для шифра.
В математической нотации уравнение Миягути–Пренеля можно описать следующим образом:
Схема имеет ставку:
Роли и можно поменять местами, так что шифруется ключом , что делает этот метод расширением метода Дэвиса–Майера.
Вторая атака прообраза (при наличии сообщения злоумышленник находит другое сообщение для удовлетворения ) может быть выполнена согласно Келси и Шнайеру [5] для сообщения -message-block за время . Сложность выше, но ниже, когда сообщения длинные, и что когда сообщения становятся короче, сложность атаки приближается к .
Односторонняя функция сжатия Hirose [8] двойной длины блока состоит из блочного шифра и перестановки . Она была предложена Shoichi Hirose в 2006 году и основана на работе [11] Mridul Nandi.
Он использует блочный шифр, длина ключа которого больше длины блока , и создает хэш размером . Например, любой из кандидатов AES с 192- или 256-битным ключом (и 128-битным блоком).
Каждый раунд принимает часть сообщения длиной в биты и использует ее для обновления двухбитных значений состояния и .
Сначала объединяется с для создания ключа . Затем два значения обратной связи обновляются в соответствии с:
— произвольная перестановка без фиксированной точки для -битного значения, обычно определяемая как для произвольной ненулевой константы (все единицы могут быть удобным выбором).
Каждое шифрование напоминает стандартную конструкцию Дэвиса–Майера. Преимущество этой схемы перед другими предлагаемыми схемами с двойной длиной блока заключается в том, что оба шифрования используют один и тот же ключ, и, таким образом, усилия по планированию ключей могут быть разделены.
Окончательный вывод — . Схема имеет скорость относительно шифрования сообщения с помощью шифра.
Хиросе также приводит доказательство в модели идеального шифра.
Губчатую конструкцию можно использовать для построения функций одностороннего сжатия.