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

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

< Лекция 8 || Лекция 9: 12

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

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

См. [2]

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

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

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

  1. Отправитель создает безобидное сообщение;
  2. Используя общий ключ с получателем сообщения, отправитель подписывает безобидное сообщение, пряча свое подсознательное сообщение в подписи;
  3. Отправитель посылает подписанное сообщение по общедоступному каналу передачи;
  4. Проверяющий читает сообщение и проверяет подпись. Не обнаружив ничего подозрительного, он передает сообщение дальше;
  5. Получатель проверяет подпись под безобидным сообщением, убеждаясь что сообщение получено от отправителя;
  6. Получатель игнорирует безобидное сообщение и, используя общий с отправителем секретный ключ, извлекает подсознательное сообщение;

Рассмотрим простейший пример организации подсознательного канала передачи информации используя цифровую подпись реализуемую по методу Эль-Гамаля.

  1. Сначала необходимо сгенерировать пару ключей, для этого выбирается простое 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;

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

  3. Вычисляем значение цифровой подписи (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) и в тоже время создали скрытый канал;

  4. Проверяющий может просмотреть безобидное сообщение и удостовериться что сообщение передано от отправителя с подписью (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.
  5. Получатель, обладающий секретным ключом, удостоверяется в том, что сообщение пришло именно от того отправителя, с которым организован скрытый канал, для этого он проводит вычисления:
    
\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.
  6. Получатель восстанавливает скрытое сообщение:
    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}, ( 9.1)
G \in E\Rightarrow N \cdot G= \mathcal{O}. ( 9.2)

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

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

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

  1. Порядок точки G, используемой в системе ЭЦП, должен быть простым числом n> \max \left\{ {2}^{160},4\sqrt{p}\right\}.
  2. N\neq p и N \neq p + 1, где N - порядок кривой.
  3. {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).

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

Замечания.

  1. При r = 0 результат вычисления s не зависит от секретного ключа d.
  2. При s = 0 необходимого для проверки подписи числа {s}^{-1} ~(\mod  n) не существует.
  3. В качестве хеш-функции 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. Если хотя бы одно из условий 1 \leq  r \leq n - 1, 1\leq s \leq n - 1 нарушается, то подпись фальшивая и работа алгоритма закончена.
  2. Вычислить e = h(M).
  3. Вычислить v =  {s}^{-1} ~(\mod  n).
  4. Вычислить {u}_{1} = e r ~(\mod  n).
  5. Вычислить {u}_{2} = r v ~(\mod  n).
  6. Вычислить X =  {u}_{1} \cdot G +  {u}_{2} \cdot Q = (x, y).
  7. Если 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, все величины указаны в примере выше.

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

  1. Васильева И.Н. Защита информации -- СПб, 2009. -- 136 с.
  2. Шнайер Б. Прикладная криптография. Протоколы, алгоритмы, исходные тексты на языке Си -- М.: Триумф, 2003. -- 816 с.
  3. Харин Ю.С., Берник В.И., Матвеев Г.В. Математические основы криптологии -- Минск: БГУ, 1999. -- 319 с.
  4. Жданов О.Н., Чалкин В.А. Эллиптические кривые. Основы теории и криптографические приложения -- М.: УРСС, 2013.
  5. 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.
  6. Lercier, R., Morain, F. Counting the number of points on elliptic curves over finite fields: strategies and performances,
  7. 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.
  8. NIST FIPS 186-4, July 2013.
< Лекция 8 || Лекция 9: 12
Евгений Шаров
Евгений Шаров

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

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

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

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