DSA: различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[отпатрулированная версия][непроверенная версия]
Содержимое удалено Содержимое добавлено
орфография
→‎Открытый и секретный ключи: Исправлена опечатка
Метки: с мобильного устройства из мобильной версии
 
(не показано 78 промежуточных версий 27 участников)
Строка 1: Строка 1:
{{Другой термин|DSA|Классификация климатов Кёппена| о значении Dsa}}
{{Карточка стандарта
{{Стандарт
|название = DSA, Digital Signature Algorithm
|название = DSA, Digital Signature Algorithm
|ширина = 275px
|ширина = 275px
|создатель = [[NIST]]
|создатель = [[NIST]]
|создан = [[1991 год]]
|создан = [[1991 год]]
|опубликован = [[1994 год]]
|опубликован = [[ год]]
|размер ключа = закрытый: 160-256 бит, открытый: 1024-3072 бит
|размер ключа = закрытый: 160-256 бит, открытый: 1024-3072 бит
|размер блока =
|размер блока =
|размер подписи= два числа по 160-256 бит
|размер подписи= два числа по 160-256 бит
}}
}}
'''DSA''' ([[Английский язык|англ.]] ''Digital Signature Algorithm — алгоритм цифровой подписи'') — [[Криптография|криптографический]] [[алгоритм]] с использованием [[Открытый ключ|закрытого ключа]] (из пары ключей: <открытый; закрытый>) для создания [[электронная подпись|электронной подписи]], но не для [[шифрование|шифрования]] (в отличие от [[RSA]] и [[Схема Эль-Гамаля|схемы Эль-Гамаля]]). Подпись создается секретно (закрытым ключом), но может быть публично проверена (открытым ключом). Это означает, что только один [[Субъект доступа|субъект]] может создать подпись сообщения, но любой может проверить её корректность. Алгоритм основан на [[Вычислительная сложность|вычислительной сложности]] взятия [[Дискретное логарифмирование|логарифмов в конечных полях]].
{{Другой термин|DSA|Классификация климатов Кёппена| о значении Dsa}}

'''DSA''' (''Digital Signature Algorithm'') — [[Криптография|криптографический]] [[алгоритм]] с использованием [[Открытый ключ|открытого ключа]] для создания [[электронная подпись|электронной подписи]], но не для [[шифрование|шифрования]] (в отличие от [[RSA]] и [[Схема Эль-Гамаля|схемы Эль-Гамаля]]). Подпись создается секретно, но может быть публично проверена. Это означает, что только один [[Субъект доступа|субъект]] может создать подпись сообщения, но любой может проверить её корректность. Алгоритм основан на вычислительной сложности взятия [[Дискретное логарифмирование|логарифмов в конечных полях]].
Алгоритм был предложен [[Национальный институт стандартов и технологий|Национальным институтом стандартов и технологий]] ([[США]]) в августе 1991 и является [[Патент|запатентованным]]{{sfn|Patent US 5231668 A}} (автор патента — David W. Kravitz), НИСТ сделал этот патент доступным для использования [[Royalty-free|без лицензионных отчислений]]. DSA является частью [[Digital Signature Standard|'''DSS''']] ([[Английский язык|англ.]] Digital Signature Standard — стандарт цифровой подписи), впервые опубликованного 15 декабря 1998 (документ FIPS-186{{sfn|FIPS 186-1}} ([[Английский язык|англ.]] [[FIPS|Federal Information Processing Standards]] — федеральные стандарты обработки информации)). Стандарт несколько раз обновлялся{{sfn|FIPS 186-2}}{{sfn|FIPS 186-3}}, последняя версия FIPS-186-4{{sfn|FIPS 186-4}}. (июль 2013).

== Описание алгоритма ==
[[File:Dsa workflow rus.png|600px|thumbnail|иллюстрация работы DSA]]
DSA включает в себя два алгоритма (S, V): для создания подписи сообщения (S) и для ее проверки (V).

Оба алгоритма вначале вычисляют [[Хеширование|хеш]] сообщения, используя [[Криптографическая хеш-функция|криптографическую хеш-функцию]]. Алгоритм S использует хеш и секретный ключ для создания подписи, алгоритм V использует хеш сообщения, подпись и открытый ключ для проверки подписи.


Стоит подчеркнуть, что фактически подписывается не сообщение (произвольной длины), а его хеш (160 - 256 бит), поэтому неизбежны [[Коллизия хеш-функции|коллизии]] и одна подпись, вообще говоря, действительна для нескольких сообщений с одинаковым хешем. Поэтому выбор достаточно "хорошей" хеш-функции очень важен для всей системы в целом. В первой версии стандарта использовалась хеш-функция [[SHA-1]]{{sfn|FIPS 180-4}}{{sfn|FIPS 186-1}} ([[Английский язык|англ.]] Secure Hash Algorithm ''- безопасный алгоритм хеширования)'', в последней версии также можно использовать любой алгоритм семейства [[SHA-2]]{{sfn|FIPS 180-4}}{{sfn|FIPS 186-4}}. В августе 2015 был опубликован FIPS-202{{sfn|FIPS 202}}, описывающий новую хеш-функцию [[SHA-3]]. Но на сегодняшний день она не включена в стандарт DSS{{sfn|FIPS 186-4}}.
Алгоритм был предложен Национальным институтом стандартов и технологий ([[США]]) в августе 1991 и является [[Патент|запатентованным]] {{US patent|5231668}}, но [[НИСТ]] сделал этот патент доступным для использования без лицензионных отчислений. Алгоритм вместе с криптографической хеш-функцией [[SHA-1]] является частью [[Digital Signature Standard|'''DSS''']] (Digital Signature Standard), впервые опубликованного в 1994 (документ FIPS-186 (Federal Information Processing Standards)[http://www.itl.nist.gov/fipspubs/fip186.htm]). Позднее были опубликованы 2 обновленные версии стандарта: FIPS 186-2 [http://csrc.nist.gov/publications/fips/archive/fips186-2/fips186-2.pdf] (27 января 2000 года) и FIPS 186-3 [http://csrc.nist.gov/publications/fips/fips186-3/fips_186-3.pdf] (июнь 2009).


Для работы системы требуется база соответствия между реальными реквизитами автора (это может быть как частное лицо, так и организация) и [[открытый ключ|открытыми ключами]], а также всеми необходимыми параметрами схемы цифровой подписи (хеш-функция, [[Простое число|простые числа]]). Например, подобной базой может служить [[центр сертификации]].
== Использование алгоритма ==
Для подписывания сообщений необходима пара ключей — открытый и закрытый. При этом [[закрытый ключ]] должен быть известен только тому, кто подписывает сообщения, а открытый — любому желающему проверить подлинность сообщения. Также общедоступными являются параметры самого алгоритма. Для обеспечения такого доступа достаточно авторитетная организация (или несколько организаций) поддерживает базу соответствия между реальными реквизитами автора (это может быть как частное лицо, так и организация) и [[открытый ключ|открытыми ключами]], а также всеми необходимыми параметрами схемы цифровой подписи (используемая [[Хеширование|хеш-функция]]). Эта организация также выдает [[цифровой сертификат|цифровые сертификаты]].


== Параметры схемы цифровой подписи ==
== Параметры схемы цифровой подписи ==
Для построения системы цифровой подписи нужно выполнить следующие шаги<!-- желающий должен произвести следующие действия -->:
Для построения системы цифровой подписи нужно выполнить следующие шаги:
# Выбор [[:Категория:криптографические хеш-функции|криптографической хеш-функции]] H(x).
# Выбор [[:Категория:криптографические хеш-функции|криптографической хеш-функции]] H(x).
# Выбор большого простого числа ''q'', размерность которого ''N'' в [[бит]]ах совпадает с размерностью в битах [[Хеширование|значений хэш-функции]] H(x).
# Выбор простого числа ''q'', размерность которого ''N'' в [[бит]]ах совпадает с размерностью в битах [[Хеширование|значений -функции]] H(x).
# Выбор простого числа ''p'', такого, что ''(p-1)'' делится на ''q''. Битовая длина ''p'' обозначается ''L'' (<math>2^{L-1} < p < 2^{L}</math>).
# Выбор простого числа ''p'', такого, что ''(p-1)'' делится на ''q''. Битовая длина ''p'' обозначается ''L''.
# Выбор числа ''g'' такого, что его [[мультипликативный порядок по модулю]] ''p'' равен ''q''. Для его вычисления можно воспользоваться формулой <math>g = h^{(p-1)/q}\mod p</math>, где ''h'' — некоторое произвольное число, <math>h \in (1; p - 1)</math> такое, что <math> g \neq 1 </math>. В большинстве случаев значение ''h'' = 2 удовлетворяет этому требованию.
# Выбор числа ''g'' такого, что его [[мультипликативный порядок по модулю]] ''p'' равен ''q''. Для его вычисления можно воспользоваться формулой <math>g = h^{(p-1)/q}\mod p</math>, где ''h'' — некоторое произвольное число, <math>h \in (1; p - 1)</math> такое, что <math> g \neq 1 </math>. В большинстве случаев значение ''h'' = 2 удовлетворяет этому требованию.


Как упомянуто выше, а также в [[Digital Signature Standard|DSS]] (Digital Signature Standard), первоочередным параметром схемы цифровой подписи является используемая [[:Категория:криптографические хеш-функции|криптографическая хеш-функция]], необходимая для преобразования текста сообщения в [[число]], которое собственно и будет подписано. Важной характеристикой этой функции является битовая длина выходной последовательности, обозначаемая далее ''N'' (160 для функции [[SHA-1]]). В первой версии стандарта [[Digital Signature Standard|DSS]] рекомендована функция [[SHA-1]] и, соответственно, битовая длина подписываемого числа 160 бит. Сейчас SHA-1 уже не является достаточно безопасной. В стандарте указаны следующие возможные пары значений чисел ''L'' и ''N'':
Как упомянуто выше, первоочередным параметром схемы цифровой подписи является используемая [[:Категория:криптографические хеш-функции|криптографическая хеш-функция]], необходимая для преобразования текста сообщения в [[число]], и . Важной характеристикой этой функции является битовая длина выходной последовательности, обозначаемая далее ''N''. В первой версии стандарта [[Digital Signature Standard|DSS]] рекомендована функция [[SHA-1]] и, соответственно, битовая длина подписываемого числа 160 бит. Сейчас SHA-1 уже не является достаточно безопасной. В стандарте указаны следующие возможные пары значений чисел ''L'' и ''N'':
# L = 1024, N = 160
# L = 1024, N = 160
# L = 2048, N = 224
# L = 2048, N = 224
Строка 30: Строка 37:
# L = 3072, N = 256
# L = 3072, N = 256


В соответствии с этим стандартом рекомендованы хеш-функции семейства [[SHA-2]]. Правительственные организации{{где?}} должны использовать один из этих вариантов, но все другие вольны выбирать. Проектирующий систему может выбрать любую хеш-функцию. Поэтому далее не будет заостряться внимание на использовании конкретной хеш-функции.
В соответствии с этим стандартом рекомендованы хеш-функции семейства [[SHA-2]]. Правительственные организации должны использовать один из вариантов, . Проектирующий систему может выбрать любую хеш-функцию. Поэтому далее не будет заостряться внимание на использовании конкретной хеш-функции.

Стойкость криптосистемы на основе DSA не превосходит стойкость используемой хеш-функции и стойкость пары (L,N), чья стойкость не больше стойкости каждого из чисел по отдельности. Ранее рекомендовалась длина ''p'' L = 1024 [[бит]]а. В данный момент для систем, которые должны быть стойкими до [[2010]] ([[2030]]) года, рекомендуется длина в 2048 (3072) бита.
Стойкость криптосистемы на основе DSA не превосходит стойкость используемой хеш-функции и стойкос��ь пары (L,N), чья стойкость не больше стойкости каждого из чисел по отдельности. Также важно учитывать, как долго система должна оставаться безопасной. В данный момент для систем, которые должны быть стойкими до [[2010]] ([[2030]]) года, рекомендуется длина в 2048 (3072) бита.{{sfn|FIPS 186-4}}{{sfn|NIST Special Publication 800-57}}


=== Открытый и секретный ключи ===
=== Открытый и секретный ключи ===
Строка 37: Строка 45:
# [[Открытый ключ]] вычисляется по формуле <math>y=g^x \mod p</math>
# [[Открытый ключ]] вычисляется по формуле <math>y=g^x \mod p</math>


Открытыми параметрами являются числа ''(p, q, g, y)''. Закрытый параметр только один — число ''x''. При этом числа ''(p, q, g)'' могут быть общими для группы пользователей, а числа ''x'' и ''y'' являются соответственно закрытым и открытым ключами конкретного пользователя. При подписании сообщения используются секретные числа ''x'' и ''k'', причем число ''k'' должно выбираться случайным образом (на практике псевдослучайным) при подписывании каждого следующего сообщения.
Открытыми параметрами являются числа ''(p, q, g, y)''. Закрытый параметр только один — число ''x''. При этом числа ''(p, q, g)'' могут быть общими для группы пользователей, а числа ''x'' и ''y'' являются соответственно закрытым и открытым ключами конкретного пользователя. При сообщения используются секретные числа ''x'' и ''k'', причем число ''k'' должно выбираться случайным образом (на практике псевдослучайным) при каждого следующего сообщения.


Поскольку ''(p, q, g)'' могут быть использованы для нескольких пользователей, на практике часто делят пользователей по некоторым критериям на группы с одинаковыми ''(p, q, g)''. Поэтому эти параметры называют доменными параметрами (Domain Parameters).
Поскольку ''(p, q, g)'' могут быть использованы для нескольких пользователей, на практике часто делят пользователей по некоторым критериям на группы с одинаковыми ''(p, q, g)''.


== Подпись сообщения ==
== Подпись сообщения ==
''Подпись сообщения выполняется по следующему алгоритму:''
''Подпись сообщения выполняется по следующему алгоритму:''


1 Выбор случайного числа <math>k \in (0,q)</math>
Выбор случайного числа <math>k \in (0,q)</math>
2 Вычисление <math>r=(g^k \mod p)\mod q</math>
Вычисление <math>r=(g^k \mod p)\mod q</math>
# Выбор другого k, если <math>r = 0</math>
3 Вычисление <math>s=k^{-1}(H(m)+x\cdot r)\mod q</math>
# Вычисление <math>s=k^{-1}(H(m)+x\cdot r)\mod q</math>
4 Выбор другого k, если оказалось, что r=0 или s=0
# Выбор другого k, если <math>s=0</math>
# Подписью является пара <math>(r,s)</math> общей длины <math>2N</math>


Вычислительно сложные операции это [[возведение в степень по модулю]] (вычисление <math>g^k\bmod p</math>), для которого существуют [[Алгоритмы быстрого возведения в степень|быстрые алгоритмы]], вычисление хеша <math>H(x)</math>, где сложность зависит от выбранного алгоритма хеширования и размера входного сообщения, и нахождение обратного элемента <math>k^{-1} \bmod q</math> используя, например, [[расширенный алгоритм Евклида]] или [[Малая теорема Ферма|малую теорему Ферма]] в виде <math>k^{-1}\bmod q = k^{q-2}\bmod q</math>.
Подписью является пара чисел (r, s), общая длина подписи ''2*N''.


== Проверка подписи ==
== Проверка подписи ==
''Проверка подписи выполняется по алгоритму:''
''Проверка подписи выполняется по алгоритму:''


1 Вычисление <math>w=s^{-1} \mod q</math>
1 Вычисление <math>w=s^{-1} \mod q</math>
Строка 58: Строка 68:
3 Вычисление <math>u_2 = r\cdot w \mod q</math>
3 Вычисление <math>u_2 = r\cdot w \mod q</math>
4 Вычисление <math>v = (g^{u_1}\cdot y^{u_2} \mod p) \mod q </math>
4 Вычисление <math>v = (g^{u_1}\cdot y^{u_2} \mod p) \mod q </math>
5 Подпись верна, если <math>v = r </math>

При проверке вычислительно сложные операции это два возведения в степень <math>g^{u_1} y^{u_2} </math>, вычисление хеша <math>H(x)</math> и нахождение обратного элемента <math>s^{-1} \bmod q</math>.
Подпись верна, если v = r


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


Во-первых, если <math>g=h^{(p-1)/q} \mod p</math>, то из этого по [[Малая теорема Ферма|Малой теореме Ферма]] следует
Во-первых, если <math>g=h^{(p-1)/q} \mod p</math>, то из этого по [[Малая теорема Ферма|Малой теореме Ферма]] следует
<math>g^q=h^{p-1}=1 \mod p</math>. Поскольку ''g''>1 и ''q'' простое число, то ''g'' должно иметь [[Мультипликативный порядок по модулю|мультипликативный порядок]] ''q'' по модулю ''p''.


Для подписи сообщения вычисляется
Для подписи сообщения вычисляется
Строка 81: Строка 90:
Наконец, корректность схемы DSA следует из
Наконец, корректность схемы DSA следует из


: <math>r=(g^k \mod p) \mod q=(g^{u1}y^{u2} \mod p) \mod q=v.</math>
: <math>r=(g^k \mod p) \mod q=(g^{u1}y^{u2} \mod p) \mod q=v.</math>
Поскольку фактически подписывается не само сообщение, а его хеш, то очевидно, что несколько различных сообщений могут иметь одинаковую подпись. Это связано с наличием у хеш-функций [[Коллизия хеш-функции|коллизий]] (существуют множества сообщений такие, что внутри каждого такого множества хеш-значения элементов совпадают).


== Пример работы ==
== Реализация алгоритма ==
Приведем пример работы алгоритма для небольших чисел. Пусть значение хеш - функции нашего сообщения <math>H = 9</math>.
Поскольку [[НИСТ]] сделал алгоритм свободным к использованию, то алгоритм можно свободно реализовывать программным, аппаратным или любым другим образом. [[НИСТ]] разработал программу проверки соответствия реализации алгоритма стандарту. Информация об этой системе доступна в документе [http://csrc.nist.gov/groups/STM/cavp/documents/dss/DSAVS.pdf]. Примеры работы алгоритма имеются в этом документе [http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/DSA2_All.pdf]. Реализации систем цифровой подписи должны использовать криптографические алгоритмы, алгоритмы генерации криптографических ключей и способы распределения ключей, безопасность которых так или иначе подтверждена. К таким алгоритмам и методам относятся алгоритмы и методы:
# описанные в документах FIPS (Federal Information Processing Standard)
# принятые в рекомендациях FIPS или NIST
# указанные в списке функций с подтвержденной безопасностью в документе FIPS 140-2.


=== Генерация параметров ===
=== Система проверки реализации алгоритма ===
# <math>H = 9_{10} = 1001_2</math>
Для определения соответствия реализации стандарту создана система для проверки реализации алгоритма (The Digital Signature Algorithm Validation System (DSAVS)). Система включает 5 отдельных тестов для проверки каждой из частей системы подписи, так что каждая компонента системы может быть протестирована на соответствие стандарту независимо от другой. Тестируемые компоненты реализации:
# длина хеша <math>4</math>, значит можно выбрать <math>q = 11_{10} = 1011_2</math>
# выберем <math>p = 23</math>, так как <math>23-1 = 22 = 2*q</math>
# выберем <math>g = 2^2 = 4</math>

=== Создание ключей ===
# в качестве [[Ключ (криптография)|секретного ключа]] выберем <math>x = 7</math>
# тогда открытый ключ <math>y=g^x \bmod p = 4^7 \bmod 23 = 16384 \bmod 23 = (712 \cdot 23 + 8) \bmod 23 = 8</math>

=== Подпись сообщения ===
# выберем <math>k = 3</math>
# тогда <math>r=(g^k \bmod p)\bmod q = (4^3 \bmod 23) \bmod 11 = 7</math>
# <math>r \ne 0</math>, идем дальше
# <math>s=k^{-1}(H(m)+x\cdot r)\bmod q = 4(9+7\cdot 7)\bmod 11 = 1</math>, где учтено, что <math>3^{-1} \bmod 11 = 4</math>
# <math>s \ne 0</math>, идем дальше
# подписью является пара чисел <math>(r,s) = (7,1)</math>

=== Проверка подписи ===
# <math>w=s^{-1} \bmod q = 1^{-1} \bmod 11 = 1</math>
# <math>u_1 = H(m)\cdot w \bmod q = 9\cdot1 \bmod 11 = 9</math>
# <math>u_2 = r\cdot w \bmod q = 7\cdot1 \bmod 11 = 7</math>
# <math>v = (g^{u_1}\cdot y^{u_2} \bmod p) \bmod q = (4^9\cdot8^7 \bmod 23) \bmod 11 = 7</math>
# получили, что <math>v = r</math>, значит подпись верна.

== Аналоги ==
Алгоритм DSA основывается на трудности вычисления дискретных логарифмов и является модификацией классической схемы [[Схема Эль-Гамаля|Эль-Гамаля]]{{sfn|Elgamal|1985}}, где добавлено хеширование сообщения, а также все логарифмы вычисляются по <math>mod~q </math>, что позволяет сделать подпись короче по сравнению с аналогами <ref>{{Статья|ссылка=https://link.springer.com/chapter/10.1007/0-387-34805-0_22|автор=C. P. Schnorr|заглавие=Efficient Identification and Signatures for Smart Cards|год=1990|ответственный=Gilles Brassard|язык=en|место=New York, NY|издание=Advances in Cryptology — CRYPTO’ 89 Proceedings|издательство=Springer|страницы=239–252|isbn=978-0-387-34805-6|doi=10.1007/0-387-34805-0_22|archivedate=2022-04-12|archiveurl=https://web.archive.org/web/20220412210143/https://link.springer.com/chapter/10.1007/0-387-34805-0_22}}</ref>. На основе схемы Эль-Гамаля построены и другие алгоритмы, например - российский [[ГОСТ Р34.10-1994|ГОСТ 34.10-94]], который сейчас считается устаревшим. На смену ему пришел стандарт [[ГОСТ Р 34.10-2012]]{{source-ref|Q19147219|ref=ГОСТ Р 34.11—2012|ref-year=2012|<!-- ГОСТ Р 34.11—2012 -->}}, в котором используется группа точек [[Эллиптическая криптография|эллиптической кривой]].

Подобная модификация, т.е. переход от мультипликативной группы по модулю простого числа к группе точек эллиптической кривой существует и для DSA - [[ECDSA]]{{sfn|The Elliptic Curve Digital Signature Algorithm (ECDSA)}} ( [[Английский язык|англ.]] Elliptic [[Curve Digital]] Signature Algorithm - алгоритм цифровой подписи на эллиптических кривых). Он применяется, например, в [[Криптовалюта|криптовалюте]] [[bitcoin]] для подтверждения транзакций. Этот перевод позволяет уменьшить размер ключей без ущерба для безопасности - в системе bitcoin размер закрытого ключа 256 бит, а соответствующего ему открытого - 512 бит.

Другой распространенный алгоритм с открытым ключом (используется и для шифрования, и для цифровой подписи), [[RSA]] (назван в честь авторов: [[Ривест, Рональд Линн|Ривест]],  [[Adi Shamir|Шамир]], [[Адлеман, Леонард Макс|Адлеман]]), основан на сложности факторизации больших чисел.

== Криптографическая стойкость ==
Любую атаку на алгоритм можно описать так: злоумышленник получает все открытые параметры подписи и некий набор пар ''(сообщение, подпись)'' и пытается, используя этот набор, создать действительную подпись для нового сообщения, не представленного в наборе.

Эти атаки можно условно разделить на две группы - во-первых, злоумышленник может попытаться восстановить секретный ключ <math>x</math>, и тогда он сразу получает возможность подписать любое сообщение, во-вторых, он может попробовать создать действительную подпись для нового сообщения без прямого восстановления секретного ключа.

=== Предсказуемость случайного параметра ===
Равномерное распределение случайного параметра <math>k</math> очень важно для безопасности системы. Если известны несколько последовательных бит параметра <math>k</math> для ряда подписей, то секретный ключ возможно восстановить с высокой вероятностью.{{sfn|The Insecurity of the Digital Signature Algorithm with Partially Known Nonces}}

Повторение параметра для двух сообщений ведет к простому взлому системы. Это может произойти при использовании плохого [[Генератор псевдослучайных чисел|генератора псевдослучайных чисел]]. Данная уязвимость в системе [[PlayStation 3]] позволяла подписывать от имени [[Sony]] любые программы. В некоторых реализациях системы bitcoin для [[Android]] злоумышленник мог получить доступ к кошельку.{{sfn|ECDSA - Application and Implementation Failures}}{{sfn|Elliptic Curve Cryptography in Practice}} В обоих примерах использовалась система [[ECDSA]]{{sfn|The Elliptic Curve Digital Signature Algorithm (ECDSA)}}.

Если для двух сообщений <math>m_1, m_2</math> использовался один и тот же параметр <math>k</math>, тогда их подписи <math>(r,s)</math> будут иметь одинаковые <math>r</math>, но разные <math>s</math>, назовем их <math>s_1,s_2</math>.

Из выражения для <math>s</math> можно выразить общий <math>k</math>:

<math>k = (H(m)+xr)s^{-1} \mod q</math>.

И приравнять общий <math>k</math> для разных сообщений:

<math>(H(m_1)+xr)s_1^{-1} \mod q = (H(m_2)+xr)s_2^{-1} \mod q</math>

Отсюда легко выразить секретный ключ <math>x</math>:

<math>x = \frac{H(m_1)s_1^{-1} - H(m_2)s_2^{-1}}{r(s_2^{-1}-s_1^{-1})}</math>

=== Existential forgery ===
На некоторые алгоритмы цифровой подписи возможна атака существующей подделки [[:en:Digital signature forgery|(Existential forgery)]]. Она заключается в том, что для подписи (либо вообще случайной, либо созданной по некоторому правилу) возможно создать корректное сообщение (которое, правда, обычно не несет смысла), используя только открытые параметры.

Для схемы DSA подпись <math>r = g^ey\mod p \mod q</math>, <math>s = r</math> при любом <math>e</math> корректна для сообщения с хешем <math>H(m) = es</math>.

Это одна из причин хеширования входного сообщения. При корректном выборе хеш-функции алгоритм DSA защищен от этой атаки, потому что обращение криптографической хеш-функции (т.е. для заданного <math>k</math> нахождение <math>m</math> такого, что <math>H(m) = k</math>) является вычислительно сложной задачей.{{sfn|Security Arguments for Digital Signatures and Blind Signatures}}

=== Восстановление ключа ===
условие корректности подписи можно переписать в ином виде:

<math>g^{ks}\mod p\mod q = g^{H(m)+xr}\mod p\mod q</math>

это уравнение эквивалентно (т.к.  мультипликативный порядок ''g''  по модулю ''p'' равен ''q)''

<math>H(m) \mod q= ks - xr \mod q</math>

значит можно считать, что злоумышленнику для восстановления ключа требуется решить систему уравнений вида

<math>H(m_i) \mod q= k_is_i - xr_i \mod q</math>

но в этой системе неизвестен <math>x</math> и все <math>k_i</math>, значит число неизвестных на единицу больше, чем уравнений и при любом <math>x</math> найдутся <math>k_i</math>, удовлетворяющие системе. Так как q - большое простое число, то для восстановления <math>x \mod q</math> потребуется экспоненциальное число пар ''(сообщение, подпись).''{{sfn|Patent US 5231668 A}}

=== Подделка подписи ===
Можно попытаться подделать подпись, не зная секретный ключ, то есть попытаться решить уравнение

<math>r^{s}\mod p\mod q = g^{H(m)}y^r\mod p\mod q</math>

относительно <math>r</math> и <math>s</math>. При каждом фиксированном <math>r</math> уравнение эквивалентно вычислению дискретного логарифма.{{sfn|Patent US 5231668 A}}

== Система проверки реализации алгоритма ==
Условия лицензии позволяют реализовывать алгоритм программно и аппаратно. НИСТ создал [[DSAVS]]{{sfn|The Digital Signature Algorithm Validation System}} ([[Английский язык|англ.]] ''The Digital Signature Algorithm Validation System - система проверки алгоритма цифровой подписи''). DSAVS состоит из нескольких модулей проверки на соответствие стандарту, которые тестируют каждый компонент системы независимо от других. Тестируемые компоненты реализации:
# Генерация доменных параметров
# Генерация доменных параметров
# Проверка доменных параметров
# Проверка доменных параметров
Строка 98: Строка 188:
# Проверка подписи
# Проверка подписи


Для проведения проверки реализации, разработчик должен подать соответствующую заявку на тестирование его реализации в авторизованную лабораторию тестирования криптографических модулей (Cryptographic Module Testing Laboratory (CMT laboratory)). Реализация, на проверку которой подана заявка, называется тестируемой реализацией (Implementation Under Test (IUT)). Запрос на тестирование реализации наряду со специфической информацией, необходимой для проведения тестов, содержит общую информацию о разработчике и тестируемой реализации. А именно, следующую информацию:
Для проверки реализации разработчик должен подать заявку на тестирование его реализации в Cryptographic Module Testing Laboratory ).

# Товарный знак разработчика
== Генерация простых чисел ==
# Название продукта, содержащего реализацию
При работе алгоритма DSA требуется два простых числа (<math>p</math> и <math>q</math>), следовательно необходим генератор простых или [[Псевдопростое число|псевдопростых]] чисел.
# Версия этого продукта

# Способ реализации (программно, аппаратно, программно-аппаратно)
Для генерации простых чисел используется алгоритм [[Шо-Тейлора]]{{sfn|Generating strong primes}}.
# Поддерживаемая конфигурация оборудования и операционная система (в случае программной или программно-аппаратной реализации)

# Краткое описание тестируемой реализации или продукта (семейства продуктов), в котором производитель реализовал тестируюмую систему (2-3 предложения)
Псевдопростые числа генерируются с помощью хеш-функции и для проверки на простоту используется вероятностный [[тест Миллера — Рабина]]. К нему может добавляться одиночный тест простоты [[Тест простоты Люка|Люка]].{{sfn|FIPS 186-4}}
# Поддерживаемые размеры числа ''p''

# поддерживаемые значения доменных параметров, если реализация работает только с конкретными значениями доменных параметров
Необходимое число итераций зависит от длины используемых чисел и от алгоритма проверки{{sfn|FIPS 186-4}}:
{| class="wikitable" style="width: 40%; height: 200px;"
!параметры
!только М-Р тест
!М-Р тест + тест Люка
|-
|p: 1024 бит
q: 160 бит

вероятность ошибки <math>2^{-80}</math>
|40
|р: 3
q: 19
|-
|p: 2048 бит
q: 224 бит


вероятность ошибки <math>2^{-112}</math>
== Генерация псевдопростых чисел для использования в алгоритме ==
|56
При работе алгоритма DSA требуется два простых числа (''p'' и ''q''), следовательно необходим генератор псевдослучайных псевдопростых чисел. В соответствии с [[Digital Signature Standard|DSS]] псевдопростые числа должны генерироваться с помощью методов, безопасность которых подтверждена в документах [[FIPS]]. Один из таких методов описан в дополнении к документу '''FIPS 186'''. При этом для проверки на простоту рекомендовано использовать вероятностный [[Тест Миллера — Рабина|тест Миллера — Рабина]] (в соответствии с '''FIPS 186''' рекомендовано число итераций 50).
|р: 3


q: 24
Простые числа должны удовлетворять условиям:
|-
# <math>2^{N - 1} < q < 2^{N}</math>
|p: 2048 бит
# <math>2^{L-1} < p < 2^{L}</math>
q: 256 бит
# <math>(p-1)</math> делится на <math>q</math>
Для генерации обоих чисел используется начальное число (''SEED''), которое может определяться уникальными данными домена, для которого планируется генерация доменных параметров, или быть случайным.


вероятность ошибки <math>2^{-112}</math>
=== Рекомендованный алгоритм генерации ===
|56
Пусть ''L'' представлена в виде <math>L - 1 = n*N + b</math>, где ''n'' и ''b'' — целые числа, причем ''b'' лежит в диапазоне от 0 включая до ''N''.
|р: 3
Генерация псевдопростых чисел ''p'' и ''q'' выполняется следующим образом:


q: 27
1. Выбор битовой последовательности длиной от ''N'', далее обозначаемой ''SEED''. Обозначим длину этой последовательности в битах ''seedlen''.
|-
2. Вычисляем <math>U=H(SEED) \oplus H(SEED+1 \mod 2^{seedlen})</math>
|p: 3072 бит
3. Формирование числа ''q'' из числа ''U'' путём выставления младшего и старшего значащих бит в 1. Что значит побитовое булево сложение с числами 1 и <math>2^{N-1}</math>. Заметим, что при этом <math>2^{N-1} < q < 2^{N}</math>.
q: 256 бит
4. Проверка, является ли полученное ''q'' простым.
5. Если окажется, что ''q'' составное, то переход на шаг 1
6. Введем переменные ''counter'' = 0 и ''offset'' = 2.
7. Для всех ''k'' = 0,...,n вычислим <math>V_k = H(SEED + offset + k \mod 2^{seedlen})</math>.
8. Введем целое число <math>W = V_0 + V_1*2^{N} + ... + V_{n-1}*2^{(n-1)*N} + (V_n \mod 2b) * 2^{n*N}</math> и число <math>X = W + 2^{L-1}</math>. Отметим, что <math>0 <= W < 2^{L-1}</math>, следовательно <math>2^{L-1} <= X < 2L</math>.
9. Пусть <math>c = X \mod 2q</math> и <math>p = X - (c - 1)</math>. При этом <math>p=1 \mod 2q</math>.
10. Если <math>p < 2^{L-1}</math>, то переходим на шаг 13.
11. Проверка ''p'' на простоту.
12. Если ''p'' проходит тест на простоту, то переходим на шаг 15.
13. Выполнение операций ''counter = counter + 1'' и ''offset = offset + n + 1''.
14. Если <math>counter >= 2^{12} = 4096</math>, то переходим на шаг 1, иначе переход на шаг 7.
15. Запоминаем значения ''SEED'' и ''counter'' для последующего использования (чтобы удостовериться в правильной генерации ''p'' и ''q'').


вероятность ошибки <math>2^{-128}</math>
== Генерация псевдослучайных чисел для использования в алгоритме ==
|64
Для работы алгоритма требуется также генератор случайных или псевдослучайных чисел. Этот генератор нужен для создания частного пользовательского ключа (''x''), а также для создания секретного случайного числа ''k'', которое вырабатывается заново для подписи каждого документа. Как и простые числа ''p'' и ''q'', эти случайные или псевдослучайные числа должны быть получены с помощью алгоритмов, безопасность которых подтверждена '''FIPS'''. Один из таких методов описан в дополнении C к стандарту '''ANSI X9.17''' (Financial Institution Key Management (Wholesale)).
|р: 2
Далее описываются методы, приведенные в дополнении к стандарту '''DSS''' (документ '''FIPS 186'''[http://www.itl.nist.gov/fipspubs/fip186.htm]).
<br>
Эти алгоритмы используют [[Односторонняя функция|одностороннюю функцию]] G(t, c), где ''t'' — это ''N''-битное число, ''c'' — b-битное, а результат функции G(t, c) — ''N''-битное. Один из способов построения такой функции — использование хеш-функции. Другой метод — использовать алгоритм симметричного шифрования. Эти методы для случая использования [[SHA-1]] (''N'' = 160) описаны в документе '''FIPS-186'''.


q: 27
=== Способ получения <math>m</math> значений секретного ключа ===
|}
1. Выбор секретного значения XKEY
2. Число ''t'' = 67452301 EFCDAB89 98BADCFE 10325476 C3D2E1F0 (в шестнадцатеричной записи)
3. Цикл по ''j'' с 0 до ''m - 1''
<code>
<math>XSEED_j = </math><необязательное значение, может быть получено путём ввода пользователем>;
<math>XVAL = XKEY + XSEED_j \mod 2^b</math>;
<math>x_j = G(t,XVAL) \mod q</math>;
<math>XKEY = 1 + XKEY + x_j \mod 2^b</math>;
</code>


== Генерация случайных чисел ==
=== Способ предварительного вычисления нескольких секретных значений ''k'' и ''r'' ===
Для работы алгоритма требуется также генератор случайных или [[Псевдослучайные числа|псевдослучайных]] чисел. Этот генератор нужен для создания частного пользовательского ключа ''x'', а также для создания секретного случайного параметра <math>k</math>''.''
1. Выбор секретного случайного значения KKEY.
2. Число ''t'' = EFCDAB89 98BADCFE 10325476 C3D2E1F0 67452301 (в шестнадцатеричной записи)
3. Цикл по ''j'' с 0 до ''m - 1''
<code>
<math>k = G(t,KKEY) \mod q</math>;
<math>k_j^{-1} = k^{-1} \mod q</math>;
<math>r_j = g^k \mod p \mod q</math>;
<math>KKEY = 1 + KKEY + k \mod 2b</math>;
</code>
4. Обозначим следующие ''m'' сообщений как <math>M_0, ..., M_{m-1}</math>. Цикл по j от 0 до m - 1
<code>
h = SHA(Mj);
<math>s_j = k_j^{-1}(h + x \cdot r_j) \mod q</math>
Цифровая подпись для <math>M_j</math> - <math>(r_j,s_j)</math>;
</code>
5. t = h;
6. Переход к шагу 3;


Cтандарт предлагает различные способы генерации псевдослучайных чисел используя [[Блочный шифр|блочные шифры]] или хеш-функции.{{sfn|FIPS 186-4}}{{sfn|Random Number Generation}}
Шаг 3 позволяет предварительно вычислить величины, необходимые для подписания следующих ''m'' сообщений. К шагу 4 можно переходить в любой момент, когда первое из этих ''m'' сообщений имеется в наличии. Когда следующее сообщение ещё не доступно, исполнение шага 4 может быть приостановлено. Как только этапы 4 и 5 завершились, можно перейти к исполнению этапа 3 для работы со следующей группой из ''m'' сообщений.
Кроме памяти для KKEY, необходимо выделить память для хранения двух массивов длины ''m'' (один массив для значений <math>r_0, ..., r_{m-1}^{}</math> и второй для чисел <math>k_0^{-1}, ...,k_{m-1}^{-1}</math>), полученных на этапе 3. Память для чисел <math>s_0, ..., s_{m-1}^{}</math> надо выделять только если необходим сохранять подписи для группы сообщений, иначе же <math>s_j</math> на этапе 4 могут быть заменены на одну переменную ''s''.


== См. также ==
== ==
{{примечания|2|refs=}}
* [[Электронная цифровая подпись]]
* [[Схема Эль-Гамаля]]
* [[RSA]]
* [[ECDSA]]
* [[ГОСТ Р 34.10-2001]]
* [[Случайное простое число]]


== Ссылки ==
== ==
* [http://www.nist.gov/public_affairs/releases/digsigst.htm FACT SHEET ON DIGITAL SIGNATURE STANDARD]


=== Стандарты и патенты ===
=== Ссылки на стандарты (англоязычные) ===
* {{Статья|автор=FIPS|заглавие= PUB 186-1|ссылка=http://www-archive.mozilla.org/projects/security/pki/nss/fips1861.pdf|язык=en|ref = FIPS 186-1}}
* [http://www.itl.nist.gov/fipspubs/fip186.htm Announcing the Standard for Digital Signature Standard (FIPS PUB 186)]
* [http://csrc.nist.gov/publications/fips/archive/fips186-2/fips186-2.pdf FIPS PUB 186-2]
* http://csrc.nist.gov/publications/fips/archive/fips186-2/fips186-2.pdf FIPS 186-2
* [http://csrc.nist.gov/publications/fips/fips186-3/fips_186-3.pdf FIPS PUB 186-3]
* http://csrc.nist.gov/publications/fips/fips186-3/fips_186-3.pdf FIPS 186-3
* {{Статья|автор=FIPS|заглавие= PUB 186-4|ссылка=http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf|язык=en|ref = FIPS 186-4}}
* [http://csrc.nist.gov/groups/STM/cavp/documents/dss/DSAVS.pdf Digital Signature Algorithm Validation System]
* {{Статья|автор=FIPS|заглавие=PUB 180-4|ссылка=http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf|язык=en|ref=FIPS 180-4|издание=|archiveurl=https://web.archive.org/web/20161126003357/http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf|archivedate=2016-11-26}}
* [http://csrc.nist.gov/groups/STM/cmvp/documents/fips140-2/FIPS1402IG.pdf FIPS PUB 140-2 (Security Requirements for Cryptographic Modules)]
* {{Статья|автор=FIPS|заглавие= PUB 202|ссылка=http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf|язык=en|ref = FIPS 202}}
* [http://csrc.nist.gov/publications/fips/fips180-3/fips180-3_final.pdf FIPS PUB 180-3 (Secure Hash Standard)]
* {{Статья|автор=FIPS|заглавие= PUB 202|ссылка=http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf|язык=en|ref = FIPS 202}}
* {{Статья|автор=David W. Kravitz|заглавие=Digital signature algorithm 5231668 A|ссылка=https://www.google.com/patents/US5231668|язык=en|издание=|тип=|год=|месяц=|число=|том=|номер=|страницы=|issn=|ref = Patent US 5231668 A}}
* {{Статья|автор=NIST Special Publication 800-57 Part 1Revision 4|заглавие= Recommendation for Key Management|ссылка=http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-57pt1r4.pdf|язык=en|ref = NIST Special Publication 800-57|издание=|тип=|год=|месяц=|число=|том=|номер=|страницы=|issn=}}
* {{Статья|автор=|заглавие= ГОСТ Р 34.10-2012. Информационные технологии. Криптографическая защита информации. Процессы формирования и проверки электронной цифровой подписи|ссылка=http://protect.gost.ru/document.aspx?control=7&id=180151|язык=ru|ref = ГОСТ Р 34.10-2012|издание=|тип=|год=|месяц=|число=|том=|номер=|страницы=|issn=}}
* {{Статья|автор=|заглавие= The Digital Signature Algorithm Validation System|ссылка=http://csrc.nist.gov/groups/STM/cavp/documents/dss/DSAVS.pdf|язык=en|ref = The Digital Signature Algorithm Validation System|издание=|тип=|год=|месяц=|число=|том=|номер=|страницы=|issn=}}
=== Статьи ===
* {{Статья|автор=Marc Stevens, Pierre Karpman, Thomas Peyrin|заглавие= Freestart collision for full SHA-1|ссылка=https://eprint.iacr.org/2015/967.pdf|язык=en|ref = Freestart collision for full SHA-1|издание=|тип=|год=|месяц=|число=|том=|номер=|страницы=|issn=}}
* {{Статья|автор=|заглавие= NIST Special Publication 800-90A Recommendation for Random Number Generation Using Deterministic Random Bit Generators|ссылка=http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-90Ar1.pdf|язык=en|ref = Random Number Generation|издание=|тип=|год=|месяц=|число=|том=|номер=|страницы=|issn=}}
* {{Статья|автор=J. Shawe-Taylor|заглавие= Generating strong primes|ссылка=http://digital-library.theiet.org/content/journals/10.1049/el_19860598|язык=en|ref = Generating strong primes|издание=|тип=|год=|месяц=|число=|том=|номер=|страницы=|issn=}}
* {{Статья|автор=Xiaoyun Wang, Yiqun Lisa, Hongbo Yu|заглавие= Finding Collisions in the Full SHA-1|ссылка=http://people.csail.mit.edu/yiqun/SHA1AttackProceedingVersion.pdf|язык=en|ref = Finding Collisions in the Full SHA-1|издание=|тип=|год=|месяц=|число=|том=|номер=|страницы=|issn=}}
* {{Статья|автор=Phong Q. Nguyen, Igor E. Shparlinski|заглавие= The Insecurity of the Digital Signature Algorithm with Partially Known Nonces|ссылка=https://link.springer.com/article/10.1007%2Fs00145-002-0021-3|язык=en|ref = The Insecurity of the Digital Signature Algorithm with Partially Known Nonces|издание=|тип=|год=|месяц=|число=|том=|номер=|страницы=|issn=}}
* {{Статья|автор=David Pointcheval, Jacques Stern|заглавие= Security Arguments for Digital Signatures and Blind Signatures|ссылка=http://www.math.uni-frankfurt.de/~dmst/teaching/SS2012/Vorlesung/Point.Stern.pdf|язык=en|ref = Security Arguments for Digital Signatures and Blind Signatures|издание=|тип=|год=|месяц=|число=|том=|номер=|страницы=|issn=}}
* {{Статья|автор=Markus Schmid|заглавие= ECDSA - Application and Implementation Failures|ссылка=https://pdfs.semanticscholar.org/a7c7/97dab90b439b0d436ee8807db4e9207cff32.pdf|язык=en|ref = ECDSA - Application and Implementation Failures|издание=|тип=|год=|месяц=|число=|том=|номер=|страницы=|issn=}}
* {{Статья|автор=Don Johnson, Alfred Menezes, Scott Vanstone|заглавие= The Elliptic Curve Digital Signature Algorithm (ECDSA)|ссылка=https://link.springer.com/article/10.1007/s102070100002|язык=en|ref = The Elliptic Curve Digital Signature Algorithm (ECDSA)|издание=|тип=|год=|месяц=|число=|том=|номер=|страницы=|issn=}}
* {{source|Q52600627|ref=Elgamal|ref-year=1985}} <!-- A Public-Key Cryptosystem and a Signature Scheme Based on Discrete Logarithms // IEEE Trans. Inf. Theory -->
* {{Статья|автор=Joppe W. Bos, J. Alex Halderman, Nadia Heninger, Jonathan Moore, Michael Naehrig, Eric Wustrow|заглавие= Elliptic Curve Cryptography in Practice|ссылка=https://eprint.iacr.org/2013/734.pdf|язык=en|ref = Elliptic Curve Cryptography in Practice|издание=|тип=|год=|месяц=|число=|том=|номер=|страницы=|issn=}}


{{Криптографические алгоритмы с парой открытый/закрытый ключ}}
{{Криптографические алгоритмы с парой открытый/закрытый ключ}}
Строка 201: Строка 279:
[[Категория:Стандарты криптографии]]
[[Категория:Стандарты криптографии]]
[[Категория:Электронная подпись]]
[[Категория:Электронная подпись]]
[[Категория:Стандарты США]]

Текущая версия от 14:50, 17 августа 2023

DSA, Digital Signature Algorithm
Создатель NIST
Создан 1991 год
Опубликован 1998 год
Размер ключа закрытый: 160-256 бит, открытый: 1024-3072 бит
Размер подписи два числа по 160-256 бит

DSA (англ. Digital Signature Algorithm — алгоритм цифровой подписи) — криптографический алгоритм с использованием закрытого ключа (из пары ключей: <открытый; закрытый>) для создания электронной подписи, но не для шифрования (в отличие от RSA и схемы Эль-Гамаля). Подпись создается секретно (закрытым ключом), но может быть публично проверена (открытым ключом). Это означает, что только один субъект может создать подпись сообщения, но любой может проверить её корректность. Алгоритм основан на вычислительной сложности взятия логарифмов в конечных полях.

Алгоритм был предло��ен Национальным институтом стандартов и технологий (США) в августе 1991 и является запатентованным[1] (автор патента — David W. Kravitz), НИСТ сделал этот патент доступным для использования без лицензионных отчислений. DSA является частью DSS (англ. Digital Signature Standard — стандарт цифровой подписи), впервые опубликованного 15 декабря 1998 (документ FIPS-186[2] (англ. Federal Information Processing Standards — федеральные стандарты обработки информации)). Стандарт несколько раз обновлялся[3][4], последняя версия FIPS-186-4[5]. (июль 2013).

Описание алгоритма

[править | править код]
иллюстрация работы DSA

DSA включает в себя два алгоритма (S, V): для создания подписи сообщения (S) и для ее проверки (V).

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

Стоит подчеркнуть, что фактически подписывается не сообщение (произвольной длины), а его хеш (160 - 256 бит), поэтому неизбежны коллизии и одна подпись, вообще говоря, действительна для нескольких сообщений с одинаковым хешем. Поэтому выбор достаточно "хорошей" хеш-функции очень важен для всей системы в целом. В первой версии стандарта использовалась хеш-функция SHA-1[6][2] (англ. Secure Hash Algorithm - безопасный алгоритм хеширования), в последней версии также можно использовать любой алгоритм семейства SHA-2[6][5]. В августе 2015 был опубликован FIPS-202[7], описывающий новую хеш-функцию SHA-3. Но на сегодняшний день она не включена в стандарт DSS[5].

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

Параметры схемы цифровой подписи

[править | править код]

Для построения системы цифровой подписи нужно выполнить следующие шаги:

  1. Выбор криптографической хеш-функции H(x).
  2. Выбор простого числа q, размерность которого N в битах совпадает с размерностью в битах значений хеш-функции H(x).
  3. Выбор простого числа p, такого, что (p-1) делится на q. Битовая длина p обозначается L.
  4. Выбор числа g () такого, что его мультипликативный порядок по модулю p равен q. Для его вычисления можно воспользоваться формулой , где h — некоторое произвольное число, такое, что . В большинстве случаев значение h = 2 удовлетворяет этому требованию.[5]

Как упомянуто выше, первоочередным параметром схемы цифровой подписи является используемая криптографическая хеш-функция, необходимая для преобразования текста сообщения в число, для которого и вычисляется подпись. Важной характеристикой этой функции является битовая длина выходной последовательности, обозначаемая далее N. В первой версии стандарта DSS рекомендована функция SHA-1[2] и, соответственно, битовая длина подписываемого числа 160 бит. Сейчас SHA-1 уже не является достаточно безопасной[8][9]. В стандарте указаны следующие возможные пары значений чисел L и N:

  1. L = 1024, N = 160
  2. L = 2048, N = 224
  3. L = 2048, N = 256
  4. L = 3072, N = 256

В соответствии с этим стандартом рекомендованы хеш-функции семейства SHA-2. Правительственные организации США должны использовать один из первых трех вариантов, центры сертификации должны использовать пару, которая равна или превосходит пару, используемую подписчиками[5]. Проектирующий систему может выбрать любую допустимую хеш-функцию. Поэтому далее не будет заостряться внимание на использовании конкретной хеш-функции.

Стойкость криптосистемы на основе DSA не превосходит стойкость используемой хеш-функции и стойкость пары (L,N), чья стойкость не больше стойкости каждого из чисел по отдельности. Также важно учитывать, как долго система должна оставаться безопасной. В данный момент для систем, которые должны быть стойкими до 2010 (2030) года, рекомендуется длина в 2048 (3072) бита.[5][10]

Открытый и секретный ключи

[править | править код]
  1. Секретный ключ представляет собой число
  2. Открытый ключ вычисляется по формуле

Открытыми параметрами являются числа (p, q, g, y). Закрытый параметр только один — число x. При этом числа (p, q, g) могут быть общими для группы пользователей, а числа x и y являются соответственно закрытым и открытым ключами конкретного пользователя. При подписывании сообщения используются секретные числа x и k, причем число k должно выбираться случайным образом (на практике псевдослучайным) при вычислении подписи каждого следующего сообщения.

Поскольку (p, q, g) могут быть использованы для нескольких пользователей, на практике часто делят пользователей по некоторым критериям на группы с одинаковыми (p, q, g).

Подпись сообщения

[править | править код]

Подпись сообщения выполняется по следующему алгоритму[5]:

  1. Выбор случайного числа
  2. Вычисление
  3. Выбор другого k, если
  4. Вычисление
  5. Выбор другого k, если
  6. Подписью является пара общей длины

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

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

[править | править код]

Проверка подписи выполняется по алгоритму[5]:

1 Вычисление 
2 Вычисление 
3 Вычисление 
4 Вычисление 
5 Подпись верна, если 

При проверке вычислительно сложные операции это два возведения в степень , вычисление хеша и нахождение обратного элемента .

Корректность схемы

[править | править код]

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

Во-первых, если , то из этого по Малой теореме Ферма следует . Поскольку g>1 и q простое число, то g должно иметь мультипликативный порядок q по модулю p.

Для подписи сообщения вычисляется

Из этого следует

Так как g имеет порядок q, получим

Наконец, корректность схемы DSA следует из

[5]

Пример работы

[править | править код]

Приведем пример работы алгоритма для небольших чисел. Пусть значение хеш - функции нашего сообщения .

Генерация параметров

[править | править код]
  1. длина хеша , значит можно выбрать
  2. выберем , так как
  3. выберем

Создание ключей

[править | править код]
  1. в качестве секретного ключа выберем
  2. тогда открытый ключ

Подпись сообщени��

[править | править код]
  1. выберем
  2. тогда
  3. , идем дальше
  4. , где учтено, что
  5. , идем дальше
  6. подписью является пара чисел

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

[править | править код]
  1. получили, что , значит подпись верна.

Алгоритм DSA основывается на трудности вычисления дискретных логарифмов и является модификацией классической схемы Эль-Гамаля[11], где добавлено хеширование сообщения, а также все логарифмы вычисляются по , что позволяет сделать подпись короче по сравнению с аналогами [12]. На основе схемы Эль-Гамаля построены и другие алгоритмы, например - российский ГОСТ 34.10-94, который сейчас считается устаревшим. На смену ему пришел стандарт ГОСТ Р 34.10-2012[13], в котором используется группа точек эллиптической кривой.

Подобная модификация, т.е. переход от мультипликативной группы по модулю простого числа к группе точек эллиптической кривой существует и для DSA - ECDSA[14] ( англ. Elliptic Curve Digital Signature Algorithm - алгоритм цифровой подписи на эллиптических кривых). Он применяется, например, в криптовалюте bitcoin для подтверждения транзакций. Этот перевод позволяет уменьшить размер ключей без ущерба для безопасности - в системе bitcoin размер закрытого ключа 256 бит, а соответствующего ему открытого - 512 бит.

Другой распространенный алгоритм с открытым ключом (используется и для шифрования, и для цифровой подписи), RSA (назван в честь авторов: РивестШамир, Адлеман), основан на сложности факторизации больших чисел.

Криптографическая стойкость

[править | править код]

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

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

Предсказуемость случайного параметра

[править | править код]

Равномерное распределение случайного параметра очень важно для безопасности системы. Если известны несколько последовательных бит параметра для ряда подписей, то секретный ключ возможно восстановить с высокой вероятностью.[15]

Повторение параметра для двух сообщений ведет к простому взлому системы. Это может произойти при использовании плохого генератора псевдослучайных чисел. Данная уязвимость в системе PlayStation 3 позволяла подписывать от имени Sony любые программы. В некоторых реализациях системы bitcoin для Android злоумышленник мог получить доступ к кошельку.[16][17] В обоих примерах использовалась система ECDSA[14].

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

Из выражения для можно выразить общий :

.

И приравнять общий для разных сообщений:

Отсюда легко выразить секретный ключ :

Existential forgery

[править | править код]

На некоторые алгоритмы цифровой подписи возможна атака существующей подделки (Existential forgery). Она заключается в том, что для подписи (либо вообще случайной, либо созданной по некоторому правилу) возможно создать корректное сообщение (которое, правда, обычно не несет смысла), используя только открытые параметры.

Для схемы DSA подпись , при любом корректна для сообщения с хешем .

Это одна из причин хеширования входного сообщения. При корректном выборе хеш-функции алгоритм DSA защищен от этой атаки, потому что обращение криптографической хеш-функции (т.е. для заданного нахождение такого, что ) является вычислительно сложной задачей.[18]

Восстановление ключа

[править | править код]

условие корректности подписи можно переписать в ином виде:

это уравнение эквивалентно (т.к.  мультипликативный порядок g  по модулю p равен q)

значит можно считать, что злоумышленнику для восстановления ключа требуется решить систему уравнений вида

но в этой системе неизвестен и все , значит число неизвестных на единицу больше, чем уравнений и при любом найдутся , удовлетворяющие системе. Так как q - большое простое число, то для восстановления потребуется экспоненциальное число пар (сообщение, подпись).[1]

Подделка подписи

[править | править код]

Можно попытаться подделать подпись, не зная секретный ключ, то есть попытаться решить уравнение

относительно и . При каждом фиксированном уравнение эквивалентно вычислению дискретного логарифма.[1]

Система проверки реализации алгоритма

[править | править код]

Условия лицензии позволяют реализовывать алгоритм программно и аппаратно. НИСТ создал DSAVS[19] (англ. The Digital Signature Algorithm Validation System - система проверки алгоритма цифровой подписи). DSAVS состоит из нескольких модулей проверки на соответствие стандарту, которые тестируют каждый компонент системы независимо от других. Тестируемые компоненты реализации:

  1. Генерация доменных параметров
  2. Проверка доменных параметров
  3. Генерация пары открытый-закрытый ключ
  4. Создание подписи
  5. Проверка подписи

Для проверки реализации разработчик должен подать заявку на тестирование его реализации в CMT laboratory (англ. Cryptographic Module Testing Laboratory  - лаборатория тестирования криптографических модулей).[5]

Генерация простых чисел

[править | править код]

При работе алгоритма DSA требуется два простых числа ( и ), следовательно необходим генератор простых или псевдопростых чисел.

Для генерации простых чисел используется алгоритм Шо-Тейлора[20].

Псевдопростые числа генерируются с помощью хеш-функции и для проверки на простоту используется вероятностный тест Миллера — Рабина. К нему может добавляться одиночный тест простоты Люка.[5]

Необходимое число итераций зависит от длины используемых чисел и от алгоритма проверки[5]:

параметры только М-Р тест М-Р тест + тест Люка
p: 1024 бит

q: 160 бит

вероятность ошибки

40 р: 3

q: 19

p: 2048 бит

q: 224 бит

вероятность ошибки

56 р: 3

q: 24

p: 2048 бит

q: 256 бит

вероятность ошибки

56 р: 3

q: 27

p: 3072 бит

q: 256 бит

вероятность ошибки

64 р: 2

q: 27

Генерация случайных чисел

[править | править код]

Для работы алгоритма требуется также генератор случайных или псевдослучайных чисел. Этот генератор нужен для создания частного пользовательского ключа x, а также для создания секретного случайного параметра .

Cтандарт предлагает различные способы генерации псевдослучайных чисел используя блочные шифры или хеш-функции.[5][21]

Примечания

[править | править код]

Литература

[править | править код]

Стандарты и патенты

[править | править код]