МИНОБРНАУКИ РОССИИ Федеральное государственное бюджетное образовательное учреждение высшего образования НИЖЕГОРОДСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ им. Р.Е.АЛЕКСЕЕВА Институт радиоэлектроники и информационных технологий Кафедра "Вычислительные системы и технологии" Дисциплина "Программирование" Отчет по курсовой работе Тема: "Разработка программного обеспечения шифрующего и дешифрующего исходные данные методом Вижинера" Выполнил: студент группы 19-ВМ-в Майоров Андрей Александрович Проверил: преподаватель кафедры ВСТ Мартынов Дмитрий Сергеевич Нижний Новгород 2021 Оглавление 1. ВВЕДЕНИЕ.............................................................................................................................................. 4 1.1 Цели и задачи работы. ...................................................................................................................... 4 1.2 Состояние вопроса. ........................................................................................................................... 4 1.3 Обзор литературы. ............................................................................................................................ 5 1.4 Анализ работы существующих функционально близких аналогов. ............................................ 6 2. РАЗРАБОТКА ТЕХНИЧЕСКОГО ЗАДАНИЯ..................................................................................... 9 3. АНАЛИЗ ТЕХНИЧЕСКОГО ЗАДАНИЯ И РАЗРАБОТКА КОНЦЕПТУАЛЬНОЙ ИДЕИ ..........10 3.1. Выбор метода решения задачи......................................................................................................10 3.2. Формализация входного и выходного потоков данных. ............................................................11 3.3. Определение «вариантов использования» программы. ..............................................................11 3.4. Построение концептуальной модели системы ............................................................................11 4. РАЗРАБОТКА ЛОГИЧЕСКОЙ МОДЕЛИ .........................................................................................12 4.1 Описание входного и выходного потоков данных.......................................................................12 .....................................................................................................................................................................13 4.2 Математические методы обработки данных ................................................................................14 4.3 Выбор (разработка) алгоритма.......................................................................................................14 4.4 Разработка методов обеспечения целостности данных ...............................................................14 5. РАЗРАБОТКА АЛГОРИТМОВ И МЕТОДОВ ОБРАБОТКИ ДАННЫХ .......................................15 6. РАЗРАБОТКА СХЕМЫ ПРОГРАММЫ ............................................................................................16 6.1 Иерархия «пользователей» программы и их классификация (описание роли) с перечнем прав доступа к программным данным. ........................................................................................................16 6.3 Проектирование интерфейса пользователя программы ..............................................................17 6.4 Проектирование классов, структур и пользовательских типов данных ....................................19 7. ОПИСАНИЕ ПРОЦЕССА СОЗДАНИЯ ПРОГРАМЫ ......................................................................21 7.1. Системные требования. Описание используемой для создания программы программноаппаратной платформы. ........................................................................................................................21 7.2. Обоснование выбора средств разработки (функциональные возможности). ...........................21 7.3 Вид и свойства программного проекта .........................................................................................22 7.4. Описание процесса компиляции. ..................................................................................................22 7.5. Описание процесса отладки (проблемы, возникшие при решении задачи, связанные, например, с неверным выбором типов данных, либо механизмом приведения типа результата выражения). ...........................................................................................................................................23 7.6. Описание процесса профилировки программы...........................................................................24 7.7. Алгоритмическая оптимизация, повышение производительности программы. ......................24 7.8. Проверка достоверности полученных результатов.....................................................................24 2 7.9. Описание выявленных но, по ряду причин, не исправленных программных дефектов ("фичи" и "баги"). ..................................................................................................................................24 8. РАЗРАБОТКА СИСТЕМЫ ПОМОЩИ (ВСТРОЕННАЯ СПРАВКА О ПРОГРАММЕ). .............25 9. ЗАКЛЮЧЕНИЕ .....................................................................................................................................26 10. ПРИЛОЖЕНИЕ 1. ИСХОДНЫЙ ТЕКСТ ПРОГРАММЫ (ЛИСТИНГ) ........................................27 10. 2. ПРИЛОЖЕНИЕ 2. ИНФОРМАЦИОННЫЕ ИСТОЧНИКИ........................................................36 3 1. ВВЕДЕНИЕ 1.1 Цели и задачи работы. Разработать приложение, которое бы зашифровывало текст, введённый с клавиатуры методом Виженера, и выводило бы результат работы в консоль. Также оно должно предусматривать дешифрование полученного на предыдущем этапе работы программы текста и простейший вариант графического интерфейса. 1.2 Состояние вопроса. Шифрование зародилось с тех самых пор, когда человечество задумалось о том, каким образом можно было бы сохранить в тайне некоторые данные, распространение которых в широком кругу лиц было бы не желательно. Судя по названию одного из шифров «шифр Цезаря», он использовался известным в истории правителем, который, возможно и не сам его изобрел, и это было очень давно. Криптографией называется процесс сокрытия изначального смысла сообщения посредством определенных следующих друг за другом действий (алгоритм) и использования специальной заданной заранее или сгенерированной автоматически последовательности символов (ключа). Так называемый ключ, используется в обоих процессах работы с данными, как при шифровании, так и при дешифровании. Знание ключа гарантирует то, что сообщение будет правильно расценено осведомленной принимающей стороной. Однако, не знание ключа не гарантирует, что посторонний человек не получит доступ к сокрытой информации. Процесс, при котором человек, не знающий ключа к зашифрованной информации, пытается получить ее содержание до сокрытия, называется криптоанализом. Время, затрачиваемое на «взлом» шифра зависит от характеристики под названием криптостойкость. Чем больше времени затрачено, тем использованный шифр «сильнее». Наилучший результат представлен ситуацией, когда трудно представить, возможен ли вообще результативный взлом. 4 В настоящее время наиболее распространенными методами шифрования являются: Алгоритмы замены и подстановки – символы исходного текста заменяются символами другого или того же самого алфавита по заранее определенной схеме, которая и будет считаться ключом. Отдельно в современной криптографии почти не используется, из-за низкой криптостойкости (шифр Цезаря). Алгоритмы перестановки – символы текста меняются по заранее определённой схеме, что и будет являться ключом. Также как и выше описанный вариант почти не используется отдельно из-за низкой криптостойкости (решётка Кардано). Алгоритмы гаммирования – символы изначального текста складываются с символами случайно сгенерированной последовательности символов. Использовалось в архитектуре операционной системы «Windows 95» для шифрования ключей сетевых подключений (доступа в Интернет, вход в NT - серверы). Проста подбора ключа, характеризовалась тем, что операционная система использовала одну и ту символьную последовательность для шифрования одинаковых типов данных. Алгоритмы, в основе которых лежит некоторая сложная математическая формула (например, одна из тех, что еще не были алгебраически доказаны), что изменяет исходный текст по собственным правилам. Примером такого метода является алгоритм RSA, который повсеместно используется для шифрования данных в Интернете. Он основан на свойствах простых чисел. Комбинированные алгоритмы – метод, использующий два или более способов шифрования одновременно. 1.3 Обзор литературы. Данная курсовая работа была написана с использованием тематических Интернет ресурсов учебно-методической и научной литературы. Научная литература по программированию на языке С++: 5 Роберт Лафоре, «Объектно-ориентированное программирование в C++», - 4-е изд. Издательский дом "Питер", 2004 – 924 стр. Столяров Андрей Викторович, «Программирование: введение в профессию. Том 1 «Азы программирования»», - 2-е изд. Издательский дом «Макс-пресс», Москва, 2021 – 707 стр. Столяров Андрей Викторович, «Программирование: введение в профессию. Том 2 «Системы и сети»», - 2-е изд. Издательский дом «Макс-пресс», Москва, 2021 – 707 стр. Столяров Андрей Викторович, «Программирование: введение в профессию. Том 3 «Парадигма»», - 2-е изд. Издательский дом «Макс-пресс», Москва, 2021 – 707 стр. Яцек Головиц «С++17 STL. Стандартная библиотека шаблонов» Издательский дом "Питер", 2018 – 432 стр. Сайты и статьи по алгоритмам и методам шифрования и дешифрования: https://wiki.hostpro.ua/knowledgebase/shifrovanie-tipy-i-algoritmy/ https://cyberleninka.ru/article/n/obzor-metodov-shifrovaniya/viewer https://siblec.ru/telekommunikatsii/teoreticheskie-osnovy-tsifrovojsvyazi/14-shifrovanie-i-deshifrovanie https://www.kaspersky.ru/blog/vigenere-cipher-history/8856/ https://obuchonok.ru/node/6793 1.4 Анализ работы существующих функционально близких аналогов. На данный момент современные системы шифрования делятся на две обширные категории: со скрытым ключом (симметричные) и с открытым ключом (ассиметричные). В том случае, если для получения исходного текста и для его сокрытия используется один и тот же ключ, то такая криптосистема называется симметричной. К симметричным криптосистемам относятся DES, AES, ГОСТ 28147-89 и т.д. 6 Относительно новым веянием в сфере защиты информации является появление ассиметричных криптосистем с открытым ключом таких, как RSA, DSA или Эль-Гамаль. Они используют, как правило, алгоритмы вычисления функции обратной заданной, что является одним из наиболее сложных видов задач. Исходные функции обладают одной особенностью они однонаправленные. Это означает, что в подавляющем большинстве случаев найти обратную функцию не представляется возможным. Суть метода ассиметричного шифрования заключается в том, что принимающий абонент использует свою часть ключа – открытую, для того, чтобы вычислить функцию от зашифрованного сообщения, а при расшифровке применяется секретный ключ, который вычисляет обратную функцию. Однако задач, которые бы полностью бы соответствовали всем перечисленным требованиям, существует немного, и еще меньше было использовано для построения ныне применяемых шифров. Рассмотрим, наиболее известные криптосистемы, использующие открытый ключ: RSA . Используется задача факторизации (вычисления простых сомножителей) большого целого числа. Он построен на основе перемножения двух простых чисел большой разрядности. Широко применяется в криптографических протоколах закрытия информации и аутентификации. Эль-Гамаль (El-Gamal). Он основан на задаче дискретного логарифмирования в конечном поле. Используется в стандартах электронной цифровой подписи (ЭЦП) DSS, ГОСТ Р34.10-94 и т.д. Эллиптические кривые (elliptic curve). Он основан на задаче дискретного логарифмирования на эллиптических кривых в конечном поле. Криптосистемы с открытым ключом используются в основном в трех направлениях: 7 закрытие информации; аутентификация с использованием ЭЦП; защищенное от перехвата распределение открытых ключей (криптосистема Диффи – Хеллмана (Diffie – Hellman)). Метод RSA в настоящее время является стандартом де-факто в системах информационной безопасности и рекомендован CCITT (Consultative Committee in International Telegraphy and Telephony – Международным консультативным комитетом в области телеграфии и телефонии, МККТТ) в стандарте X.509. RSA используется во многих международных стандартах (S-HTTP, PEM, S-MIME, S/WAN, STT, SSL, PCT, SWIFT, ANSI X.9.31 и т.д.), в системах обслуживания кредитных карточек, в операционных системах для защиты сетевых протоколов. Для методов RSA и Эль-Гамаля проведено огромное количество научных исследований, изучено большое количество методов их криптоанализа, защиты от атак, детально рассчитана криптостойкость в зависимости от длины ключа и других параметров. Оба метода обладают одинаковой криптостойкостью (при одинаковой длине ключа) и примерно одинаковой скоростью работы. Учитывая, что метод эллиптических уравнений (elliptic curve) проходит стадию апробации и не был подвергнут до настоящего времени такому большому количеству попыток взлома, как методы RSA и Эль-Гамаля, использование в системах шифрования двух последних выглядит предпочтительнее. Средства криптографической защиты обеспечивают подлинность и аутентичность информации, кроме решения проблемы сохранения ее конфиденциальности. Данные функции выполняет технология цифровой подписи. 8 2. РАЗРАБОТКА ТЕХНИЧЕСКОГО ЗАДАНИЯ Настоящее техническое задание распространяется на разработку программного обеспечения, которое шифрует и дешифрует исходные данные методом Вижинера. Система разрабатывается в качестве курсовой работы по курсу учебного плана кафедры «Вычислительные системы и технологии». Назначение разработки: разрабатываемое программное обеспечение может быть использовано в качестве защиты информации от посягательства на нее лиц, доступ которых к ней не желателен. Требование к разработке: система должна за минимальное время выдавать результат работы. Должны быть разработаны 2 класса: cystr и key. Первый, в котором содержаться ссылки на строку с исходными данными и строку с зашифрованными. Второй, который содержит в себе описание класса ключ и его взаимодействие с функциями шифрования и дешифрования, а также размерность ключа и ссылку на него. Также в приложении должен быть реализован простейший графический интерфейс из трех пунктов: шифрование, дешифрование и выход. Требование к аппаратному обеспечению: приложение должно исправно работать на системах семейства «Windows», включая как 64-х разрядные, так и 32-х разрядные версии. Требования к программному обеспечению: система должна работать по программе, написанной на языке C++. Требования к надежности: приложение должно проверять правильность вводимой информации пользователем и сообщать ему об ошибке в случае ее некорректности. 9 3. АНАЛИЗ ТЕХНИЧЕСКОГО ЗАДАНИЯ И РАЗРАБОТКА КОНЦЕПТУАЛЬНОЙ ИДЕИ 3.1. Выбор метода решения задачи Есть наиболее простой вариант решения задачи: шифр Вижинера. Этот шифр является модернизированной версией шифра Цезаря, который использует метод замены и подстановки. Шифр Вижинера по сути своей представляет многократные использования шифра Цезаря на исходном тексте с наличием (ROT 1) или отсутствием (ROT 0) сдвига. В основе шифра лежит ключ, который формируется на основе заранее определенного алфавита, который оказывает влияние как на процесс шифрования, так дешифрования. Простейший графический интерфейс можно реализовать с помощью использования языковой конструкции switch – case. Для того чтобы преступить к написанию процессов шифрования и дешифрования в первую очередь нужно сформировать алфавит, который станет основой этих двух функций. Алфави́т (др.-греч. ἀλφάβητος), — фор- ма письменности, основанная на стандартном наборе знаков. В алфавите отдельные знаки — буквы — обозначают фонемы языка, хотя однозначное соответствие звук ↔ буква наблюдается редко и имеет обыкновение утрачиваться в процессе развития устного языка. В качестве алфавита будет использована привычная для нас кириллица, как заглавные, так и прописные буквы. Рис.1. Будущий алфавит приложения 10 3.2. Формализация входного и выходного потоков данных. Входным потоком данных будет являться исходный текст, вводимый с клавиатуры в консоль (функция шифрования). А также ключевое слово и дешифруемое сообщение (функция шифрования). Выходным потоком данных будет являться зашифрованный тест исходного сообщения и дешифрованное сообщение (функция дешифрования). 3.3. Определение «вариантов использования» программы. Диаграмма использования приложения представлена на рис.2: 3.4. Построение концептуальной модели системы Концептуальная модель системы представлена на рисунке 3: 11 4. РАЗРАБОТКА ЛОГИЧЕСКОЙ МОДЕЛИ 4.1 Описание входного и выходного потоков данных. Входные и выходные потоки данных представлены на рисунке 4: Начало Сообщение Выбор действия Выбор действия (1) Выбор действия (3) Выбор действия (2) Ввод зашифрованного текста Ввод исходного текста Конец Ввод ключа Проверка ключа Ввод ключа Выброс исключения 12 Проверка ключа Преобразование типа данных Преобразование типа данных Сложение двух строк Сложение двух строк Преобразование типа данных Преобразование типа данных Вывод зашифрованного сообщения Вывод дешифрованного сообщения Выбор действия Выбор действия 13 4.2 Математические методы обработки данных В качестве математических методов обработки данных будут использованы преобразование типов данных и простые математические операции, например, сложение и вычитание. Простые математические операции будут использоваться для того, чтобы определить новый символ, который заменит символ исходного алфавита. Также с помощью них будет реализован механизм смещения, который несколько усложнит взлом данного шифра. 4.3 Выбор (разработка) алгоритма Алгоритм и программа будут объектно-ориентированы. Это позволит упростить логику работы, модификацию и изменение интерфейса. 4.4 Разработка методов обеспечения целостности данных Для корректной работы приложения была реализована система исключений, которая преждевременно завершит работу программы в случае некорректного ввода данных. Она реализована с помощью условного оператора if, который проверяет тип вводимых данных. Если он не соответствует буквам, то программа завершается с ошибкой. 14 5. РАЗРАБОТКА АЛГОРИТМОВ И МЕТОДОВ ОБРАБОТКИ ДАННЫХ Алгоритм action 1 () Начало cout<<inkey1<<endl cin.getline(buf,256) p = decode(sc1.s_c, sc1.dem) cin.getline(buf,256) OemToChar(buf,buf) CharToOem(p,p) OemToChar(buf,buf) s = buf cout<<p<<endl; s = buf; cystr sc1(encode(s),s.size(),'e') system("pause") key o(s.size(),encode(s)) o.encipher(&sc1) clrscr(); cout<<instr<<endl cout<<encyp_suc<<endl Конец cin.getline(buf,256) p = decode(sc1.s_c, sc1.dem) 15 Псевдокод action 1 (): BEGIN DISPLAY «Введите ключ шифрования» INPUT Buf FUNCTION (Buf, Buf) преобразовать текст в русский s = Buf FUNCTION key (FUNCTION(s.size()),FUNCTION(encode(s))) DISPLAY «Введите строку шифрования» INPUT Buf FUNCTION (Buf, Buf) преобразовать текст в русский s = Buf FUNCTION cystr sc1(encode(s),s.size(),'e') DISPLAY «Строка зашифрована» P = FUNCTION decode(sc1.s_c, sc1.dem) FUNCTION (P, P) преобразовать текст в русский END 6. РАЗРАБОТКА СХЕМЫ ПРОГРАММЫ 6.1 Иерархия «пользователей» программы и их классификация (описание роли) с перечнем прав доступа к программным данным. В данном приложении существует только одна роль – «пользователь». Вся информация, доступ к которой для пользователя является нежелательной, сокрыта в приватной части кода классов и не может быть им изменена. А созданная система обнаружения ошибок и корректности ввода, также позволит, как и оградить его от ненужных действий, так и помочь в использовании данного программного продукта. 6.2 Сценарий работы программы (событийная модель приложения) При запуске приложения пользователя встречает сообщение- приветствие, которое предлагает ему выбрать один пункт из трех в списке. 16 Затем в зависимости от выбора происходит одно из трех действий: шифрование, дешифрование и выход. До тех пор, пока не будет выбран пункт выход, приложение после выполнения действий, будет возвращать его к «первоначальному окну». И только при выборе третьего пункта программа завершится. Также она завершиться в том случае, если пользователь введет некорректные данные и выброшено исключение, которое закроет процесс с ошибкой. 6.3 Проектирование интерфейса пользователя программы Для удобства работы с приложением и более легко в нем ориентирования необходимо создать хотя бы простейший вариант графического интерфейса. Пользовательский интерфейс приложения реализован довольно просто и прописан в главной функции main, с помощью конструкции switch – case. Для его реализации потребуется: Некая переменная типа int, которая будет вводиться пользователем с клавиатуры, и сравниваться с некоторым установленным заранее значением блока case, что в результате вызовет одну из возможных команд. Блок-схема пользовательского интерфейса: Начало CharToOem (welcome,welcome) CharToOem(qes,qes) 17 Cin >> q 2 While q != ‘3’ Switch (q) Switch (1) Switch (3) Switch (2) Action 1() return 1 Action 2() break break Конец 2 2 Псевдокод пользовательского интерфейса: 18 DISPLAY: «Здравствуйте». «Выберите действие». 1 – Шифрование 2 – Дешифрование 3 – Выход INPUT: Действие CASE: Действие Шифрование: Действие 1 (). Дешифрование: Действие 2 (). Выход: return 1. ENDCASE 6.4 Проектирование классов, структур и пользовательских типов данных Класс cystr этот класс строки для шифрования содержит размерность, указатель на шифрованную строку, указатель на строку с открытым текстом. Информация, которая здесь содержится, представлена в числовом виде и на последующих этапах преобразуется в символы в соответствии с кодом. Он содержит в себе следующие элементы: cystr () – конструктор по умолчанию. cystr (int *, int, char) – конструктор с параметрами. Содержит в себе ссылку на массив с численным представлением исходного текста и зашифрованного текста. ~cystr() – деструктор объекта Класс key это основной класс всего приложения – «сердце программы». В нем определяются процессы шифрования и дешифрования сообщений с помощью ключа. Он содержит в себе следующие элементы: key::key(){} – конструктор по умолчанию. key::key(int n, int *p) – конструктор с параметрами. Содержит в себе информацию о длине ключа и ссылку на массив с численным представлением ключа. 19 key::~key() – деструктор объекта key. Обнуляет, данные о длине ключа и очищает массив с его численным представлением. void key::encipher (cystr *tocy) – описание метода шифрования данных. Обращается за ссылкой на объект класса cystr, который содержит в себе данные об исходном тексте, введенным пользователем с клавиатуры. В ходе процесса и символы ключа, и символы исходного текста принимают свое числовое представление и складываются, а массив, прежде содержавший изначальные данные постепенно очищается. void key::decipher(cystr *tode) – описание метода дешифрования данных. Обращается за ссылкой на объект класса cystr, который содержит в себе данные об исходном тексте, введенным пользователем с клавиатуры. В ходе процесса и символы ключа, и символы исходного текста принимают свое числовое представление и складываются, а массив, прежде содержавший изначальные данные постепенно очищается. 20 7. ОПИСАНИЕ ПРОЦЕССА СОЗДАНИЯ ПРОГРАМЫ 7.1. Системные требования. Описание используемой для создания программы программно-аппаратной платформы. Системные требования: Установленная на ПК среда разработки Dev-C++, поддерживающая язык программирования С++ или эквивалентная ей (Visual Studio, Eclipse STD, Sublime Text и тому подобные). ПК со следующими характеристиками: операционная система семейства Windows (Windows XP, Windows 2003, Windows Vista, Windows 2008, Windows 7, Windows 8). 7.2. Обоснование выбора средств разработки (функциональные возможности). Собственно выбор среды разработки для приложения, которое бы шифровало и дешифровало информацию, вводимую с клавиатуры, методом Виженера основывался на том, насколько обширный инструментарий понадобился бы для решения данной задачи. Исходя из этого выбор пал на две конкретных среды разработки: Dev-C++ и Microsoft Visual Studio. Первое обладает не перегруженным интерфейсом на русском языке, не требовательно к ресурсам ПК и что самое главное имеет совместимость с большинством систем из семейства Windows. Второе обладает огромным количеством встроенных библиотек и плагинов для решения большинства возникающих проблем, включая инструменты для создания графического интерфейса, удобной цветовой разметкой, а также средствами для замера используемых создаваемым приложением ресурсов компьютера. Для того чтобы выбрать одну из двух сред разработки нужно определиться с тем, что конкретно будет реализовано в приложении. Графический интерфейс: в рамках курсовой работы требуется реализовать простейший вариант графического интерфейса. По задумке приложение будет целиком и полностью реализовано с использованием консоли, поэтому инструменты для его создания будут не нужны. 21 Алгоритм шифрования: метод Виженера принадлежит к симметричным криптосистемам, которое используют и для шифрования, и для дешифрования один и тот же ключ. Он весьма прост в реализации и не требует специфического инструментария для своей реализации. Требования к аппаратному обеспечению: отсутствие тяжеловесного графического интерфейса и простота реализации алгоритма шифрования напрямую влияют на требования к аппаратному обеспечению ПК и на потребление созданной программой ресурсов. В данном случае нагрузка на компьютер незначительна и будет намного ниже, чем будет потреблять ресурсов среда разработки Microsoft Visual Studio. Исходя из аргументов приведенных выше, работа в среде разработки Microsoft Visual Studio усложнит создание приложения, а не облегчит его за счет избыточного потребления ресурсов и наличия огромного количества не нужных в данном проекте инструментов. Поэтом в качестве среды разработки была использована Dev-C++. 7.3 Вид и свойства программного проекта Программный проект состоит из одного файла, который содержит в себе и описание классов, и главную функцию. Этот файл имеет расширение cpp. Он не является программой, а лишь содержит инструкции в виде кода, которые необходимо скомпилировать, чтобы воспользоваться описанным в нем функционалом. Для компиляции необходима либо среда разработки, либо нужно воспользоваться консолью при условии, что она поддерживает чтение файлов данного типа. Просмотреть инструкции, содержащиеся в этом файле можно любым текстовым редактором, включая стандартный для любой операционной системы блокнот. Инструкции (код) написаны на языке программирования С++. 7.4. Описание процесса компиляции. Процесс компиляции может быть запущен с помощью, использованной при создании среды или консоли. Подключение дополнительных библиотек не требуется. 22 Чтобы проверить работоспособность программы нужно нажать на вкладку «Выполнить» и выбрать пункт «Скомпилировать и выполнить». Рис. В ходе компиляции будет создан .exe файл, который можно использовать для быстрой активации разработанного приложения. 7.5. Описание процесса отладки (проблемы, возникшие при решении задачи, связанные, например, с неверным выбором типов данных, либо механизмом приведения типа результата выражения). Процесс отладки приложения помогает производить журнал компиляции, который отражает все возникающие ошибки и предупреждения, когда включается сборка программного продукта. Рис. Для наиболее натуральной реализации простейшего графического интерфейса в процессе разработки возникала проблема перегрузки консоли визуальной информацией, поэтому было принято решение использовать функцию clrscr для очистки экрана. Так как метод Виженера построен на заранее определенном алфавите, а в случае данной работы он использует символы русского языка, которые консоль не распознает, было принято решение использовать функцию CharToOem, которая позволяет вводить по умолчанию информацию на рус- 23 ском языке. Для ее работы необходимо также получить библиотеку #include <windows.h>. 7.6. Описание процесса профилировки программы. В результате профилировки программы было выяснено, что процесс компиляции программы занимает не более 5 с., а ее вес составляет не более 2 мегабайт. 7.7. Алгоритмическая оптимизация, повышение производительности программы. Из результатов профилировка следует, что проводить оптимизацию не требуется. 7.8. Проверка достоверности полученных результатов. Все функции классов clrscr, action1, action2 выполняются исправно. 7.9. Описание выявленных но, по ряду причин, не исправленных программных дефектов ("фичи" и "баги"). В связи с решением добавить функцию очистки экрана во все методы и классы программы для реализации более приближенного к диалоговому окну графического интерфейса зашифрованное ранее предложение, а также ключевое слово не сохраняются на консоли. Из-за чего приходиться записывать их отдельно на листочке или использовать блокнот – стандартное приложение ПК. 24 8. РАЗРАБОТКА СИСТЕМЫ ПОМОЩИ (ВСТРОЕННАЯ СПРАВКА О ПРОГРАММЕ). Справка о помощи для данного приложения не нужна, так как графический интерфейс снабжен необходимыми подписями и сообщениями, которых достаточно для того, чтобы эффективно работать с ней. 25 9. ЗАКЛЮЧЕНИЕ В ходе выполнения курсовой работы были закреплены теоретические знания в области объектно-ориентированного программирования на языке С++. Также я повторил свои знания при создании программы шифрования и дешифрования текста. Применение объектно-ориентированного подхода к программированию и широкие возможности языка С++ в среде визуального программирования Dev-C++ является мощным и гибким средством при создании программ имитирующих поведение объектов реального мира. 26 10. ПРИЛОЖЕНИЕ 1. ИСХОДНЫЙ ТЕКСТ ПРОГРАММЫ (ЛИСТИНГ) #include <iostream> #include <conio.h> #include <windows.h> #include <string> #include <cstdlib> using namespace std; //********************************************************* ********************* void clrscr(){ system("CLS"); } class cystr { public: int dem; int *s_c; int *open; static string alph; cystr (); cystr (int *, int, char); ~cystr(); }; //********************************************************* ********************* 27 //********************************************************* ********************* string cystr::alph = "АБВГДЕЖЗИЙКЛМНОПРСТУФ- ХЦЧШЩЪЫЬЭЮЯ абвгдежзий\ клмнопрстуфхцчшщъыьэюя"; cystr::cystr(){} cystr::cystr(int *p, int n, char c) { dem = n; s_c = new int [n]; open = new int [n]; for(int i = 0; i < n; i++) if(c == 'e') open[i] = p[i]; else s_c[i] = p[i]; } cystr::~cystr() { dem = 0; delete [] open; delete [] s_c; } //********************************************************* ********************* //********************************************************* ********************* class key { 28 int dem; int *s_k; public: key(); key(int, int *); ~key(); void encipher (cystr *); void decipher (cystr *); }; //********************************************************* ********************* //********************************************************* ********************* key::key(){} key::key(int n, int *p) { dem = n; s_k = new int [n]; for(int i = 0; i < n; i++) s_k[i] = p[i]; } key::~key() { dem = 0; delete [] s_k; } void key::encipher (cystr *tocy) { int k = 0; for(int i = 0; i < tocy->dem; i++) 29 { if(dem <= k) k -= dem; tocy->s_c[i] = tocy->open[i] + s_k[k]; if(tocy->s_c[i] > 64) tocy->s_c[i] -= 65; tocy->open[i] = 0; k++; } } void key::decipher(cystr *tode) { int k = 0; for(int i = 0; i < tode->dem; i++) { if(dem <= k) k -= dem; tode->open[i] = tode->s_c[i] - s_k[k]; if(tode->open[i] < 0) tode->open[i] += 65; tode->s_c[i] = 0; k++; } } //********************************************************* ********************* //********************************************************* ********************* int * encode (string s) { 30 char err[] = "Ошибка кодирования. Неизвестный символ"; CharToOem(err,err); int *p; p = new int [s.size()]; for(int i = 0; i < s.size(); i++) { p[i] = cystr::alph.find(s[i], 0); if(p[i] == -1) { cout<<err<<endl; system("pause"); abort(); } } return p; } char * decode (int *p, int n) { char * s; s = new char [n+1]; for(int i = 0; i < n; i++) s[i] = cystr::alph[p[i]]; s[n] = '\0'; return s; } //********************************************************* ********************* //********************************************************* ********************* 31 void action1 () { char *p; char q; char buf [256]; string s; char instr[] = "Введите строку"; char inkey1[] = "Введите ключ шифрования"; char encyp_suc[] = "Строка зашифрована"; CharToOem(encyp_suc,encyp_suc); CharToOem(inkey1,inkey1); CharToOem(instr,instr); cout<<inkey1<<endl; cin.getline(buf,256); OemToChar(buf,buf); s = buf; key o(s.size(),encode(s)); cout<<instr<<endl; cin.getline(buf,256); OemToChar(buf,buf); s = buf; cystr sc1(encode(s),s.size(),'e'); o.encipher(&sc1); cout<<encyp_suc<<endl; p = decode(sc1.s_c, sc1.dem); CharToOem(p,p); cout<<p<<endl; system("pause"); clrscr(); 32 } //********************************************************* ********************* //********************************************************* ********************* void action2 () { char *p; char q; char buf [256]; string s; char decyp_suc[] = "Строка дешифрована"; char instr[] = "Введите строку"; char inkey2[] = "Введите ключ дешифрования"; CharToOem(inkey2,inkey2); CharToOem(instr,instr); CharToOem(decyp_suc,decyp_suc); cout<<inkey2<<endl; cin.getline(buf,256); OemToChar(buf,buf); s = buf; key o(s.size(),encode(s)); cout<<instr<<endl; cin.getline(buf,256); OemToChar(buf,buf); s = buf; cystr sc1(encode(s),s.size(),'d'); o.decipher(&sc1); cout<<decyp_suc<<endl; p = decode(sc1.open, sc1.dem); 33 CharToOem(p,p); cout<<p<<endl; system("pause"); clrscr(); } //********************************************************* ********************* //********************************************************* ********************* int main() { char q; char welcome[] = "Здраствуйте"; char qes[] = "Выбирите действие\n1 - Шифрование\n2 - Дешифрование\n3 - Выход"; char er[] = "Неверно"; CharToOem(welcome,welcome); CharToOem(qes,qes); CharToOem(er,er); cout<<welcome<<endl<<endl; while(q != '3') { cout<<qes<<endl; cin>>q; getchar(); switch(q) { case '1': action1(); break; case '2': action2(); break; case '3': return 1; 34 default: cout<<er<<endl; system("pause"); clrscr(); } } system("pause"); } //********************************************************* ********************* 35 10. 2. ПРИЛОЖЕНИЕ 2. ИНФОРМАЦИОННЫЕ ИСТОЧНИКИ Научная литература по программированию на языке С++: Роберт Лафоре, «Объектно-ориентированное программирование в C++», - 4-е изд. Издательский дом "Питер", 2004 – 924 стр. Столяров Андрей Викторович, «Программирование: введение в профессию. Том 1 «Азы программирования»», - 2-е изд. Издательский дом «Макс-пресс», Москва, 2021 – 707 стр. Столяров Андрей Викторович, «Программирование: введение в профессию. Том 2 «Системы и сети»», - 2-е изд. Издательский дом «Макс-пресс», Москва, 2021 – 707 стр. Столяров Андрей Викторович, «Программирование: введение в профессию. Том 3 «Парадигма»», - 2-е изд. Издательский дом «Макс-пресс», Москва, 2021 – 707 стр. Яцек Головиц «С++17 STL. Стандартная библиотека шаблонов» Издательский дом "Питер", 2018 – 432 стр. Сайты и статьи по алгоритмам и методам шифрования и дешифрования: https://wiki.hostpro.ua/knowledgebase/shifrovanie-tipy-i-algoritmy/ https://cyberleninka.ru/article/n/obzor-metodov-shifrovaniya/viewer https://siblec.ru/telekommunikatsii/teoreticheskie-osnovy-tsifrovojsvyazi/14-shifrovanie-i-deshifrovanie https://www.kaspersky.ru/blog/vigenere-cipher-history/8856/ https://obuchonok.ru/node/6793 36