Криптографические методы защиты информации

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

Показывать лекцию целиком

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 или Эль-Гамаля).

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

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

  • Отправитель выбирает случайное число $$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$$ - взаимно просты.

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

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

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

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

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

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

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

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

  • Для каждого символа сообщения вычисляется значение $$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

  • Значение $$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.$$
  • Сформируем хэш-сумму сообщения. Начальное значение $$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*} $$
  • Вычисляем число $$r$$ по формуле $$r=g^k ~(\mod p)$$. Для рассматриваемого примера получили: $$r=15^{17} ~(\mod 79) = 14.$$
  • Вычисляем число $$u$$ по формуле $$u=(h-xr) (\mod p-1)$$, для рассматриваемого примера $$u=(13-34 \cdot 14) ~(\mod 78)=5.$$
  • Вычисляем значение $$k^{-1}$$ по модулю $$p-1$$ с помощью расширенного алгоритма Евклида. Для рассматриваемого примера значение $$k^{-1}=23$$.

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

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

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

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

  • Аналогичным образом вычисляем значения $$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*} $$
  • Вычисляем значение $$g^{h} ~(\mod p)$$, значение $$h$$ было получено ранее.

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

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

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

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

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

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

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

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

  • Вычисляем значения $$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*} $$
  • Для полученного сообщения вычисляем хеш-значение $$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} $$
  • Вычисляем значение $$g^{h} ~(\mod p)$$.

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

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

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

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

    9.2.3 Скрытый канал

    См. [2]

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

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

    В общем случае организация подсознательного канала выглядит так:

  • Отправитель создает безобидное сообщение;
  • Используя общий ключ с получателем сообщения, отправитель подписывает безобидное сообщение, пряча свое подсознательное сообщение в подписи;
  • Отправитель посылает подписанное сообщение по общедоступному каналу передачи;
  • Проверяющий читает сообщение и проверяет подпись. Не обнаружив ничего подозрительного, он передает сообщение дальше;
  • Получатель проверяет подпись под безобидным сообщением, убеждаясь что сообщение получено от отправителя;
  • Получатель игнорирует безобидное сообщение и, используя общий с отправителем секретный ключ, извлекает подсознательное сообщение;
  • Рассмотрим простейший пример организации подсознательного канала передачи информации используя цифровую подпись реализуемую по методу Эль-Гамаля.

  • Сначала необходимо сгенерировать пару ключей, для этого выбирается простое $$p=11$$ и два случайных $$g=2$$ и $$x=8$$, причем $$g<p$$ и $$x<p$$. Затем вычисляется $$y=g^x ~(\mod p)$$, $$y=2^8 ~(\mod 11) =3$$. Открытым ключом является $$(y, g, p)=(3,2,11)$$, секретным ключом $$x=8$$;

  • Создают безобидное сообщение $$M=5$$ и скрытое сообщение $$M_1=9$$, проверяя чтобы эти сообщения были взаимно простые с $$p$$, а также чтобы $$M_1=9$$ было взаимно простым c $$(p-1)=10$$; В нашем случае это так;

  • Вычисляем значение цифровой подписи $$(a, b)$$ $$ \begin{equation*} \begin{array}{l} a=g^{m_1} ~(\mod p) = 2^9 ~(\mod 11)= 6, \\ \\ M = (xa+bM_1) ~(\mod p-1), \\ \\ b= \dfrac{M-xa}{M_1} ~(\mod p-1)= \dfrac{5-8\cdot 6}{9} ~(\mod 10) =3. \end{array} \end{equation*} $$

    Мы получили подпись $$(6,3)$$ и в тоже время создали скрытый канал;

  • Проверяющий может просмотреть безобидное сообщение и удостовериться что сообщение передано от отправителя с подписью $$(6, 3)$$, для этого он проводит вычисления: $$ y^a\cdot a^b ~(\mod p) = g^M ~(\mod p), \\ \ 3^6\cdot 6^3 ~(\mod 11) = 2^5 ~(\mod 11), \\ 10=10. $$
  • Получатель, обладающий секретным ключом, удостоверяется в том, что сообщение пришло именно от того отправителя, с которым организован скрытый канал, для этого он проводит вычисления: $$ \left(g^x\right)^a a^b ~(\mod p) = g^M ~(\mod p), \\ \left(2^8\right)^6 6^3 ~(\mod 11) = 2^5 ~(\mod 11), \\ 10=10. $$
  • Получатель восстанавливает скрытое сообщение: $$M_1=\left( b^{-1}(M-xa) \right) (\mod p-1)=\left( 3^{-1}(5-8\cdot 6) \right) ~(\mod 10) =9.$$
  • 9.2.4 Цифровая подпись на эллиптических кривых

    См. [3]

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

    Замечание. В России официально принят стандарт ЭЦП на эллиптических кривых над полем большей характеристики - ГОСТ 34.10-2001 "Информационная технология. Криптографическая защита информации. Процессы формирования и проверки электронной цифровой подписи". Выбор кривой и точки на ней подразумевает решение ряда вспомогательных задач. Прежде всего, это подсчет количества точек на кривой. Если $$N$$ - количество точек кривой $$E$$ над полем порядка $$p$$, то должны выполняться следующие условия:

    $$p+1-2\sqrt{p} \leq N \leq p+1+2\sqrt{p},$$ $$G \in E\Rightarrow N \cdot G= \mathcal{O}.$$

    Таким образом, чтобы отсеять лишние числа $$N$$, удовлетворяющие (9.1), можно проверять условие (9.2) для разных точек $$G$$. Единственное оставшееся число и будет искомым порядком кривой.

    На практике требуется использовать достаточно большие простые числа $$p$$. Существующие практически применимые алгоритмы [4], [5] нахождения $$N$$ используют аппарат алгебраической геометрии, выходящий за рамки пособия.

    Для получения криптографически стойкой системы ЭЦП должны выполняться следующие условия:

  • Порядок точки $$G$$, используемой в системе ЭЦП, должен быть простым числом $$n> \max \left\{ {2}^{160},4\sqrt{p}\right\}$$.
  • $$N\neq p$$ и $$N \neq p + 1$$, где $$N$$ - порядок кривой.
  • $${p}^{k} \neq 1 ~(\mod n)$$ для всех $$k = 1, \dots, C$$, где $$C$$ настолько велико, что вычислить дискретный логарифм в $$GF({{p}^{C}})$$ за приемлемое время невозможно.
  • Замечание. В настоящее время значение $$C = 20$$ считается достаточным.

    Возможный способ защититься от известных атак и от возможных атак для специальных классов кривых, которые могут быть обнаружены в будущем, - выбирать кривую $$E$$ случайным образом так, чтобы выполнялись указанные условия.

    После того, как порядок $$N$$ кривой определен, требуется найти большой простой делитель $$n$$ порядка кривой. Такой делитель может не существовать, и тогда потребуется повторять процедуру выбора кривой до тех пор, пока не будут выполнены все требуемые условия. Поиск числа $$n$$ может потребовать как разложения на множители числа $$N$$, так и доказательства простоты числа $$n$$. Точку $$G$$ можно выбрать следующим образом. Найдем случайную точку $$G' \in E({F}_{p})$$ и вычислим $$G= \frac{N}{n}\cdot G'$$. Если $$G \neq \mathcal{O}$$, то требуемая точка найдена, если же $$G = \mathcal{O}$$, то выбираем другую точку $$G'$$.

    Описанные параметры могут быть общими для всех пользователей. Для генерации и проверки подписи требуются еще и индивидуальные параметры пользователя - это секретный и открытый ключи. Ключ подписи (секретный ключ) - это случайное число $$d$$, $$0<d<n$$. Ключ проверки подписи (открытый ключ) - это точка эллиптической кривой $$Q = d \cdot G$$. Алгоритм ЭЦП также использует хеш-функцию, обозначаемую $$h$$.

    Генерация подписи

    Входные данные: сообщение $$M$$, исходные параметры и ключ подписи. Выходные данные: подпись $$(r, s)$$.

    Алгоритм:

    Выбрать случайное число $$k$$ в интервале $$(1, n - 1)$$.

  • Вычислить $$(x, y) = k \cdot G$$.
  • Вычислить $$r = x ~(\mod n)$$.
  • Если $$r = 0$$, то вернуться к шагу 1.
  • Вычислить $$z= {k}^{-1} ~(\mod n)$$.
  • Вычислить $$e=h(M)$$.
  • Вычислить $$s = z(e + dr) ~(\mod n)$$.
  • Если $$s = 0$$, то вернуться к шагу 1.
  • Вывести пару $$(r,s)$$ - подпись к $$M$$.
  • Замечания.

  • При $$r = 0$$ результат вычисления $$s$$ не зависит от секретного ключа $$d$$.
  • При $$s = 0$$ необходимого для проверки подписи числа $${s}^{-1} ~(\mod n)$$ не существует.
  • В качестве хеш-функции $$h$$ на 6 в стандартах ANSI X9F1 и IEEE P1363 используется SHA-1, в российском стандарте ГОСТ Р 34.10-2001~- хеширование по стандарту ГОСТ Р 34.11-94.
  • Пример генерации подписи

    Наша цель - показать особенности алгоритма, не зависящие от разрядности чисел.

    Пример 9.4 Пусть используется эллиптическая кривая $${E}_{751}(-1,1)$$ и генерирующая точка $$G = (384, 475)$$ порядка $$n = 13$$ (13 - наибольший из делителей порядка кривой $$N = 728$$). Предположим, абонент подписывает личным секретным ключом $$d = 12$$ сообщение, хеш-свертка которого равна $$e = 12$$. Сгенерировать подпись.

    Пусть абонент, подписывающий сообщение, выбрал случайное $$k = 3$$. Тогда он вычисляет $$kG = (x, y) = 3 \cdot (384, 475) = (596, 318)$$ и затем $$r = x ~(\mod n)= 596 ~(\mod 13) = 11$$. Используя расширенный алгоритм Евклида, определяем $$z = {k}^{-1}~(\mod n) = {3}^{-1} ~(\mod 13) = 9$$ (так как $$3 \cdot 9 = 27 \equiv 1 ~(\mod 13)$$). Наконец, $$s = z(e + dr) ~(\mod n) =9 \cdot (12 +12 \cdot 11) ~(\mod 13) = 9$$. Таким образом, $$(r, s) = (11,9)$$ - цифровая подпись данного абонента для сообщения.

    В реально использующихся системах ЭЦП по российскому стандарту числа имеют порядка 60 десятичных знаков.

    Проверка подписи

    Входные данные: сообщение $$M$$, исходные параметры, ключ проверки подписи и подпись к $$M$$.

    Выходные данные: заключение о подлинности или фальсификации подписи.

    Алгоритм:

  • Если хотя бы одно из условий $$1 \leq r \leq n - 1$$, $$1\leq s \leq n - 1$$ нарушается, то подпись фальшивая и работа алгоритма закончена.
  • Вычислить $$e = h(M)$$.
  • Вычислить $$v = {s}^{-1} ~(\mod n)$$.
  • Вычислить $${u}_{1} = e r ~(\mod n)$$.
  • Вычислить $${u}_{2} = r v ~(\mod n)$$.
  • Вычислить $$X = {u}_{1} \cdot G + {u}_{2} \cdot Q = (x, y)$$.
  • Если $$r = x ~(\mod n)$$, то подпись действительная, иначе подпись фальшивая.
  • Доказательство корректности алгоритма генерации и алгоритма проверки подписи очень простое и предоставляется в качестве упражнения.

    Пример 9.5 Требуется проверить подлинность подписи (11,9) для сообщения $$M$$, хэш-образ которого $$e=12$$.Секретный ключ нам неизвестен, открытый ключ абонента, подписавшего сообщение, равен $$Q = dG = (384, 276)$$.

    Проверка подписи начинается с проверки условий $$1 \leq r \leq n -1$$, $$1\leq s \leq n -1$$ - в данном случае они соблюдаются. Затем последовательно вычисляем

    $$ v = {s}^{-1} ~(\mod n) = {9}^{-1} ~(\mod 13) = 3, \\ {u}_{1} = ev ~(\mod n) = 12 \cdot 3 ~(\mod 13) = 10, \\ {u}_{2} = 11 \cdot 3 ~(\mod 13) = 7. $$

    Находим точку

    $$X = {u}_{1} \cdot G + {u}_{2} \cdot Q = 10 \cdot (384, 475) + 7 \cdot (384, 276) = (596, 318).$$

    Наконец, сравниваем значения $$r = 11$$ и $$x ~(\mod n) = 596 ~(\mod 13) = 11$$ - они совпадают, следовательно, подпись действительная.

    Приведем пример системы электронной подписи на эллиптической кривой, пригодный для практического применения.

    Пример 9.6 Рассмотрим эллиптическую кривую

    $$ \begin{array}{c} y^2=x^3-3x+b ~(\mod p),\\ p=6277101735386680763835789423207666416083908700390324961279,\\ b=64210519e59c80e70fa7e9ab72243049feb8deecc146b9b1_{16} =\\ 2455155546008943817740293915197451784769108058161191238065_{10}. \end{array} $$

    Её порядок

    $$n=6277101735386680763835789423176059013767194773182842284081$$

    является простым числом, а порождающим элементом группы является точка

    $$ \begin{align*} G=(602046282375688656758213480587526111916698976636884684818,\\ 174050332293622031404857552280219410364023488927386650641). \end{align*} $$

    Для построения электронной подписи нужно выбрать закрытый ключ $$d$$ и сгенерировать открытый ключ. Положим

    $$d = 639976254049691330438880136087803025472585373106.$$

    Вычислим открытый ключ $$Q=d\cdot G.$$

    $$ \begin{align*} Q=(2595782124878971211841629728570946759629426335223297207061,\\ 4116867532601224772898906888004625856512793631972205182197). \end{align*} $$

    Система цифровой подписи построена.

    Если читатель не имеет инструмента для работы с кривыми таких размеров, предлагаем небольшую программу на языке с++, вызывающую функцию библиотеки cryptopp для перемножение точек:

    #include <iostream>
    #include <cstdlib>
    #include <ecp.h>
    #include <integer.h>
    #include <osrng.h>
    
    using namespace std;
    
    using namespace CryptoPP;
    
    int main(int argc, char ** argv)
    {
        Integer p(argv[1]);
        Integer a(argv[2]);
        Integer b(argv[3]);
        ECP domain(p,a,b);
        Integer Gx(argv[4]);
        Integer Gy(argv[5]);
        ECPPoint G(Gx,Gy);
        Integer OrdG(argv[6]);
        ECPPoint nG = domain.Multiply(OrdG,G);
        cout<<nG.x<<" "<<nG.y<<endl;
    }
    \end{verbatim}
          

    Для её сборки нужно подключить библиотеку cryptopp (см. параграф 1.16.2). Допустим, мы собрали программу в исполняемый файл mulpoint (или mulpoint.exe под Windows).

    Программа запускается из командной строки:

     ./mulpoint p a b Gx Gy d
          

    и выводит результат через стандартный выходной поток. Например:

    $ ./mulpoint 751 -1 1 384 475 3
    596.  318.
          

    (здесь $ - приглашение командной строки linux). В нашем случае, помимо $$a=-3$$, все величины указаны в примере выше.

    Список литературы

  • Васильева И.Н. Защита информации -- СПб, 2009. -- 136 с.
  • Шнайер Б. Прикладная криптография. Протоколы, алгоритмы, исходные тексты на языке Си -- М.: Триумф, 2003. -- 816 с.
  • Харин Ю.С., Берник В.И., Матвеев Г.В. Математические основы криптологии -- Минск: БГУ, 1999. -- 319 с.
  • Жданов О.Н., Чалкин В.А. Эллиптические кривые. Основы теории и криптографические приложения -- М.: УРСС, 2013.
  • Schoof, R. Counting points on elliptic curves over finite fields //J. de Th\'{e}orie des Nombres de Bordeaux. -- \textnumero 7 (1995). -- p. 219-254.
  • Lercier, R., Morain, F. Counting the number of points on elliptic curves over finite fields: strategies and performances,
  • In L. C. Guillou and J.-J. Quisquater, editors, Advances in cryptology -- EUROCRYPT’95, \textnumero 921 (1995) of Lecture Notes in Comput. Sci. p. 79-94.
  • NIST FIPS 186-4, July 2013.
  • Вернуться к учебному плану