Вы находитесь на странице: 1из 39

Минобрнауки России

Юго–Западный государственный университет

Кафедра информационной безопасности

КУРСОВАЯ РАБОТА

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


(наименование дисциплины)
на тему «Программная реализация схемы ЭЦП на основе сложности факторизации
RSA-модуля. Согласно варианту задания»

Специальность 10.05.02 Информационная безопасность телекоммуникационных


(код, наименование)
систем

Автор работы А.А.Вялых _________________


(инициалы, фамилия) (дата, подпись)

Группа БТ–81

Руководитель работы М.А. Ефремов _________________


(инициалы, фамилия) (дата, подпись)

Работа защищена ________________________


(дата)

Оценка_____________________

Члены комиссии _________________________ .


(подпись, дата) (инициалы, фамилия)

_________________________ .
(подпись, дата) (инициалы, фамилия)

_________________________ .
(подпись, дата) (инициалы, фамилия)

Курск 2022 г.
1
Минобрнауки России
Юго–Западный государственный университет

Кафедра информационной безопасности

ЗАДАНИЕ НА КУРСОВУЮ РАБОТУ

Студент Вялых А.А. шифр 18–06–0060 группа БТ–81


(фамилия, инициалы)

1. Тема «Программная реализация схемы ЭЦП на основе сложности факторизации


RSA-модуля. Согласно варианту задания»
2. Срок представления работы к защите « » января 2022 г.
3. Исходные данные: учебная и научная литература, конспекты лекций, статьи
периодических изданий, интернет–источники.
4. Содержание пояснительной записки курсовой работы:
4.1 Введение (объект, предмет, цель, методы, актуальность)
4.2 Основные теоретические сведения (ЭЦП, ассиметричные криптосистемы,
алгоритм RSA)
4.3 Описание математического аппарата исследуемой модели ЭЦП (алгоритм
генерации подписи в ЭЦП, блок-схемы программной реализации ЭЦП)
4.4 Программная реализация модели ЭЦП (интерфейс программы, тестирование
программы, генерация числовых примеров)
4.5 Заключение
4.6 Список использованных источников
4.7 Приложение А
5. Перечень графического материала: не предусмотрен
Руководитель работы М.А. Ефремов
(подпись, дата) (инициалы, фамилия)

Задание принял к исполнению А.А. Вялых


(подпись, дата) (инициалы, фамилия)

2
Реферат

Курсовая работа содержит 39 страницы, 16 рисунков, 12 источников,


приложение.
Ключевые слова: алгоритм RSA, схемы ЭЦП, электронная подпись, хэш-
функция, ассиметричное шифрование, программная реализация.
Обьектом данной курсовой работы являются методы создания электронно-
цифровой подписи.
Предметом данной курсовой работы являются схемы ЭЦП на основе
сложности факторизации RSA-модуля.
Целью курсовой работы является повышение производительности
программных средств криптографической защиты информации за счет реализации
схемы ЭЦП на основе сложности факторизации RSA модуля.
В ходе выполнения данной работы были получены следующие результаты:
 разработана программа на языке программирования c#, с помощью которой
был реализована ЭЦП на базе модуля RSA;
 был рассчитан числовой пример алгоритма RSA.

3
Abstract

The course work contains 39 pages, 16 figures, 12 sources, application.

Key words: RSA algorithm, EDS schemes, electronic signature, asymmetric


encryption, software implementation.
The object of this course work is the methods of creating an electronic digital
signature.
The subject of this course work is EDS schemes based on the complexity of
factorization of the RSA module.
The purpose of the course work is to improve the performance of cryptographic
information protection software by implementing an EDS scheme based on the complexity
of RSA module factorization.
In the course of this work, the following results were obtained:
 a program was developed in the c # programming language, with the help of
which an EDS was implemented on the basis of the RSA module;
 a numerical example of the RSA algorithm was calculated.

4
Содержание

Введение 6
1 Основные теоретические сведения 8
1.1 Электронно-цифровая подпись (ЭЦП). Общая схема 8
1.2 Асимметричные криптосистемы 10
1.3 Описание алгоритма RSA 12
2 Описание математического аппарата исследуемой модели ЭЦП 14
2.1 Теоретическое сведения о реализации ЭЦП на основе сложности
факторизации ЭЦП модуля 14
2.2 Алгоритм нахождения ключевых пар и генерации подписи в ЭЦП с
RSA модулем 15
2.3 Разработка блок-схем программной реализации ЭЦП 16
3 Программная реализация модели ЭЦП 21
3.1 Описание интерфейса программы 21
3.2 Тестирование работы программы 24
3.3 Генерация числовых примеров 27
Заключение 30
Список использованных источников 31
Приложение А 32

5
Введение

Актуальность курсовой работы обусловлена тем, что в современном мире


вопрос подтверждения подлинности цифрового документа имеет очень
значительную роль во множестве различных процессов. Из-за стремительно
растущих вычислительных мощностей становится вероятна ситуация, при которой
злоумышленники смогут взламывать существующие методы защиты информации в
корыстных целях. Поэтому необходимо уделять значительное внимание методам
улучшения безопасности передачи информации путем использования более
совершенных инструментов защиты информации. В данной курсовой работе
исследуемый алгоритм был технически реализован в виде программы,
использование которой возможно в дальнейшей учебной деятельности для
понимания реализации электронной подписи на сложности факторизации RSA-
модуля.
Электронно-цифровой подписью (ЭЦП) называется реквизит электронного
документа, который предназначен для защиты данного электронного документа от
подделки, полученный в результате криптографического преобразования
информации с использованием закрытого ключа электронной цифровой подписи, а
также позволяющий идентифицировать владельца сертификата ключа подписи и
установить отсутствие искажения информации в электронном документе.
В данной курсовой работе в качестве ЭЦП будет использоваться алгоритм
шифрования RSA.
RSA (аббревиатура от фамилий Rivest, Shamir и Adleman) – это
криптографический алгоритм с открытым ключом, основывающийся на
вычислительной сложности задачи факторизации больших целых чисел.
Криптосистема RSA является первой системой, использование которой возможно и
для шифрования, и для цифровой подписи. RSA дает возможность проверить
целостность сообщения и личность лица, который сделал данную электронную
подпись. Отправитель создает хэш-функцию сообщения и шифрует ее с
использованием своего секретного ключа, а затем Получатель использует открытый
6
ключ отправителя для расшифровки хэша, рассчитывает хэш для сообщения и
сравнивает эти два хэша.
Обьектом данной курсовой работы являются методы создания электронно-
цифровой подписи.
Предметом данной курсовой работы являются схемы ЭЦП на основе
сложности факторизации RSA-модуля.
Целью курсовой работы является повышение производительности
программных средств криптографической защиты информации за счет реализации
схемы ЭЦП на основе сложности факторизации RSA модуля.

Для реализации выше представленной цели необходимо выполнить


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

7
1 Основные теоретические сведения

1.1 Электронно-цифровая подпись (ЭЦП). Общая схема

Электронно-цифровой подписью (ЭЦП) называется реквизит электронного


документа, который предназначен для защиты данного электронного документа от
подделки, полученный в результате криптографического преобразования
информации с использованием закрытого ключа электронной цифровой подписи, а
также позволяющий идентифицировать владельца сертификата ключа подписи и
установить отсутствие искажения информации в электронном документе.
Если выражаться другими словами, то это последовательность битов,
вычисленная уникально для каждого конкретного сообщения. Подпись может быть
вычислена как с применением секретного ключа, так и без него. Без секретного
ключа подпись представляет собой просто код, который может доказать, что
документ не был изменен. С использованием секретного ключа подпись докажет
целостность сообщения, позволит убедиться в его подлинности и
аутентифицировать источник.
К основным элементам схемы электронно-цифровой подписи относят
следующие понятия:
 алгоритм генерации ключевых пар пользователя;
 функцию вычисления подписи;
 функцию проверки подписи.
Функция для вычисления подписи на основе документа и секретного ключа
пользователя вычисляет саму подпись. Функция вычисления подписи может быть
детерминированной или вероятностной. Детерминированные функции всегда
вычисляют одинаковую подпись, используя идентичные входные данные.
Вероятностные функции вносят в подпись элемент случайности, что усиливает
криптостойкость алгоритмов ЭЦП. Для вероятностных схем необходим надёжный
источник случайности, которым могут являться либо криптографически надёжный
генератор псевдослучайных бит, либо аппаратный генератор шума), что усложняет
8
процесс создания. На сегодняшний день детерминированные схемы практически не
используются в реальной жизни.
Поскольку размер подписываемых документов часто является величиной
переменной и достаточно большой, в схемах ЭЦП зачастую вместо самого текста
используют его хэш. Для вычисления хэш используются криптографические хэш-
функции.
Хэш-функция  это процедура обработки сообщения, в результате действия
которой формируется строка символов (дайджест сообщения) фиксированного
размера. Малейшие изменения в тексте сообщения приводят к изменению
дайджеста при обработке сообщения хэш-функцией. Таким образом, любые
искажения, внесенные в текст сообщения, отразятся в дайджесте.
Хэш-функции не являются частью алгоритма ЭЦП, поэтому в схеме может
быть использована любая надёжная хэш-функция. Существует несколько широко
применяемых хэш-функций:MD5, SHA-1 и другие.
Алгоритмы ЭЦП можно разделить на 2 больших класса:
 обычные цифровые подписи;
 цифровые подписи с восстановлением документа.
Обычные цифровые подписи необходимо пристыковывать к подписываемому
документу. К этому классу относятся, например, алгоритмы, основанные на
эллиптических кривых.
Цифровые подписи с восстановлением документа как бы содержат в себе
подписываемый документ: в процессе проверки подписи автоматически
вычисляется и тело документа. Если при расшифровывании сообщение
восстановилось правильно, значит, подпись была верной. Цифровая подпись с
восстановлением документа может быть реализована, например, с помощью одного
из самых популярных алгоритмов формирования ЭЦП – RSA.

9
1.2 Асимметричные криптосистемы

Асимметричные криптосистемы были придуманы и разработаны в 70-х годах


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

Рисунок 1 – Обобщенная схема асимметричной криптосистемы шифрования

Для криптографического закрытия и дальнейшего расшифровывания


передаваемой информации используются открытый и секретный ключи получателя
сообщения.
10
В качестве ключа зашифровывания должен использоваться открытый ключ
получателя, а в качестве ключа расшифровывания – секретный ключ.
Секретный и открытый ключи генерируются попарно. Секретный ключ
должен находиться только у его владельца и быть надежно защищен от
несанкционированного доступа (аналогично ключу шифрования в симметричных
алгоритмах). Копия открытого ключа должна находиться у каждого абонента
криптографической сети, с которым обменивается информацией собственник
секретного ключа.
Процесс передачи зашифрованной информации в асимметричной
криптосистеме можно описать следующими действиями:
 Абонент В создает пару ключей: секретный ключ кв и открытый ключ Кв;
 Открытый ключ Кв посылается абоненту А и остальным абонентам;
 Происходит обмен информацией между абонентами А и В;
 Абонент А зашифровывает сообщение с помощью открытого ключа Кв
абонента В и отправляет шифротекст абоненту В;
 Абонент В расшифровывает сообщение с помощью своего секретного ключа
кв. Никто другой (в том числе абонент А) не может расшифровать данное
сообщение, так как не владеет секретным ключом абонента В. В качестве основных
преимуществ ассиметричных криптосистем можно выделить следующие:
 Нет необходимости предварительно передавать секретный ключ по
надёжному каналу связи;
 Только единственному участнику передачи информации известен ключ
дешифрования, который нужно держать в секрете, в отличие от симметричной, где
такой ключ известен обеим сторонам;
В больших сетях число ключей в асимметричной криптосистеме
значительно меньше, чем в симметричной.
Помимо преимуществ, в асимметричных криптосистемах существует
некоторое количество недостатков:
 Сложность внесения каких-либо изменений в алгоритм;

11
 Более высокий размер длины ключа;
 Шифрование-расшифровывание с использованием пары ключей проходит
значительно медленнее, чем шифрование-расшифрование того же текста
симметричным алгоритмом;
 Требуются существенно большие вычислительные ресурсы. Поэтому в
реальном мире асимметричные криптосистемы часто используются в сочетании с
другими алгоритмами.
Наиболее известным и распространенным примером асимметричной
криптосистемы является алгоритм RSA.

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

Идея асимметричной криптосистемы с открытым и закрытым ключом


причисляется Уитфилду Диффи и Мартину Хеллману, которые впервые
опубликовали эту концепцию в 1976 году. Также они ввели в обращение такое
понятие, как цифровая подпись, а также попытались применить теорию чисел для
решения этих задач. В их формулировке использовался секретный ключ с общим
доступом, созданный путем экспоненциализации некоторого числа по модулю
простого числа. Однако проблема реализации односторонней функции осталась
открытой. Рон Ривест, Ади Шамир и Леонард Адлеман из Массачусетского
технологического института в течение года предприняли несколько попыток создать
одностороннюю функцию, которую было бы трудно инвертировать. Они
опробовали множество подходов, включая "ранцевый" и "перестановочные
полиномы. В апреле 1977 года они опубликовали свою статью. Алгоритм стал
известен как RSA – аббревиатура из инициалов их фамилий в том же порядке, что и
в их статье.
RSA – это криптографический алгоритм с открытым ключом. RSA стал
первым алгоритмом такого типа, пригодным и для шифрования, и для цифровой
подписи. Алгоритм используется в большом числе криптографических приложений.

12
Безопасность алгоритма электронной подписи RSA основана на трудности
задачи разложения на множители. Алгоритм использует два ключа – открытый
(public) и секретный (private), вместе открытый и соответствующий ему секретный
ключи образуют пару ключей (keypair). Открытый ключ не требуется сохранять в
тайне, он используется для зашифровывания данных. Если сообщение было
зашифровано открытым ключом, то расшифровать его можно.
Генерация ключей в RSA осуществляется следующим образом:
1) Выбираются два простых числа p и q;
2) Вычисляется модуль N p∗q ;
3) Вычисляется значение функции Эйлера от модуля N (1):

φ( N )=( p−1)( q−1) (1)

4) Выбирается число e, называемое открытой экспонентой, число e должно


лежать в интервале 1 <e<φ(N), а также быть взаимно простым со значением функции
φ(N) ;

5) Вычисляется число d, называемое секретной экспонентой, такое, что (2):

d * e=1(mod φ(N)) (2)

То есть является мультипликативно обратное к числу e по модулю  N.


В итоге получаем пару ключей:
 Пара e, N  – открытый ключ;
 Пара d, N  – закрытый ключ.
Криптосистема RSA используется в самых различных продуктах, на
различных платформах и во многих отраслях. В аппаратном исполнении RSA
алгоритм применяется в защищенных телефонах, на сетевых платах Ethernet, на
смарт-картах, широко используется в криптографическом оборудовании. Кроме
того, алгоритм входит в состав всех основных протоколов для защищенных
коммуникаций Internet, в том числе S/MIME, SSL и S/WAN
13
2 Описание математического аппарата исследуемой модели ЭЦП

2.1 Теоретическое сведения о реализации ЭЦП на основе сложности


факторизации ЭЦП модуля

Отказ от использования простого модуля и переход к использованию взамен


него составного модуля, который равен произведению двух больших простых чисел,
обеспечивающих достаточно высокую сложность задачи его факторизации,
позволяет довольно просто создать схемы ЭЦП с подписью вида (R, S), в которых
возможность подделки подписи на основе замены переменных устраняется
вследствие значительной трудности извлечения корней второй и более высоких
порядков по составному модулю.
При этом возникает дополнительный позитивный момент. Появляется
возможность использовать в качестве открытого ключа значение модуля. За счет
этого в проверочном сравнении убирается параметр у и становится достаточно
использования только одной из двух фиксируемых функций F2 или F2’.
Однако возникают новые обстоятельства, которые следует учитывать при
разработке схем ЭЦП и генерации открытого ключа. Поскольку значение а является
зависимым от модуля, то его следует приводить как второй элемент открытого
ключа. При этом можно сказать, что размер числа а примерно равен размеру модуля
n.
Таким образом, в схемах c RSA модулем имеется открытый ключ (n, a), длина
которого вдвое больше длины открытого ключа схем с простым модулем p. Более
существенным является то, что возникают особые требования к генерации числа а.
Они обусловлены тем, что наличие значения а для общего доступа создает
дополнительные предпосылки к нахождению новых способов факторизации модуля.
В частности, если показателем по модулю n является простое число, то может
оказаться возможным нахождения делителя n путем вычисления НОД (n, a-1)=1.
14
2.2 Алгоритм нахождения ключевых пар и генерации подписи в ЭЦП с
RSA модулем

Начало математического расчета начинается с выбора 2 случайных больших


простых чисел p и q.
С помощью них рассчитывается открытый ключ (n, α ), где n является
произведением p и q, а α – это число, которое относится по модулю n к показателю γ
, который называется секретным ключом.
Расчет секретного ключа производится по следующей формуле (3):

γ=γ ∗γ , (3)
' ''

где γ ' и γ есть простые числители γ |r−1| и γ |q−1| (причем у' не делит q - 1 и у" не
' ''

делит r - 1).

Далее используем общую генерацию ключа. Выбираем случайное число U, с


помощью которого будет рассчитано значение Z по следующей формуле (4):

Z=α mod n (4)


U

Исходя из полученных значений U и Z определяются значения k и g, которые


рассчитываются по формулам, заданным в варианте курсовой работы (5,6):

−z ± √ z + 4 HU
2
k= mod γ ; (5)
2H

z ± √ z 2+ 4 HU
g= mod γ , (6)
2

где H – хэш-функция от подписываемого документа.


15
Благодаря вычисленным значениям k и g будет найден элемент подписи S,
который в общем случае рассчитывается по формуле (7):

S=α g mod n (7)

После выполнения заданных операций нужно выполнить проверочное


сравнение, указанное в варианте заданий на курсовую работу. В данном случае оно
выглядит как (8):

=S mod n (8)
Hk +(S mod n)
α

При успешном вычислении всех предыдущих расчетов проверочное сравнение


должно выполняться корректно.

2.3 Разработка блок-схем программной реализации ЭЦП

Рассмотрим программную реализацию некоторых функций в виде блок-схем


(рисунок 2-5). Главной сложностью при выполнении программной части является
вынесения квадратного корня при составном модуле γ .
Для извлечения квадратного корня необходимо разложить значение γ на
простые множители. После этого необходимо подобрать квадратный корень для
каждого из них путем использования алгоритма Тонелли – Шенкса. Используя
получившиеся результаты, вычисляем нужное значение при помощи китайской
теоремы об остатках.

16
Рисунок 2 – Реализация вычисления квадратного корня по модулю

17
Рисунок 3 – Реализация вычисления квадратного корня по модулю
(продолжение)

18
Рисунок 4 – Реализация вычисления квадратного корня по модулю
(продолжение)
19
Рисунок 5 – Реализация китайской теоремы об остатках

В данном пункте произвели построение блок-схемы реализации вычисления


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

20
3 Программная реализация модели ЭЦП

3.1 Описание интерфейса программы

На рисунке 6 представлен интерфейс программы, которая производит расчет


электронно-цифровой подписи и выполняет проверочное сравнение для
подтверждения полученных результатов.

Рисунок 6 – Общий интерфейс программы

На рисунке 7 показаны окна для ввода 2 простых чисел p и q, с помощью


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

21
Рисунок 7 – Окна для ввода 2 простых чисел

На рисунке 8 показаны окна, в которых отображается результат расчета


секретного ключа γ и его составляющих.

Рисунок 8 – Окно для показа секретного ключа и его компонентов

На рисунке 9 показаны 3 окна и 1 кнопка “Рассчитать”. Верхнее из них


отвечает за демонстрацию полученной α . Остальные 2 служат для введения в
программу значений H и U соответственно. Кнопка “Рассчитать” необходима для

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

Рисунок 9 – Окна для α , H, U. Кнопка “Рассчитать

На рисунке 10 показаны окна, в которых показываются промежуточные


значения вычислений и результат проверочного сравнения.

Рисунок 10 – Окна промежуточных значений и результат проверочного сравнения

23
3.2 Тестирование работы программы

Для начала произведения расчетов Пользователю необходимо ввести 2


случайных простых числа. Если данные числа будут корректными, то программа
автоматически рассчитает и выведет в соответствующие окна закрытый ключ γ , его
составляющие, а также значение α (рисунок 10,11).

Рисунок 10 – Вывод секретного ключа и α при корректном вводе пример 1

Рисунок 11 – Вывод секретного ключа и α при корректном вводе пример 2

24
В том случае, если будет введено не простое число, то программа выдаст
предупреждение “p и q Должны быть простыми числами” (рисунок 12).

Рисунок 12 – Предупреждение при вводе не простых чисел

Далее Пользователю необходимо ввести значения H и U, подходящие по


условию данной работы (Число U должно быть меньше, чем n-1; число H может не
подходить под условия задачи из-за специфики расчета квадратного корня). Если
эти условию будут выполнены, то программа рассчитает все промежуточные
вычисления, выдаст их результаты, а также выполнит проверочное сравнение.
Примеры это показаны на рисунках 13,14.

Рисунок 13 – Выполнение расчета промежуточных вычислений и


проверочного сравнения пример 1
25
Рисунок 14 – Выполнение расчета промежуточных вычислений и проверочного
сравнения пример 2

Если значение U будет больше или равен числу n-1, то программа выдаст
предупреждение “U должно быть < n-1” (рисунок 15).

Рисунок 15 – Предупреждение при вводе некорректного значения U

26
Если значение H не будет подходить под условие выполнения примера, то
программа выдаст предупреждение “Допустимых значений не существует. Введите
другую H” (Рисунок 16).

Рисунок 16 – Предупреждение при вводе некорректного значения H

3.3 Генерация числовых примеров

Схема ЭЦП задана проверочным сравнением (9):

=S mod n (9)
k
Hk +(S mod n)
α

Процедура генерации секретного ключа:


1) Выберем 2 случайных простых числа p и q

p=12346013
q=75312451
2) Найдём простые делители для 𝑝 – 1 и 𝑞 – 1 (причем простой делитель 𝛾 ′ не
делит 𝑞 – 1, а простой делитель 𝛾 ′′ не делит 𝑝 – 1). Для этого найдём все делители
для 𝑞 – 1 и 𝑝 – 1.
p−1=12346012
q−1=75312450
27
Для 𝑝 – 1 простыми делителями являются такие числа:
2, 7, 17, 37, 701.

Для 𝑞 – 1 простыми делителями являются такие числа:


2, 3, 5, 55787
Примем γ ' и γ ' 'как:

γ ' =701;

γ =55787;
''

Данные числа подходят по требуемым условиям.


3) Вычислим секретный ключ γ :

γ=γ ∗γ =39106687 ;
' ''

4) Проведем процедуру генерации открытого ключа (n, α )


Найдем значения числа n:

n= p∗q=929808499107863;

Подберем значение числа α , используя формулу:


α γ =1 mod (n)

В результате чего получается, что:

α=422599362087229

Пусть Н= 78645319;

28
5) Процедура генерации подписи:
Выбираем случайное значение U <n−1.

U =12456789

Далее найдем значение Z:

U
Z=α mod n=824944538217924

Вычислим значения k и g, используя формулы, которые заданы по варианту


задания:

−z ± √ z 2 + 4 HU
k= mod γ =139753042
2H
z ± √ z + 4 HU
2
g= mod γ =19524263
2

6) Вычисляем значение S:

g
S=α mod n=756695807733757

7) Проводим проверочное сравнение подписи:

α Hk +(S mod n)=756695807733757


S mod n=756695807733757

Таким образом, был произведен расчет числового примера. Исходя из


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

29
При выполнении данной курсовой работы были изучен алгоритм RSA,
разобраны основные схемы реализации ЭЦП на основе RSA модуля.
В ходе выполнения работы была программно реализована схема электронно-
цифровой подписи на основе сложности факторизации RSA-модуля с
использованием языка программирования C# и программного обеспечения Microsoft
Visual Studio. Полученная программа успешно решает задачу по реализации
электронной цифровой подписи на основе сложности факторизации RSA-модуля,
которая была представлена в курсовой работе. Ее интерфейс является наглядным,
интуитивно понятным для обычного полозователя. Программа исключает
неправильные действия пользователя, помогая ему соответствующими указаниями.
Также был проведён ручной расчёт числового примера заданного алгоритма с
учетом индивидуального варианта задания.
Были построены блок-схемы алгоритма нахождения квадратного корня по
модулю и реализации китайской теоремы об остатках.
При формировании курсовой работы были использованы и изучены
источники информации по темам, которые были необходимыми для решения
поставленных задач.

Список использованных источников

30
1. Кормен Т., Лейзерсон Ч., Ривест Р. Алгоритмы: построение и анализ / Т.
Кормен, Ч. Лейзерсон, Р. Ривест - М.: МЦНМО, 1999. - 512 с.
2. Каргаполов М.И. Основы теории групп / М.И. Каргаполов, Ю.И. Мерзляков
- "Наука", 1972. - 445с.
3. Виноградов И.М. Основы теории чисел / И. М. Виноградов - М.: Гос. изд.
технико-теоретической литературы, 1992. -181 с.
4. Черемушкин А.В. Лекции по арифметическим алгоритмам в криптографии /
А.В. Черемушкин-- М.: МЦНМО, 2003. - 672 с
5. Гашков С.Б. Криптогафические методы защиты информации / С.Б Гашков,
З.А. Применко, М.А. Черепнев. - М.: Академия, 2010г.-304с.
6. Электронная цифровая подпись, алгоритм RSA [Электронный ресурс]:
Режим доступа: http://kavayii.blogspot.com/2010/01/rsa.html (Дата обращения
28.11.2021)
7. Шнайер Б. Прикладная криптография. Протоколы, алгоритмы, исходные
тексты на языке Си/ Б. Шнайер - М.: Триумф, 2002. - 816 с.
8. Пензин Ю.Г., Клейменов В.Ф. Сравнения. Учебно-методические разработки
(тексты лекций). Изд-во ИГУ, 1998.
9. Венбо Мао. Современная криптография. Теория и практика / Венбо Мао. -
М.: Вильямс, 2005. - 768 с.
10. Ростовцев А.Г. Теоретическая криптография / А.Г. Ростовцев, Е.Б.
Маховенко - НПО «Профессионал», Санкт-Петербург, 2004. - 479 с.
11. Молдовян Н.А. Практикум по криптосистемам с открытым ключом. –
СПб.: БХВ-Петербург, 2007. - 304 с.
12. .Фергюсон Н. Практическая криптография / Н. Фергюсон, Б. Шнайер. - М.:
Диалектика, 2004. - 432 с.

Приложение А

31
Код программы на языке программирования C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Numerics;

namespace Var_4
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

BigInteger y1, y2, y, a, h, z, k, g, n, s, p, q, u;


BigInteger L, R;

private void label1_Click(object sender, EventArgs e)


{

private void button1_Click(object sender, EventArgs e)


{
if (textBox1.Text != ""&& textBox2.Text !="")
{
q = BigInteger.Parse(textBox1.Text);
p = BigInteger.Parse(textBox2.Text);
n = p * q;
Ras4etY(q, p);
if (IsPrime(q) && IsPrime(p))
{
y = y1 * y2;
a = Eiler(n);
}
else
{
MessageBox.Show("p и q Должны быть простыми числами");
textBox1.Text = "";
textBox2.Text = "";
textBoxY.Text = "";
}

}
else MessageBox.Show("Введите p и q");
}

private void label3_Click(object sender, EventArgs e)


{

}
32
private void res_KeyPress(object sender, KeyPressEventArgs e)
{
char number = e.KeyChar;
if (!Char.IsDigit(number))
{
e.Handled = true;
}
}

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)


{
char number = e.KeyChar;
if (!Char.IsDigit(number))
{
e.Handled = true;
}
}

private void textBox2_KeyPress(object sender, KeyPressEventArgs e)


{
char number = e.KeyChar;
if (!Char.IsDigit(number))
{
e.Handled = true;
}
}

private void textBoxH_TextChanged(object sender, EventArgs e)


{

private void textBoxH_KeyPress(object sender, KeyPressEventArgs e)


{
char number = e.KeyChar;
if (!Char.IsDigit(number))
{
e.Handled = true;
}
}

private void textBoxU_KeyPress(object sender, KeyPressEventArgs e)


{
char number = e.KeyChar;
if (!Char.IsDigit(number))
{
e.Handled = true;
}
}

private void button2_Click(object sender, EventArgs e)


{
h = BigInteger.Parse(textBoxH.Text);
u = BigInteger.Parse(textBoxU.Text);
if (u < n - 1 && (pow(a, y) - 1) % n == 0)
{
z = pow_mod(a, u, n);
BigInteger sum12, sum22, proz, sum11, sum21;
proz = Drob(2 * h, y)%y;
33
sum12 = ((-z) % y + y) % y;
sum22 = Ostat((z * z + 4 * h * u))%y;
k =((sum12+sum22)%y*proz)%y;
proz = Drob(2 , y) % y;
sum11 = (z) % y;
sum21 = Ostat((z * z + 4 * h * u)) % y;
g = ((sum11 + sum21) % y * proz) % y;
if(sum11==0||sum21==0|| sum12 == 0 || sum22 == 0)
{
MessageBox.Show("Допустимых значений не существует. Введите другую H");
textBoxH.Text = "";
}
else
{
s = pow_mod(a,g, n);
textBox3.Text = "z = " + z.ToString() + " k = " + k.ToString() + " " + "g = " + g.ToString() + " S = " +
s.ToString();
BigInteger prom = h * k + (mul_mod(s, k, n));
R = (s % n);
L= mul_mod(a, prom, n);
res.Text = ( "Правая часть = " +R.ToString());
res.Text += Environment.NewLine + "Левая часть =" + L.ToString();
}
}
else MessageBox.Show("U должно быть < n - 1");
}

// Китайская теорема об остатках


public BigInteger Ostat(BigInteger pod)
{
BigInteger o1, o2;
BigInteger mod1 = y1;
BigInteger mod2 = y2;
BigInteger mod = y;
BigInteger[] massres = Ts(pod, mod1);
BigInteger[] massres1 = Ts(pod, mod2);
if (massres[1] == 1 && massres1[1] == 1)
{
o1 = massres[0];
o2 = massres1[0];
return (mod2 * Kor(mod1, mod) * o1 + mod1 * Kor(mod2, mod) * o2) % mod;
}
else
{
return 0;
}

}
// Для теоремы об остатках поступает простой множитель мода, а второе число это сам мод без
вносимого второго модуля
public BigInteger Kor(BigInteger mod1, BigInteger mod)
{
mod = mod / mod1;
int i = 0;
while (true)
{
if ((mod * i) % mod1 == 1)
{
return i;
}
34
else i++;
}
}
//уже сотая по счету функция считающая корни
static BigInteger[] Ts(BigInteger n, BigInteger p)
{
BigInteger[] mass = new BigInteger[2];
if (BigInteger.ModPow(n, (p - 1) / 2, p) != 1)
{
mass[0] = 0;
mass[1] = 0;
return mass;
}

BigInteger q = p - 1;
BigInteger ss = 0;
while ((q & 1) == 0)
{
ss = ss + 1;
q = q >> 1;
}

if (ss == 1)
{
BigInteger r1 = BigInteger.ModPow(n, (p + 1) / 4, p);
mass[0] = r1;
mass[1] = 1;
return mass;
}

BigInteger z = 2;
while (BigInteger.ModPow(z, (p - 1) / 2, p) != p - 1)
{
z = z + 1;
}
BigInteger c = BigInteger.ModPow(z, q, p);
BigInteger r = BigInteger.ModPow(n, (q + 1) / 2, p);
BigInteger t = BigInteger.ModPow(n, q, p);
BigInteger m = ss;

while (true)
{
if (t == 1)
{
mass[0] = r;
mass[1] = 1;
return mass;
}
BigInteger i = 0;
BigInteger zz = t;
while (zz != 1 && i < (m - 1))
{
zz = zz * zz % p;
i = i + 1;
}
BigInteger b = c;
BigInteger e = m - i - 1;
while (e > 0)
{
b = b * b % p;
35
e = e - 1;
}
r = r * b % p;
c = b * b % p;
t = t * c % p;
m = i;
}
}

/// <summary>
/// Деление по модулю
/// </summary>
private BigInteger Drob(BigInteger b1, BigInteger mod)
{
BigInteger y1, y2, y3, ost, cast;
y3 = 0;
y1 = 0;
y2 = 1;
BigInteger delim = mod;
BigInteger del = b1;

while (true)
{
ost = delim % del;
cast = (BigInteger)(delim / del);
if (ost != 0)
{
y3 = y1 - 1 * y2 * cast;
y1 = y2;
y2 = y3;

delim = del;
del = ost;
}
else
{

break;
}
}
if (y3 < 0)
{
y3 = ((y3 % mod + mod) % mod);
}
return y3;
}
/// <summary>
/// Расчет а с помощью функции Эйлера
/// </summary>
private BigInteger Eiler(BigInteger number)
{
BigInteger res = number, en = SqrtBig(number) + 1;
for (int i = 2; i <= en; i++)
if ((number % i) == 0)
{
while ((number % i) == 0)
number /= i;
res -= (res / i);
}
if (number > 1) res -= (res / number);
36
BigInteger t = ((p - 1) * (q - 1)) / y;
a = pow(res, t) % n;
textBoxa.Text = a.ToString();
return a;
}
/// <summary>
/// Расчет квадратоного корня для больших счисел
/// </summary>
/// <param name="s">Большое число.</param>
private BigInteger SqrtBig(BigInteger s)
{
if (s < 0)
throw new ArgumentException("Square root not defined for Decimal data type when less than zero!", "s");

// Prevent divide-by-zero errors below. Dividing either


// of the numbers below will yield a recurring 0 value
// for halfS eventually converging on zero.
if (s == 0) return 0;
BigInteger x;
BigInteger lastX = -1;
BigInteger nextX;

// Begin with an estimate for the square root.


// Use hardware to get us there quickly.
x = s;

while (true)
{
nextX = (x + s / x) / 2;
// The next check effectively sees if we've ran out of
// precision for our data type.
if (nextX == x || nextX == lastX) break;

lastX = x;
x = nextX;
}

return nextX;
}

/// <summary>
/// Возведение в степень для больших чисел
/// </summary>
/// <param name="a1">Основание.</param>
/// <param name="b">Степень.</param>
private BigInteger pow(BigInteger a1, BigInteger b)
{
BigInteger comp = a1;
if (b == 0)
{
return 1;
}
else
{
for (int i = 1; i < b; i++)
{
comp *= a1;
}
return comp;
}
37
}

/// <summary>
/// Определение секрутных ключей у1 и у2
/// </summary>
/// <param name="num1">Параметр q.</param>
/// <param name="num2">Параметр р.</param>
void Ras4etY(BigInteger num1, BigInteger num2)
{
string[] m1 = Deliteli(num1 - 1).Split(' ');
string[] m2 = Deliteli(num2 - 1).Split(' ');
for (int i = m1.Length - 2; i > 0; i--)
{
for (int j = m2.Length - 2; j >= 0; j--)
{
if (Int32.Parse(m1[i]) % (num2 - 1) > 0 && Int32.Parse(m2[j]) % (num1 - 1) > 0)
{
y1 = BigInteger.Parse(m1[i]);
y2 = BigInteger.Parse(m2[j]);
textBoxY.Text = "y1= " + m1[i] + " y2= " + m2[j] + " y= " + (y1 * y2).ToString();
return;
}
}
}
}

/// <summary>
/// Определение всех делителей числа
/// </summary>
/// <param name="num1">Число.</param>
private string Deliteli(BigInteger num1)
{
string result = "";
for (int i = 1; i <= num1 / 2; i++)
{
if (num1 % i == 0)
{
if (IsPrime(i) == true)
{
result += i.ToString() + " ";
}
}
}
return result;
}

/// <summary>
/// Проверка числа на простоту
/// </summary>
/// <param name="number">Число.</param>
private bool IsPrime(BigInteger number)
{
for (int i = 2; i <= number / 2; i++)
{
if (number % i == 0)
{
return false;
}
}
return true;
38
}

public static BigInteger mul_mod(BigInteger x, BigInteger y, BigInteger m)


{
if (x > y)
{
BigInteger tmp = x;
x = y;
y = tmp;
}
BigInteger res = 0;
BigInteger iy = y;
while (x != 0)
{
if ((x & 1) != 0)
{
res = (res + iy) % m;
}
iy = (iy + iy) % m;
x >>= 1;
}

return res;
}
// Возведение в степень по модулю
// Х возводимое число, у степень, м модуль
public static BigInteger pow_mod(BigInteger x, BigInteger n, BigInteger m)
{
BigInteger res = 1;
while (n != 0)
{
if ((n & 1) != 0)
{
res = mul_mod(res, x, m);
}
x = mul_mod(x, x, m);
n >>= 1;
}
return res;
}
}
}

39

Вам также может понравиться