Опубликован: 02.03.2017 | Уровень: для всех | Доступ: свободно
Лекция 9:

Хэш-функции и электронная подпись

< Лекция 8 || Лекция 9: 12
Аннотация: Рассмотрены хэш-функции и алгоритмы подписи. Реально действующие в настоящее время хэш-функции являются сложными для первоначального ознакомления, вместе с тем, идейная сторона таких функций довольна прозрачна. Для введения учащегося в круг идей и методов построения хэш-функций и подписи приводим учебные алгоритмы хэширования. Далее достаточно подробно представлен алгоритм подписи на основе эллиптических кривых. Изучение этого алгоритма будет полезно для подготовки к использованию подписи по действующему стандарту РФ.

9.1 Хэш-функции

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

Хэш-функции применяются для тестирования логических устройств, для быстрого поиска и проверки целостности записей в базах данных.

В криптографии хэш-функции применяются для решения следующих задач:

  • построения систем контроля целостности данных при их передаче или хранении,
  • аутентификация источника данных.

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

Определение 9.2 Обозначим через X множество, элементы которого будем называть сообщениями, n - натуральное число. Хеш-функцией называется всякая легко вычислимая функция h: X \rightarrow \{0,1\}^n.

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

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

Как правило, хеш-функции строят на основе так называемых одношаговых сжимающихся функций y=f(x_1,x_2) двух переменных, где x_1 и x_2 - двоичные векторы длины m и n соответственно, и n - длина свертки. Для получения значения h(M) сообщение M сначала разбивается на блоки длины m (при этом если длина сообщения не кратна m, то последний блок неким специальным образом дополняется до полного), а затем к полученным блокам M_1, M_2,\dots, M_N применяют следующую последовательную процедуру вычисления свертки:


\begin{array}{l}
H_0=v, \\ \\
H_i= f(M_i, H_{i-1}), i=1,\dots,N, \\ \\
h(M)=H_N. \\
\end{array}

Здесь v - некоторый фиксированный начальный вектор. Если функция f зависит от ключа, то этот вектор можно положить равным нулевому вектору. Если же функция f не зависит от ключа, то для исключения возможности перебора коротких сообщений (при попытках обращения хеш-функции) этот вектор можно составить из фрагментов указывающих на дату, время, номер сообщения и т.п.

При таком подходе свойства хеш-функции h полностью определяются свойствами одношаговой сжимающей функции f.

9.2 Электронная подпись

9.2.1 Общие положения

Появление криптографии с открытым ключом позволило решать задачи, которые ранее считались неразрешимыми. К таким задачам относится использование цифрового аналога собственноручной подписи абонента - электронной цифровой подписи (ЭЦП).

Цифровая подпись (ЭЦП) для сообщения является числом, зависящим от самого сообщения и от секретного ключа, известного только подписывающему. Важное требование: подпись должна допускать проверку без знания секретного ключа. При возникновении спорной ситуации, связанной с отказом от факта подписи либо с возможной подделкой подписи, третья сторона должна иметь возможность разрешить спор.

Задачи, которые решает подпись:

  • Осуществить аутентификацию источника сообщения,
  • Установить целостность сообщения,
  • Обеспечить невозможность отказа от факта подписи конкретного сообщения.

Для реализации схемы ЭЦП необходимы два алгоритма: алгоритм генерации подписи и алгоритм проверки. Надежность схемы ЭЦП определяется сложностью следующих задач:

  • Подделки подписи, то есть нахождения правильного значения подписи для заданного документа,
  • Создания подписанного сообщения, то есть нахождения хотя бы одного сообщения с правильным значением подписи,
  • Подмены подписи, то есть нахождения двух различных сообщений с одинаковым значением подписи.

Заметим, что между ЭЦП и собственноручной подписью имеются различия, хотя они и служат для решения одинаковых задач. Так, ЭЦП зависит от подписываемого текста, различна для разных тестов. Кроме того, ЭЦП требует дополнительных механизмов, реализующих алгоритмы ее вычисления и проверки. Наконец, принципиальной сложностью, возникающей при использовании ЭЦП, является необходимость создания инфраструктуры открытых ключей. Эта инфраструктура состоит из центров сертификации открытых ключей и обеспечивает возможность своевременного подтверждения достоверности открытой информации, необходимой для проверки ЭЦП, что необходимо для предотвращения подделки подписи.

Некоторые наиболее употребительные схемы ЭЦП

В настоящее время имеется большое количество различных схем ЭЦП, обеспечивающих тот или иной уровень стойкости. Существующие схемы можно классифицировать таким образом:

  • Схемы на основе систем шифрования с открытыми ключами,
  • Схемы со специально разработанными алгоритмами вычисления и проверки подписи,
  • Схемы на основе симметричных систем шифрования. Рассмотрим некоторые схемы.

9.2.2 Схема Эль-Гамаля

См. [1]

Безопасность схемы основана на трудности вычисления дискретных логарифмов в конечном поле. Для генерации пары ключей выбирается простое число p и два случайных числа, g и x, оба меньше p. Затем вычисляется y=g^{x} ~(\mod  p). Открытым ключом является набор чисел y, g, p. При этом p и g можно сделать общими для группы пользователей. Секретным ключом является x. Чтобы подписать сообщение M, сначала выбирается случайное число k, взаимно простое с p-1. Затем вычисляются подпись (r, s) по формулам:

r=g^{k} (\mod p) \qquad \text{и}\qquad  s = (M-xr)\cdot k^{-1} (\mod (p-1)).

Для проверки подписи нужно убедиться, что

{y}^{r} \cdot {r}^{s} ~(\mod  p) =  {g}^{M} ~(\mod  p).

Первое замечание о выборе k. Оно должно храниться в секрете и уничтожаться сразу после вычисления подписи, так как знание k и значения подписи позволяет легко вычислить секретный ключ x. И тогда подпись будет полностью скомпрометирована. Кроме того, k должно быть действительно случайным и не должно повторяться для различных подписей, полученных на одном секретном ключе. Если злоумышление сможет получить два сообщения, подписанные с помощью одного и того же значения k, то он сможет раскрыть x, даже не зная значение k.

Схема Эль-Гамаля послужила образцом для построения большого семейства во многом сходных по своим свойствам схем подписи.

Пример 9.1 Выберем p =11 и g = 2, а секретный ключ x = 8.

Вычислим:

y =  {g}^{x} ~(\mod  p) =  {2}^{8} ~(\mod  11) = 3.

Открытым ключом являются y = 3, g = 2 и p = 11. Чтобы подписать M =5, сначала выберем случайное число k = 9, убеждаемся, что \GCD(9,10) = 1. Вычисляем:

r=g^k ~(\mod  p) =  {2}^{9} ~(\mod  11)=6.

Теперь находим

k^{-1}~(\mod p-1) = 9^{-1} (\mod 10) = 9, \qquad s=(5-8\cdot 6)\cdot 9 = 3~(\mod 10).

Итак, подпись представляет собой пару: r =6 и s = 3.

Для проверки подписи убедимся, что:

{y}^{r}\cdot {r}^{s} ~(\mod  p) =  {g}^{M} ~(\mod  p), \\ 3^{6}\cdot{6}^{3} ~(\mod  11) =  {2}^{5} ~(\mod  11).

Второе замечание. При вычислении подписи целесообразно использовать хэш-образ сообщения, а не само сообщение M. Это защитит схему подписи от возможности подбора сообщений с известным значением подписи. Это распространенная практика. В приведенном примере можно считать, что h(M)=5. Наиболее распространена технология ЭЦП, основанная на совместном применении алгоритмов хеширования и шифрования с открытым ключом (в частности, RSA или Эль-Гамаля).

Алгоритм формирования подписи выглядит следующим образом:

  1. Пусть M - подписываемое сообщение. Отправитель вычисляет хеш-значение подписываемого сообщения h=h(M). Значение h должно удовлетворять неравенству 0<h<p.

  2. Отправитель выбирает случайное число k, 0<k<p-1, взаимно простое с p-1, и вычисляет числа:
    
\begin{equation*}
\begin{array}{l}
 r=g^{k} ~(\mod  p),\\
 u=(h-xr) ~(\mod p-1),\\  
 s=k^{-1}u ~(\mod p-1), 
\end{array}
\end{equation*}

    k^{-1} - число, обратное k по модулю p-1, k^{-1} существует, так как k и p-1 - взаимно просты.

  3. Подпись (r, s) добавляется к сообщению, и тройка (M, r, s) передается получателю.

Проверка подписи: получатель заново вычисляет хеш-значение присланного сообщения h(M) и проверяет подпись, используя равенство:

y^r r^s = g^h ~(\mod  p).

Если подпись верна, то это равенство выполняется.

Отметим, что число k выбирается заново для каждого нового сообщения и должно держаться в секрете.

Используемые на практике алгоритмы хеширования достаточно сложны, поэтому будем использовать учебные алгоритмы формирования хеш-значения h(M). Схему учебных алгоритмов хэширования предложила Васильева И.Н. [1].

Первый учебный алгоритм хеширования

Входом для данного алгоритма является строка, состоящая из букв русского языка.

  1. Выбирается число h_0 - вектор инициализации. Число h_0 равно длине сообщения в символах.

  2. Для каждого символа сообщения вычисляется значение h_i=(n_i+h_{i-1})^2 ~(\mod  p)$, $i=1,\dots,n, где n_i - номер i-й буквы сообщения в алфавите. Для удобства вычислений ниже приведен нумерованный алфавит.

    А-1 Б-2 В-3 Г-4 Д-5 Е-6 Ё-7
    Ж-8 З}-9 И-10 Й-11 К-12 Л-13 М-14
    Н-15 О-16 П-17 Р-18 С-19 Т-20 У-21
    Ф-22 Х-23 Ц-24 Ч-25 Ш-26 Щ-27 Ъ-28
    Ы-29 Ь-30 Э-31 Ю-32 Я-33

  3. Значение h_n, вычисленное для последнего символа, является хеш-значением сообщения: h(M)=h_n.

Следует отметить, что вычисленное по этому алгоритму хеш-значение зависит от всех символов сообщения M.

Известны значения общих параметров системы Эль-Гамаля: p=79, g=15, личный ключ абонента x и случайное число k, выбранное для формирования подписи сообщения. Для заданного текстового сообщения M сгенерировать цифровую электронную подпись по алгоритму Эль-Гамаля.

Пример 9.2 Выполнить вычисление и проверку подписи сообщения M=\text{"БЛЕФ"} по алгоритму Эль-Гамаля. Использовать параметры подписи:

p=79,\qquad g=15,\qquad x=34,\qquad k=17.
  1. Сформируем хэш-сумму сообщения. Начальное значение h_0 равно количеству символов сообщения: h_0=4. Далее,
    
\begin{equation*}
 \begin{array}{l}
  h_1=(h_0+n_1)^2 ~(\mod  79) = (4+2)^2~(\mod  79) =36, \\
  h_2=(h_1+n_2)^2 ~(\mod  79) = (36+13)^2~(\mod  79) =31, \\
  h_3=(h_2+n_3)^2 ~(\mod  79) = (31+6)^2~(\mod  79) =26 \\
  h_4 = (h_3+n_4)^2 ~(\mod  79) = (26+22)^2~(\mod  79) =13.   
 \end{array}
\end{equation*}
  2. Вычисляем число r по формуле r=g^k ~(\mod  p). Для рассматриваемого примера получили:
    r=15^{17} ~(\mod 79) = 14.
  3. Вычисляем число u по формуле u=(h-xr) (\mod p-1), для рассматриваемого примера
    u=(13-34 \cdot 14) ~(\mod  78)=5.
  4. Вычисляем значение k^{-1} по модулю p-1 с помощью расширенного алгоритма Евклида. Для рассматриваемого примера значение k^{-1}=23.

    Примечание: если полученное значение k^{-1} - отрицательное, следует взять его по модулю p-1.

  5. Вычисляем число s по формуле s=k^{-1}u (\mod p-1). В примере
    s=23 \cdot 5 (\mod 79-1)=37.
  6. Цифровая подпись сообщения для рассматриваемого примера: (14,37).

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

  1. Сформируем открытый ключ y абонента по формуле y=g^{x} ~(\mod  p):

    Для рассматриваемого примера y=15^{34} ~(\mod  79) = 38.

  2. Аналогичным образом вычисляем значения y^{r} ~(\mod  p) и r^{s} ~(\mod  p), а затем их произведение по модулю p.

    В примере получаем:
    
\begin{equation*}
\begin{array}{l}
 y^{r} ~(\mod  p) =38^{14} ~(\mod  79)=38, \\
 r^{s} ~(\mod  p) =14^{37} ~(\mod  79)=27, \\ 
 y^{r}r^{s} ~(\mod  p)= 38\cdot 27 ~(\mod  79)=78. 
\end{array}
\end{equation*}
  3. Вычисляем значение g^{h} ~(\mod  p), значение h было получено ранее.

    В примере g^{h} ~(\mod  p)=15^{13} ~(\mod  79)= 78.

  4. Проверяем выполнение равенства y^{r}r^{s} ~(\mod  p)=g^h ~(\mod  p), если равенство выполняется - подпись подлинная, то есть она была вычислена правильно.

    В примере получили 78=78, равенство выполняется, значит, подпись сгенерирована правильно.

Второй учебный алгоритм хеширования

В этом алгоритме p - простое число, которое затем будем модулем для алгоритма цифровой подписи Эль-Гамаля. Теперь сообщение M - число, записанное в десятичной системе счисления.

  1. Начальное значение h_0 принимается равным числу десятичных разрядов в M.

  2. Для каждого десятичного знака M_i числа M вычисляется значение
    h_i =(M_i+ 2\cdot h_{i-1}+1)^{2} (\mod p-1),\ i=1,\dots,n.
  3. Значение h_n, вычисленное для последнего символа, увеличенное на 1, является хеш-значением сообщения: h(M)=h_n+1.

Вычисленное по этому алгоритму хеш-значение зависит от всех символов сообщения M.

Пример 9.3 Известны значения общих параметров системы Эль-Гамаля: p=59, g=14 и открытый ключ абонента y=20. От абонента получено сообщение M=7569, снабженное цифровой подписью Эль-Гамаля r=32, s=46. Проверить подлинность цифровой подписи. Хеш-значение сообщение вычисляется с помощью второго учебного алгоритма.

  1. Вычисляем значения y^{r} ~(\mod  p) и r^{s} ~(\mod  p), а затем их произведение по модулю p:

    В рассматриваемом примере получаем:
    
\begin{equation*}
\begin{array}{l}
 y^{r} ~(\mod  p) =20^{32} ~(\mod  59)= 35, \\
 r^{s} ~(\mod  p) =32^{46} ~(\mod  59)=15, \\ 
 y^{r}r^{s} ~(\mod  p)= 35\cdot 15 ~(\mod  59)=53. 
\end{array}
\end{equation*}
  2. Для полученного сообщения вычисляем хеш-значение h(M) по второму учебному алгоритму.
    
\begin{array}{l}
 h_0 = 4;\\
 h_1 = (7 + 2\cdot 4 + 1)^2 ~(\mod 58) = 24;\\
 h_2 = (5 + 2\cdot 24 + 1)^2 ~(\mod 58) = 16;\\
 h_3 = (6 + 2\cdot 16 + 1)^2 ~(\mod 58) = 13;\\
 h_4 = (9 + 2\cdot 13 + 1)^2 ~(\mod 58) = 20;\\
 h = h_4 + 1 = 21;
\end{array}
  3. Вычисляем значение g^{h} ~(\mod  p).

    В примере g^{h} ~(\mod  p)=14^{21}~(\mod 59) = 6.

  4. Проверяем выполнение равенства y^{r}r^{s} ~(\mod  p)=g^h ~(\mod  p), если равенство выполняется - подпись подлинная, в противном случае - фальшивая.

    В нашем примере 53\neq 6. Равенство не выполняется, значит, подпись фальшивая.

< Лекция 8 || Лекция 9: 12
Евгений Шаров
Евгений Шаров

как начать заново проходить курс, если уже пройдено несколько лекций со сданными тестами?

Юлия Мышкина
Юлия Мышкина

Обучение с персональным тьютором осуществляется по Скайпу или посредством переписки?

Владислав Ветошкин
Владислав Ветошкин
Россия, Ижевск, Ижевский государственный технический университет имени А.Т. Калашникова, 2011
Саламат Исахан
Саламат Исахан
Россия, Turkistan