
8 Лекция - Криптографические функции хеширования
.pdf1
КРИПТОГРАФИЧЕСКИЕ ФУНКЦИИ ХЕШИРОВАНИЯ
Под функцией хеширования традиционно понимается сжимающее отображение, переводящее объекты множества с большой, быть может, бесконечной мощностью в объекты множества с маленькой мощностью. Такие отображения находят применение в различных прикладных областях, например в алгоритмах поиска и хранения данных или при вычислении контрольных сумм файлов, хранящихся на устройствах долговременного хранения.
Вкриптографических приложениях функции хеширования используются для выработки кодов целостности передаваемых или хранимых сообщений, для сжатия сообщений при вычислении цифровой подписи, а также для аутентификации пользователей и передаваемых ими данных. Учитывая это, сжимающие отображения, используемые в криптографических приложениях, должны удовлетворять дополнительным условиям. Далее мы подробно остановимся на этих условиях и покажем, как их нарушение может привести к нарушению целостности или аутентичности.
Взависимости от области применения криптографические функции хеширования делят на два класса:
Бесключевые функции, результат действия которых - код целостности - зависит только от передаваемого или хранимого сообщения. Поскольку вычислить код целостности может любой, кто знает сообщение, то бесключевые функции не защищают передаваемые сообщения от подделки, поскольку вместе с модификацией сообщения нарушитель может подделать и его код целостности.
Ключевые функции, результат действия которых - код аутентичности - зависит не только от сообщения, но и от секретного ключа, который, как правило, называют ключом аутентификации. Вычислить или проверить код аутентичности сообщения может только тот, кто владеет секретным ключом аутентификации.
Стоит отметить, что к последним функциям также относят режимы выработки имитовставки для блочных шифров, а также режимы блочного шифрования с возможностью аутентификации, то есть зависящие от одного или нескольких секретных ключей преобразования, которые позволяют одновременно зашифровать сообщение и выработать код его аутентичности.
Бесключевые функции хеширования
Вначале дадим формальное определение бесключевой функции хеширования. Без ограничения общности будем считать, что функция хеширования применяется к сообщениям, которые могут быть представлены произвольными двоичными последовательностями.
Определение. Пусть для некоторого натурального n задано отображение
H:V* Vn .
Мы будем называть это отображение бесключевой функцией хеширования, если выполнены следующие условия.
1.Отображение Н должно быть однонаправленным, то есть для любого h Vn
задача определения какого-либо значения a V* такого, что H a h , должна являться трудоемкой.
Задача определения значения a V*, удовлетворяющего равенству H a h для
заданного значения h Vn называется задачей вычисления прообраза функции
хеширования.
2. Задача построения коллизии, то есть определения двух произвольных значений a1,a2 V* таких, что H a1 H a2 , a1 a2 , должна являться трудоемкой. Пара величин a1,a2 V* , для которых выполнено это равенство, называется коллизией для

2
бесключевой функции хеширования Н.
3. Задача построения второго прообраза, то есть задача нахождения, для заданного элемента a1 V* и, соответственно, значения h H a1 , h Vn , какого-либо
элемента a2 V* , удовлетворяющего равенству |
H a1 H a2 , должна являться |
трудоемкой.
Прокомментируем данное определение. Как мы говорили ранее, для подтверждения целостности зашифрованное сообщение передается по открытым каналам связи вместе со своим кодом целостности - результатом действия функции H. При этом, как правило, код целостности передается в открытом, незашифрованном виде. Таким образом, нарушение условия однонаправленности функции H приводит к возможности определения зашифрованного сообщения.
Второе и третье условия из данного нами определения играют важную роль при использовании бесключевой функции хеширования в схемах цифровой подписи. Построение коллизии для функции H приводит к построению двух различных сообщений, обладающих одной и той же цифровой подписью, что является недопустимым, например, при подписи финансовых и юридических документов. Более подробно о цифровой подписи мы поговорим позднее.
Методы построения функций хеширования
Общий способ построения функций хеширования был предложен Ральфом Мерклем (Ralf Merkel) и несколько позже модифицирован Айвоном Дамгардом (Ivan Damgard). Основная идея данного способа заключается в использовании итеративной процедуры, которая обрабатывает входное сообщение за несколько итераций.
Опишем алгоритм Меркля-Дамгарда. На первом этапе зафиксируем натуральное число b 1 и разобьем исходное сообщение a V* на блоки длины b:
a a1 ||a2 ||...||ar 1 ||ar ,
где ai Vb , i 1,r 1 при r 1 и длина последнего блока удовлетворяет неравенству
len ar b.
Для реализации основного этапа алгоритма Меркля-Дамгарда необходимо зафиксировать отображение
f :Vn Vb Vn
которое принято называть одношаговой сжимающей функцией, а также начальное значение h0 Vn . Далее вычислим последовательность
hi f hi 1,ai ,hi Vn ,i 1,r 1
и определим |
|
H a g h |
,a |
, |
|
где |
g:V V |
V |
некоторое |
завершающее |
|||
преобразование. |
|
r 1 |
r |
|
|
|
n |
len ar |
n |
|
|
||
|
|
|
|
|
|
|
|
g заключается |
|
||||
Как правило, |
завершающее |
преобразование |
в следующем. |
||||||||||
Определим блок ar* равенством |
|
|
|
|
|
|
|
|
|||||
ar ,if |
len ar b |
|
|
|
|
|
|
|
|
|
|||
|
|
||01|| |
0...0 ,if |
len a |
|
b |
|
|
|
|
|
||
ar* a |
|
|
|
|
|
|
|
||||||
|
r |
|
|
|
|
|
r |
|
|
|
|
|
|
|
|
|
b len ar 2 |
|
|
|
|
|
|
|
|
|
Тогда отображение g задается равенством g hr 1,ar f hr 1,ar* hr
Данный вид преобразования g был предложен Дамгардом и позволил избавиться от неоднозначности при хешировании сообщений, длина которых не кратна b. Позднее мы

3
приведем примеры отображения g, имеющего более сложную структуру.
Таким образом, бесключевая функция хеширования H задается набором своих параметров:
1.п — длина кода целостности,
2.b — длина блока разбиения входных данных,
3.f — одношаговая сжимающая функция,
4.g — завершающее преобразование последнего блока,
5.h0 — начальное значение последовательности h0,h1,...hr, последний элемент
которой является значением функции хеширования, и полностью определяется равенством
H a H a1 ||a2 ||...||ar 1 ||ar g f ...f f h0,a1 ,a2 ,....,ar 1 ,ar (*)
Далее будем считать, что для каждой исследуемой функции перечисленные нами параметры n,b,f,g,h0 зафиксированны.
Приведем утверждение, из которого следует, что предложенный Мерклем и Дамгардом алгоритм позволяет свести анализ бесключевой функции хеширования H к анализу свойств одношаговой сжимающей функции.
Утверждение. Если функция хеширования Н построена с помощью алгоритма Меркля-Дамгарда, то сложность построения коллизии для одношаговой функции f сравнима со сложностью построения коллизии для функции Н.
Как следует из доказательства этого утверждения, приведенного в пособии Лося, нарушения свойства однонаправленности функции fh(a) и существование эффективного алгоритма построения коллизий для одношаговой функции f приводят к возможности построения коллизии для функции хеширования Н. Таким образом, становится важным изучение свойств одношаговой сжимающей функции f.
Наиболее часто используемым способом построения одношаговой функции хеширования f является использование блочных алгоритмов шифрования. Приведем несколько примеров.
1. Микаэлем Рабиным был предложен следующий способ построения функции f. Пусть Е(k,а) — произвольный алгоритм блочного шифрования, в котором ключ
шифрования k Vm, а блок открытого текста a Vn. Тогда выберем длину блока b = т
равной длине ключа k, некоторое значение h0 Vn и определим
hi f hi 1,ai E ai ,hi 1 ,i 1,r
где блоки a1,a2,...,ar 1,ar хешируемого сообщения воспринимаются как последовательность ключей, используемая для последовательного шифрования фиксированного начального значения h0 . Длина кода целостности в алгоритме Рабина
составляет п бит и совпадает с длиной блока алгоритма блочного шифрования.
2. В алгоритме Дэвиса-Мейера, являющемся модификацией алгоритма Рабина, используется дополнительное сложение по модулю, то есть
hi f hi 1,ai E ai ,hi 1 hi 1,i 1,r .
3. В алгоритме Матиаса-Мейера-Осеаса дополнительно используется расширяющее отображение e:Vn Vm отображающее двоичные векторы длины, совпадающей с длиной
блока п алготритма шифрования, в двоичные векторы длины m, совпадающей с длиной ключа алгоритма шифрования.
Последовательность блоков a1,a2,...,ar 1,ar рассматривается как по-
следовательность блоков для шифрования, то есть b = п и h0 Vn . Тогда hi f hi 1,ai E e hi 1 ,ai ai ,i 1,r .

4
4. В алгоритме Миягучи-Принеля, расширяющем предыдущий пример, используется отображение
hi f hi 1,ai E e hi 1 ,ai ai hi 1,i 1,r .
Как видно из приведенных примеров, простое использование алгоритма блочного шифрования позволяет получить длину кода целостности п, равную длине блока алгоритма шифрования. Для блочных шифров с длиной блока п = 64 бита длина такого кода может оказаться недостаточной.
Для расширения длины кода целостности - построения одношаговых сжимающих функций с большей размерностью выхода - могут использоваться одношаговые функции с меньшей размерностью. Наиболее простым способом является взаимное перемешивание двух блоков, то есть определение отображения
f :V2n Vb V2n
использующее любую из определенных выше в примерах одношаговых функций f :Vn Vb Vn следующим образом.
Пусть 1, 2, 3, 4 - произвольная, отличная от единичной, перестановка из
S4. Мы можем представить любой вектор h V2n в виде h h1 ||h2 v1 ||v2 ||v3 ||v4,h1,h2 Vn,v1,v2,v3,v4 Vn/2 .
Обозначим h v |
||v |
2 |
||v |
3 |
||v |
4 |
тогда отображение f |
может быть определено |
1 |
|
|
|
|
|
|||
следующим образом: |
|
|
|
|
|
|
|
|
f h,a f h1,a , f h2,a . |
|
|
|
|||||
Теперь отображение |
f |
может |
быть использовано в |
качестве одношаговой |
сжимающей функции с размерностью выхода равной 2n.
Далее мы приведем несколько примеров конкретных функций хеширования, построенных с использованием алгоритма МеркляДамгарда.
SHA-1
Алгоритм безопасного хеширования SHA (Secure Hash Algorithm) (или SHA-1) опубликован в качестве стандарта США в 1995 г. При вводе сообщения М алгоритм вырабатывает 160-битовое выходное сообщение, называемое сверткой (Message Digest), которая и используется при выработке ЭЦП.
Рассмотрим работу алгоритма подробнее.
Прежде всего исходное сообщение дополняется так, чтобы его длина стала кратной 512 битам. При этом сообщение дополняется даже тогда, когда его длина уже кратна указанной. Процесс происходит следующим образом: добавляется единица, затем столько нулей, сколько необходимо для получения сообщения, длина которого на 64 бита меньше, чем кратная 512, и затем добавляется 64-битовое представление длины исходного сообщения.
Далее инициализируются пять 32-битовых переменных следующими шестнадцатеричными константами:
A = 0x67452301, B = 0xEFCDAB89, C = 0x98BADCFE,
D= 0x10325476,
E= 0xC3D2E1F0.
Далее эти пять переменных копируются в новые переменные а, b, c, d и e соответственно.
Определим операцию Ft и константу Kt для t-го такта работы:

|
5 |
|||||||
|
0x5A827999,t |
|
|
|
|
|
||
0,19 |
||||||||
|
|
|
|
|
|
|
|
|
0x6ED9EBA1,t 20,39 |
||||||||
Kt |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
0x8F1BBCDC,t 40,59 |
||||||||
|
|
|
|
|
|
|
|
|
0xCA62C1D6,t 60,79 |
||||||||
|
|
|
|
|
|
|
|
X Y X |
Z ,t 0,19 |
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
X Y Z,t 20,39,t 60,79 |
||||||
Ft X,Y,Z |
X Y X Z Y Z ,t 40,59
где -- операция "xor".
Главный цикл итеративно обрабатывает каждый 512-битный блок. Итерация состоит из четырех этапов по двадцать операций в каждом. Блок сообщения преобразуется из 16 32-битовых слов Mi в 80 32-битовых слов Wi по следующему правилу:
|
|
Mt ,t 0,15 |
||
Wt |
|
|||
|
|
|
|
|
|
|
|
||
|
Wt 3 Wt 8 Wt 14 Wt 16 1,t 16,79 |
|||
где |
|
-- это циклический сдвиг влево на бит. |
Для t от 0 до 79
temp a 5 Ft b,c,d e Wt Kt
e = d;
d = c;
c b 30;
b = a;
a = temp.
На рис. главный цикл представлен графически
После окончания главного цикла значения а, b, с, d и е складываются с содержимым А, В, С, D и Е соответственно и осуществляется переход к обработке следующего 512-битового блока расширенного сообщения. Выходное значение хешфункции является конкатенацией значений А, В, С, D и Е.
SHA-256

6
SHA-2 (англ. Secure Hash Algorithm Version 2 - безопасный алгоритм хеширования,
версия 2) - это семейство криптографических алгоритмов - однонаправленных хешфункций, включающее в себя в частности алгоритм SHA-256, где 256 - длина выходного значения.
Хеш-функции SHA-2 разработаны Агентством национальной безопасности США и опубликованы Национальным институтом стандартов и технологий в федеральном стандарте обработки информации FIPS PUB 180-2 в августе 2002 года. В июле 2006 года появился стандарт RFC 4634 "Безопасные хеш-алгоритмы США (SHA и HMAC-SHA)", описывающий SHA-1 и семейство SHA-2. Агентство национальной безопасности от лица государства выпустило патент на SHA-2 под лицензией Royalty-free.
Хеш-функции семейства SHA-2 построены на основе структуры Меркла - Дамгарда,
Описание SHA-256 можно разбить на две части --- описание функции сжатия и алгоритма обработки сообщения. Функция сжатия представляет собой по сути алгоритм блочного шифрования с размером блока 256 бит промежуточного значения функции хеширования с использованием очередного текстового блока в качестве ключа.
Помимо обычных обозначений, при описании функции мы будем использовать следующие:
shr --- логический сдвиг слова вправо на позиций (т.е. сдвиг, при
котором уходящий бит уходит, не влияя на оставшееся биты, а на место появившегося бита записывается бит 0)
---- циклический сдвиг слова вправо на позиций.
Размер слова равен 32 битам. Сложение производится по модулю 232. Начальный
вектор хеширования |
h0 H 0 |
представляет собой набор |
из 8 32разрядных |
слов, |
||
получаемых взятием |
дробной |
части |
квадратных корней |
первых 8 |
простых |
чисел: |
H 0 H10 ,H20 ,...,H80 0x6A09E667, |
0xBB67AE85, 0x3C6EF372, |
0xA54FF53A, |
0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19}. Это шестнадцатеричная запись В SHA-256 используются шесть логических функций, аргументы и значения
которых --- 32-битовые слова
Ch X ;Y;Z X Y X Z ;
Ma X;Y;Z X Y X Z Y Z ;
0 X X 2 X 13 X 12 ;
1 X X 6 X 11 X 25 ;
0 X X 7 X 18 X shr3 ;
1 X X 17 X 19 X shr10 .
Далее вычисление происходит по следующей схеме.
Хешируемое сообщение a вначале дополняется битовой строкой до a* так, что его длина становится кратной b 512 битам. Способ дополнения ar до ar* следующий:
добавляется 1, затем столько нулей, чтобы длина стала на 64 меньше кратной 512 и затем добавляется 64-битовое представление длины исходного сообщения.
Далее сообщение a* разбивается на блоки по 512 бит a1,a2 ,...,ar 1,ar* ..
Основной цикл выглядит следующим образом:
Для t от 1 до r, где r - количество блоков в дополненном сообщении
Инициализировать регистры A, B, C, D, E, F, G, H (t - 1)-м промежуточным значением хеш-функции: A H1t 1 ,B H2t 1 ,C H3t 1 ,D H4t 1 ,E H5t 1 ,
F H6t 1 ,G H7t 1 ,H H8t 1 ;

7
Применить функцию сжатия SHA-256 к регистрам A , B , C , D , E , F , G, H . Для этого для всех j от 0 до 63
1.Вычислить Ch E;F;G ,Ma A;B;C , 0 A , 1 E ,Wj ;
2.T1 h 1 E Ch E;F;G Kj Wj ;
3.T2 0 A Ma A;B;C ;
4.H G ,G F ,F E ,E D T1 ,D C ,C B ,B A,A T1 T2 ;
вычислить t-е промежуточное значение H t :
H1t A H1t 1 ,H2t B H2t 1 ,...,H8t H H8t 1 ,
Вектор hr H r H1r ,H2r ,...,H8r и будет искомым значением хеш-функции
сообщения a.
На следующем рисунке одна итерация алгоритма SHA-256 представлена графически
Блоки расширенного сообщения W0 , ... , W63 |
вычисляются из блока |
|||||||||||||||
at a(t) a0t ,a2t ,...,a15t |
следующим образом: |
|
||||||||||||||
|
|
|
|
|
|
|
|
t |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
, j 0,15 |
|
|
|
|
|
||||
Wj |
|
|
|
|
|
|
|
aj |
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
W |
|
|
W |
|
0 W |
|
W |
|
, j 16,63 |
|
|||||
|
1 |
|
|
|
|
|
|
|||||||||
|
|
|
|
j 2 |
|
|
j 7 |
|
|
j 15 |
|
j 16 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Слова-константы K0 , ..., K63 берутся как первые 32 бита дробных частей кубических корней первых 64 простых чисел, и в 16-ричном виде представлены здесь: 0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5, 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5, 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3, 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174, 0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC, 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA, 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7, 0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967, 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13, 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85, 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3, 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070, 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5, 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3, 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208, 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2.
Функция «Стрибог» (ГОСТ 34.11-2018)
В течение 2010-2011 годов был разработан новый алгоритм бесключевого хеширования, получивший название «Стрибог» в честь языческого божества восточных славян, бога стремительного ветра, разносящего и распределяющего блага между людьми. В 2012 году данный алгоритм был принят в качестве нового стандарта Российской
8
Федерации ГОСТ Р 34.11-2012, а затем без изменения вошел в межгосударственный стандарт ГОСТ 34.11-2018.
Опишем функцию «Стрибог» подробно. Дли этого рассмотрим перестановку
S64 , действующую |
на |
множестве V512 |
следующим образом: |
|
|
a a1 ||...||a64 a1 |
||...||a 64 ,a1,...,a64 V8 , и задаваемую вектором |
={0, 8, 16, 24, 32, 40, 48, 56, 1, 9, 17, 25, 33, 41, 49, 57, 2, 10, 18, 26, 34, 42, 50, 58, 3, 11, 19, 27, 35, 43, 51, 59, 4, 12, 20, 28, 36, 44, 52, 60, 5, 13, 21, 29, 37, 45, 53, 61, 6, 14, 22, 30, 38, 46, 54, 62, 7, 15, 23, 31, 39, 47, 55, 63}.
Рассмотрим подстановку :V8 V8 , задающую нелинейное биективное отображение множества V8 в себя и определяемую равенством
x x , где x 256 ,
и0,..., 255 (252, 238, 221, 17, 207, 110, 49, 22, 251, 196, 250, 218, 35, 197, 4, 77,
233, 119, 240, 219, 147, 46, 153, 186, 23, 54, 241, 187, 20, 205, 95, 193, 249, 24, 101, 90, 226, 92, 239, 33, 129, 28, 60, 66, 139, 1, 142, 79, 5, 132, 2, 174, 227, 106, 143, 160, 6, 11, 237, 152, 127, 212, 211, 31, 235, 52, 44, 81, 234, 200, 72, 171, 242, 42, 104, 162, 253, 58, 206, 204, 181, 112, 14, 86, 8, 12, 118, 18, 191, 114, 19, 71, 156, 183, 93, 135, 21, 161, 150, 41, 16, 123, 154, 199, 243, 145, 120, 111, 157, 158, 178, 177, 50, 117, 25, 61, 255, 53, 138, 126, 109, 84, 198, 128, 195, 189, 13, 87, 223, 245, 36, 169, 62, 168, 67, 201, 215, 121, 214, 246, 124, 34, 185, 3, 224, 15, 236, 222, 122, 148, 176, 188, 220, 232, 40, 80, 78, 51, 10, 74, 167, 151, 96, 115, 30, 0, 98, 68, 26, 184, 56, 130, 100, 159, 38, 65, 173, 69, 70, 146, 39, 94, 85, 47, 140, 163, 165, 125, 105, 213, 149, 59, 7, 88, 179, 64, 134, 172, 29, 247, 48, 55, 107, 228, 136, 217, 231, 137, 225, 27, 131, 73, 76, 63, 248, 254, 141, 83, 170, 144, 202, 216, 133, 97, 32, 113, 103, 164, 45, 43, 9, 91, 203, 155, 37, 208, 190, 229, 108, 82, 89, 166, 116, 210, 230, 244, 180, 192, 209, 102, 175, 194, 57, 75, 99, 182).
Также определим линейное отображение l:V64 V64, представляющее собой умножение вектора y V64 на двоичную матрицу В = (bij) из GL64(2):
l(y) = yВ.
Ниже приводем точное значение матрицы В, взятое нами из текста стандарта ГОСТ 34.11-2018. В каждой строке записано 4 строки матрицы В, при этом в строке с номером i, i от 0 до 15, записаны строки матрицы В с номерами 4i + j, j из 0,..., 3 в следующем порядке (слева направо): 4i, 4i +1, 4i +2, 4i + 3:
8e20faa72ba0b470 47107ddd9b505a38 ad08b0e0c3282d1c d8045870ef14980e 6c022c38f90a4c07 3601161cf205268d 1b8e0b0e798c13c8 83478b07b2468764 a011d380818e8f40 5086e740ce47c920 2843fd2067adea10 14aff010bdd87508 0ad97808d06cb404 05e23c0468365a02 8c711e02341b2d01 46b60f011a83988e 90dab52a387ae76f 486dd4151c3dfdb9 24b86a840e90f0d2 125c354207487869 092e94218d243cba 8a174a9ec8121e5d 4585254f64090fa0 accc9ca9328a8950 9d4df05d5f661451 c0a878a0a1330aa6 60543c50de970553 302a1e286fc58ca7 18150f14b9ec46dd 0c84890ad27623e0 0642ca05693b9f70 0321658cba93c138 86275df09ce8aaa8 439da0784e745554 afc0503c273aa42a d960281e9d1d5215 e230140fc0802984 71180a8960409a42 b60c05ca30204d21 5b068c651810a89e 456c34887a3805b9 ac361a443d1c8cd2 561b0d22900e4669 2b838811480723ba 9bcf4486248d9f5d c3e9224312c8c1a0 effa11af0964ee50 f97d86d98a327728 e4fa2054a80b329c 727d102a548b194e 39b008152acb8227 9258048415eb419d 492c024284fbaec0 aa16012142f35760 550b8e9e21f7a530 a48b474f9ef5dc18 70a6a56e2440598e 3853dc371220a247 1ca76e95091051ad 0edd37c48a08a6d8 07e095624504536c 8d70c431ac02a736 c83862965601dd1b 641c314b2b8ee083

9
Введенные перестановка , подстановка и линейное преобразование l используются в алгоритме «Стрибог» для определения следующих преобразований над векторами длины 512 бит:
S :V512 |
V512,S x S x1 ||...|| x64 |
x1 ||...|| x64 ; |
|||
P:V512 |
V512,P x P x1 |
||...|| x64 x 1 ||...|| x 64 ; |
|||
L:V512 |
V512,L y P y1 |
||...|| y8 |
l y1 ||...||l y8 , |
||
где x1,...,x64 V8 , y1,...,y8 V64 . |
|
|
|
||
Кроме |
того, определим |
величины s, j 2512 , j |
|
, представляющие собой |
|
1,r |
различные контрольные суммы входного сообщения a a1 ||a2 ||...||ar 1 ||ar :
r
s ai mod2512 ,
i 1
j
j len ai mod2512 .
i 1
Теперь мы можем определить одношаговую функцию сжатия, представляющую собой вариант функции Миягучи-Принеля, примененный к некоторому блочному шифру
E(k,а):
f hi 1,ai E hi 1 i ,ai hi 1 ai ,i 1,r (****)
Для описания блочного шифра, используемого внутри функции f, нам надо определить алгоритм развертки ключа k и алгоритм зашифрования E(k,а).
Алгоритм развертки ключа k заключается в определении значений k1,...,k13 V512
в соответствии со следующими равенствами k1 k,
ki L P S ki 1 ci ,i 2,13,
где c2,..., c13 из V512 - фиксированные константы, значения которых могут быть
найдены в тексте стандарта ГОСТ Р 34.11-2012.
Алгоритм зашифрования Е(k, а) состоит из двенадцати одинаковых раундов
R k,a :V512 V512 V512 |
и завершающего преобразования W k,a :V512 V512 V512 , |
определяемых равенствами
R k,a L P S k a ,
W k,a k a .
Легко видеть, что раундовое преобразование R используется и в алгоритме развертки ключа. Суммируя, мы можем записать алгоритм зашифрования в виде
E k,a W k13,R k12,...,R k1,a ... .
Для полного описания бесключевой функции хеширования «Стрибог», определим завершающее преобразование g:
g hr 1,ar f |
f f h,ar* , r ,s (*****) |
||
где вектор ar* |
определен равенством |
||
a* a ||1|| |
0...0 |
||
r |
r |
|
511 len ar

10
Таким образом, бесключевая функция хеширования «Стрибог» определяется равенством (*), в котором одношаговая функция f удовлетворяет равенству (****), а завершающее преобразование g удовлетворяет равенству (*****).
Описанная функция позволяет вырабатывать код целостности длиной 512 бит. Для того чтобы выработать код целостности длины 256 бит, необходимо выработать код длины 512 бит, а потом взять его старшие 256 разрядов, то есть
|
|
|
msb 256,H a h1 ||...||h256 || |
h257 ||...||h512 |
, |
|
|
|
|
код целостности длины 256 бит |
где hi V1,i 1,512.
Таким образом, бесключевая функция хеширования «Стрибог» определяется равенством (*), в котором одношаговая функция f удовлетворяет равенству (****), а завершающее преобразование g удовлетворяет равенству (*****).
Криптографическая губка
Широкую популярность схема Меркла-Дамгарда приобрела благодаря доказательству того, что устойчивость к коллизиям всей конструкции зависит только от устойчивости к коллизиям функции сжатия.
Несмотря на популярность схемы Меркла-Дамгарда, ряд работ показал недостатки данной конструкции, связанные с множественными коллизиями [Antoine Joux, «Multicollisions in Iterated Hash Functions. Application to Cascaded Constructions», In M. Franklin, editor, Advances in Cryptology - CRYPTO 2004, Vol. 3152 of Lecture Notes in Computer Science, pp. 306-316, Springer, 2004], дополнением сообщения до нужной длины [John Kelsey, «A long-message attack on SHAx, MDx, Tiger, N-Hash, Whirlpool, and Snefru. Draft». Unpublished Manuscript], нахождением второго прообраза [Ueli Maurer, Renato Renner, Clemens Holenstein, «Indifferentiability, Impossibility Results on Reductions, and Applications to the Random Oracle Methodology», In M. Naor, editor, Theory of Cryptography, First Theory of Cryptography Conference, Vol. 2951 of Lecture Notes in Computer Science, pp. 21-39, Springer, 2004].
Атаки направлены не на конкретный алгоритм, а применимы к любой хешфункции, построенной по схеме Меркла-Дамгарда. Атака, основанная на множественных коллизиях [Antoine Joux, «Multicollisions in Iterated Hash Functions. Application to Cascaded Constructions», In M. Franklin, editor, Advances in Cryptology - CRYPTO 2004, Vol. 3152 of Lecture Notes in Computer Science, pp. 306-316, Springer, 2004],
может быть осуществлена злоумышленником, даже если он имеет доступ к функции хеширования в целом, но не имеет возможности контролировать значения функции сжатия. Дополнение сообщения до нужной длины направлено на схему ДевисаМейера, однако никак не затрагивает особенности самого блочного шифра, что делает эту атаку также достаточно общей. В связи с этим стали появляться предложения по модификации столь популярной конструкции такие как конструкции Wide Pipe, HAIFA, рандомизированная схема, и, наконец, криптографическая губка.
Конструкция «криптографическая губка» была разработана группой криптографов во главе с Йоаном Дайменом с целью заменить устаревшую конструкцию Меркла-Дамгарда. Впервые она была представлена в 2007 году на симпозиуме ECRYPT. Представляет собой отображение входных данных переменной длины в выходные данные также переменной длины. Преобразование (или перестановка) f :Vd Vd оперирует с фиксированным количеством бит d = b + c,
где b называется (битовой) скоростью (англ. rate), а c «емкостью» (англ. capacity). На начальном этапе, как и в конструкции Меркла-Дамгарда, входные данные расширяются в соответствии с заданным алгоритмом, после чего разбиваются на блоки по b бит. Далее d бит состояния инициализируются нулями.