Разработка приложения-шифратора, использующее шифр Тритемиуса

Описание языков программирования высокого уровня. Стандартные структуры данных, обзор принципов структурного программирования. Построение математической модели и выбор структуры данных для решения задачи. Тестирование и отладка программного кода.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 05.12.2020
Размер файла 1,3 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Федеральное агентство по рыболовству

Федеральное государственное бюджетное образовательное учреждение высшего образования

«КАМЧАТСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»

Факультет информационных технологий

Кафедра «Информационные системы»

Курсовая работа

Информатика и программирование

Разработка приложения-шифратора, использующее шифр Тритемиуса

Выполнил: студент(ка) гр. 18ПИжб

Бондаренко Анна Викторовна

Принял: Доц. каф. «Информационные системы»

Чебанюк Светлана Виталиевна

г. Петропавловск - Камчатский 2019 г.

Федеральное государственное бюджетное образовательное учреждение высшего образования

«КАМЧАТСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»

Факультет информационных технологий

Кафедра «Информационные системы»

Задание на курсовую работу

Дисциплина Информатика и программирование

Тема: «Разработка приложения-шифратора, использующее шифр Тритемиуса»

Исполнитель: 18ПИжб Бондаренко Анна Викторовна

Руководитель: Доц. каф. «Информационные системы» Чебанюк Светлана Виталиевна

Краткое содержание курсовой работы (проекта)

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

Исходные данные к курсовой работе (проекту)

Исследование шифра Тритемиуса и разработка приложения, способного зашифровывать и расшифровывать текстовые файлы данным методом шифрования.

РуководительЧебанюк С. В.

Бондаренко А. В.

Исполнитель

Дата выдачи задания «___» ___________ 2019 г.

Календарный план

Этапы работы

Разделы

Дата

1

Получение задания на курсовую работу.

Утверждение задания на курсовую работу

13.09.

2

Консультации руководителя

2.1. Математическая модель решения задачи

13.09.-14.09.

2.2. Выбор структуры данных

14.09.-15.09.

2.3. Разработка архитектура программы

15.09.-20.09.

2.4. Разработка алгоритма решения задачи

20.09.-22.09.

3

Реализация программы

23.09.-04.11.

4

Тестовое испытание программного изделия и его отладка

06.10.-18.11.

5

Оформление пояснительной записки к курсовой работе

14.10.-25.11.

6

Сдача курсовой работы на проверку

10.12.

7

Защита курсовой работы

23.12.-29.12.

Руководитель

Чебанюк С. В.

(подпись)

Исполнитель

Бондаренко А. В.

(подпись)

Аннотация

программирование язык модель код

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

Работа состоит из 43 страниц, содержит 2 литературных источника, 1 таблицу, 16 рисунков и 4 приложения.

Содержание

Введение

1. Аналитический раздел

1.1 Постановка задачи

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

1.3 Исследование задачи

2. Реализация

2.1 Разработка структур данных

2.2 Структуры данных для создания интерфейса

2.3 Разработка структуры программы

3. Тестирование

Заключение

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

Приложение А техническое задание

Приложение Б содержание компакт-диска

Приложение В Словарь терминов

Приложение Г Инструкция использования программного продукта

Введение

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

Со времен античности люди пытались защитить важную информацию, скрыть ее от лиц посторонних. Развивая такую науку как криптография, люди создали множество различных систем и методов шифрования, актуальность которых только усилилась за последние два столетия. Если раньше многие пользовались шифровальным кругом, то сейчас в век информационных технологий его место заняли специальные программные продукты. Такое понятие как «защита информации» стало знакомо не только людям, работающим с конфиденциальной информацией, но и обычным обывателям. Это проявляется в защите персональных данных таких, как банковские счета, номер страхового свидетельства, паспортные данные. Также активно реализуются шифры и в передаче сообщений через современные мессенджеры.

За все время существования данной науки было придумано множество шифров, которые обеспечивают три состояния информации:

1. Конфиденциальность - невозможность прочтения информации посторонним;

2. Целостность - невозможность незаметного изменения информации;

3. Идентифицируемость - проверка подлинности авторства или иных свойств объекта.

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

Как было понятно выше, за объект исследования взята криптография, а предмет исследования - шифр Тритемиуса -- полиалфавитная система шифрования, разработанная Иоганном Тритемием и представленная в труде по криптологии «Полиграфия» в 1508г.

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

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

Данная система заняла свое место в истории криптографии, следующие усовершенствования шифров Цезаря и Тритемиуса привело к появлению шифра Виженера, а далее в 1918 году и шифра Вернама, обладающий абсолютной криптографической стойкостью и простотой исполнения.

Целью работы является изучение принципов криптографии на примере шифра Тритемиуса с симметричным ключом, а также создание приложения с удобным и понятным интерфейсом на основе Windows API.

Задачи:

· Изучить и проанализировать информацию о системе шифрования.

· Выделить и исследовать основные термины при проектировке программы.

· Разработать программу, реализующая данный метод шифрования.

1. Аналитический раздел

1.1 Постановка задачи

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

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

Требования к программе: объем программы не более 2 Мбайт, объем данных неограничен.

Исходные файлы могут содержаться на IDE-дисках, SDD-накопителях, внешних жестких дисках, флэш-картах, картах памяти.

Аналогом данного приложения можно назвать программу DecryptoPro для ОС Android. Эта программа реализует более 20 видов различных древних кодировок. Среди них есть как известные (Азбука Морзе, бинарный код, латинский алфавит), так и менее знакомые (римский код, кодировка Цезаря, шифр Тритемиуса, Атбаш).

Имеет простой и понятный пользовательский интерфейс, без знания английского языка. Также имеется возможность расшифровки с файла или с текстового поля. В программе заложен алгоритм частотного анализа.

Еще одним аналогом можно считать приложение As-Text Crypt для ОС Windows, позволяющая шифровать и дешифровать тексты с использованием более серьезных криптографических методов таких, как AES 128 и 256 bit или Blowfish 128, 256 и 384 bit.

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

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

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

1. Процессор Intel Core i3 с частотой 2.4 ГГц и выше;

2. Оперативной памятью 4 Гбайт и выше;

3. Памятью на жестком диске 128 Гбайт и выше.

Из программных средств необходимо использовать:

1. Операционную систему Windows 8 и выше;

2. Пакет Microsoft Office 2016 и выше;

3. Среда разработки.

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

Язык программирования -- формализованный язык для описания алгоритма решения задачи на компьютере.

Для данного приложения предлагаю использовать многофункциональный язык высокого уровня С/С++, который имеет строгую структуру, что повысит читабельность и ясность алгоритма, упростит отладку программы.

Рассмотрим среды разработки приложений на языке С/С++ для выбора подходящего.

Таблица 1

Анализ сред разработки для языка С/С++

Название

Преимущества

Недостатки

1

2

3

Microsoft Visual C++

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

Взаимодействие с ОС Windows

Сложна в использовании.

Высокая стоимость профессиональной версии, что отразится на себестоимости проекта

Eclipse

Свободная среда разработки приложений, которая имеет функции, которые очень полезны для C++ разработчиков. Среда имеет некоторые впечатляющие функции, такие как подсветка синтаксиса, отладчик и авто-завершение кода. Eclipse IDE кроссплатформенная, поддерживается на Windows, Linux и Mac OS X.

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

NetBeans

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

Больше подходит под скриптовые языки такие, как JavaScript, с помощью которых можно создавать мобильные приложения.

CodeBlocks

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

Отсутствие множества полезных функций для разработки программы. Отсутствие отладки при использовании MSVC компилятора.

Автокомпиляция не доработана.

Dev C++

Cодержит в себе все необходимые инструменты для написания, компилирования, проверки и

Слабые возможности в отладке программ и их оптимизации.

выполнения программ, написанных на С++.

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

Не подходит для больших программ.

Неудобный интерфейс.

Делая выводы из таблицы, для разработки программы возьмем компилятор MS Visual C++, т.к. даже его свободно распространяемая версия Community обладает достаточным функционалом (встроенные библиотеки, ресурсы) и удобством для решения задачи.

1.3 Исследование задачи

Математическая модель:

Шифр Тритемиуса является шифром подстановки, в котором данная подстановка осуществляется с помощью уравнения зашифрования.

Уравнение зашифрования для шифра Тритемиуса имеет следующий вид:

где L - номер зашифрованной буквы в алфавите; m -- номер буквы в исходном тексте; k - шаг смещения, заданный уравнением зашифрования; N - мощность алфавита.

Примеры уравнения зашифрования:

или , где p - позиция буквы в сообщении.

Расшифровка текста проводится по формуле . Если разность L-k < 0 то, прибавляется N, пока разность не станет больше или равно нулю.

Т.к. для решения данной задачи будет использован язык С/С++, разработка алгоритма будет осуществляться с помощью метода структурного программирования.

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

Рис. 1 «Функция IndexOf»

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM) - так как планируется оконное приложение, следовательно, необходима функция, которая создаст окно и будет им управлять. Модификатор CALLBACK используется для описания пользовательских функций обратного вызова. Данная функция обрабатывает сообщения окна, сопровожденные парой 32-битных параметров WPARAM и LPARAM.

Управление происходит через сообщения, посылаемые окну во время работы программы. В зависимости от сообщения, оконная функция выбирает одну из функции-обработчиков: OnCreate, OnCommand, OnPaint, OnDestroy и специальный пункт, если приложение не обрабатывает данное сообщение. Данный выбор осуществляется с помощью оператора switch и группу макросов HANDLE_MSG, благодаря чему появляется возможность оформлять процедуры обработки сообщений в отдельные функции.

Рис. 2 «Оконная функция WndProc»

В функции BOOL OnCreate(HWND, LPCREATESTRUCT) создаются дополнительные детали интерфейса, как окно ввода, кнопки, спин, шрифты, задаются параметры этих объектов с помощью отправки к ним сообщений.

Рис. 3 «Функция OnCreate»

Функция void OnPaint(HWND) имеет различные возможности по выводу объектов, таких как графики или геометрические фигуры, но в данной задаче она имеет значение лишь в выводе вспомогательных надписей для удобства пользователя. Здесь используется контекст устройства отображения для заданного окна - это структура данных Windows, содержащая сведения об атрибутах рисования устройства, таких как экран или принтер. Является обработчиком события WM_PAINT.

Рис. 4 «Функция OnPaint»

В данной функции void OnDestroy(HWND) обрабатывает событие под именем WM_DESTROY. Оно посылается, когда Windows убирает окно с экрана, т.е. когда нажимаем иконку «Крест» в правом верхнем углу программы, в системном меню или Alt+F4. Через данную функцию удобно удалять объекты, которые были заимствованы у операционной системы.

Рис. 5 «Функция OnDestroy»

Функция void OnCommand(HWND, int, HWND, UINT) содержит в себе суть программы, т.к. именно в этой части программы идет привязка кнопок к запуску процесса зашифровки и расшифровки шифра Тритемиуса и пунктов контекстного меню к определенным действиям (открытие диалогового окна и один из способов выйти из программы), которая реализуется с помощью конструкции switch-case. Программа получает на вход имя файла, коэффициенты уравнения зашифрования с помощью функции GetWindowText() в виде строк. Коэффициенты A и B преобразуются в целочисленные значения с помощью функции atoi() и сохраняются в соответствующие переменные. Открывается файл, его содержимое читается в буфер. Над ним реализуется алгоритм шифра Тритемиуса. Происходит открытие нового файла и запись в него буфера. В коде процессов зашифровки и дешифровки после чтения файла в буфер, имеется момент синхронизации благодаря функции WaitForSingleObject(). Данная функция ждет момента, когда дескриптор файла будет установлен в свободное состояние, чтобы продолжить дальнейшее выполнение программы. Из-за флага INFINITE ожидание не имеет какого-либо срока. (Рис. 6)

Рис. 6 «Функция OnCommand»

Для диалогового окна тоже создается и определяется своя оконная функция BOOL CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM), для обработки своих специальных сообщений, таких как WM_INITDLG и свою версию WM_COMMAND и соответственно включает в себя функции-обработчики: OnInitDlg, DlgOnCommand и блок, если приложение не обрабатывает данное сообщение. (Рис. 7)

Рис. 7 «Оконная функция DlgProc»

BOOL OnInitDlg(HWND, HWND, LPARAM) просто создает окно и возвращает истину TRUE, т.к. вся необходимая информация находится в файле ресурсов about_program.rc.

Рис. 8 «Функция OnInitDlg»

В void DlgOnCommand(HWND, int, HWND, UINT) осуществляется закрытие окна при нажатии кнопки «Ок» или иконки «Крест» в правом верхнем углу диалогового окна. Для выбора используется конструкция switch-case. (Рис. 9)

Рис. 9 «Функция DlgOnCommand»

В главном теле программы задаются характеристики главного окна, происходит его привязка к оконной функции. Оно регистрируется и создается функцией CreateWindow(). Определяется цикл while, связанный с обработкой сообщений. Реализовывается основное меню программы из одного пункта «Файл», содержащее контекстное меню из двух пунктов «О программе» и «Выход».

Рис. 10 «Главная функция WinMain»

2. Реализация

Для программы, реализующей шифр Тритемиуса для зашифровки текста, необходимо разработать удобный, привычный и наглядный интерфейс, т.е. создать оконное приложение. Для этой цели задействуем Windows API. Windows API (Application Programming Interface) -- программный интерфейс пользовательского режима для ОС семейства Windows. До появления 64-разрядных версий Windows программный интерфейс 32-разрядных версий ОС Windows назывался Win32 API в отличие от исходного 16-разрядного Windows API, программного интерфейса для исходных 16-разрядных версий Windows. Изначально Windows API состоял только из функций в стиле С. Сегодня разработчикам доступны тысячи функций. Выбор языка С был естественным на момент появления Windows, потому что он был своего рода «наименьшим общим кратным» (т. е. написанный на нем код также мог использоваться из других языков) и он был достаточно низкоуровневым для предоставления сервиса ОС. Обратной стороной было огромное количество функций в сочетании с недостаточной последовательностью выбора имен и отсутствием логических группировок (вроде пространств имен C++). [2]

Для создания интерфейса оконного приложения, работы с файлами и потоками будем взаимодействовать специализированными типами данных, которые определены ОС Windows. Эти типы данных относятся к определенным объектам. Почти любой объект Windows характеризуется числом, называемым дескриптором (handle). Это может быть порядковый номер объекта или адресом области памяти, хранящей в себе все характеристики объекта. Поэтому все манипуляции по изменению состояния данного объекта всегда проводятся с использованием его дескриптора, чтобы система знала, какой именно объект мы имеем в виду.

2.1 Разработка структур данных

В соответствии с математической моделью шифра Тритемиуса смещение является переменным целым числом (int k) и задается функцией, в данном случае линейной , где A и B -- коэффициенты. Пользователь сам задает A и B, только в программе они представлены как С-строки. Чтобы рассчитать смещение k нужно перевести эти строки в целочисленные значения. Для хранения чисел создаем переменные int nA и int nB.

Также понадобится переменная, хранящая мощность заданного алфавита, т.е. кол-во символов int N.

Для хранения номера зашифрованной буквы в алфавите будет определена переменная int L.

Программа будет работать с двумя файлами. Дескрипторы файлов HANDLE hInFile и hOutFile. Когда создается новый поток ввода-вывода, ядро возвращает процессу, создавшему поток ввода-вывода, его файловый дескриптор. Чтобы получить дескриптор, файл нужно открыть (создать) функцией CreateFile().

Первый файл содержит текст сообщения на естественном языке или шифротекст. При нажатии кнопки «Зашифровать» или «Расшифровать» происходит открытие файла c флагом OPEN_EXISTING, т.е. файл должен уже существовать на момент работ программы, иначе функция вернет ошибку, идет проверка открылся ли этот файл. Далее вычисляется его размер для определения размера буфера, куда содержимое будет прочитано.

Результат работы алгоритма шифра Тритемиуса над буфером записывается в новый файл, который также открывается, но уже с флагом CREATE_ALWAYS, т.е. файл каждый раз будет перезаписываться автоматически, далее идет проверка.

Чтобы весь файл был прочитан в буфер, нужно, чтобы его размер совпадал с размером файла. Для этого используем функцию DWORD GetFileSize() и переменную того же типа dwSize для хранения размера файла. Т.к. значение типа DWORD нельзя использовать в цикле с параметром, то преобразуем его в целочисленное. Также для технических целей понадобится переменная типа DWORD dwCnt для подсчета прочитанных или записанных байт в функциях ReadFile() и WriteFile().

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

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

Для имени файла char *szName выделим динамическую память, используя функцию void malloc(size_t st), в размере 128 байт. Затем освободим занятую память функцией void free(void *ptr).

Строки char szA[3] и szB[3] для вводимых пользователем коэффициентов.

Буфером для чтения и записи служит char* nBuf. Поскольку заранее размер этой строки неизвестен, память под эту строку следует выделить динамически, взяв ее из кучи процесса. Кучей (heap) называется свободная область памяти, предназначенная для выделения из нее программой по мере необходимости участков нужного размера. Размер кучи по умолчанию - 1 Мбайт (прим. в современных компьютерах намного больше), однако ее можно увеличить на этапе компоновки программы. Первоначально куча существует только в линейном адресном пространстве; физическая память под нее не выделяется. По мере запроса программой памяти из кучи система выполняет отображение части линейного адресного пространства на физическую память, передавая в программу информацию об отображенном участке. <…> Выделение памяти из кучи требует двух действий. Сначала надо вызовом функции GetProcessHeap() получить указатель (типа HANDLE) на кучу процесса. Имея этот указатель, можно вызвать функцию НеарAlloc(), которая выполняет собственно выделение памяти из состава кучи. В качестве параметров функции НеарАllос() выступают указатель кучи, константа HEAP_ZERO_MEMORY, задающая обнуление выделяемой памяти (без этой константы память при выделении не будет очищена), и размер требуемой области в байтах. Функция возвращает указатель (линейный адрес) выделенного блока памяти. В конце работы програмы куча освобождается функцией HeapFree(). [3]

2.2 Структуры данных для создания интерфейса

Для создания удобного и понятного интерфейса воспользуемся:

1. Дескриптор приложения HINSTANCE hInst;

2. Дескрипторы окон:

2.1. Главное окно HWND hwnd с использованием структур WNDCLASS для задания характеристик и последующей регистрации окна и MSG для получения сообщений, присылаемых окну. Оно работает на основе оконной функции, которая получает и обрабатывает эти сообщения;

2.2. Окно ввода имени файла HWND hwndEdit с флагами WM_CHILD (дочернее), WM_BORDER (с границей), WM_VISIBLE (видимое), ES_AUTOHSCROLL (с автоматической горизонтальной прокруткой).

2.3. Окно ввода коэффициентов линейной функции HWND hwndA, hwndB с флагами WS_BORDER, WS_CHILD, WS_VISIBLE, ES_CENTER (по центру), ES_NUMBER (только числа);

2.4. Две кнопки HWND hwndBC «Зашифровать», hwndBD «Расшифровать» с помощью них запускается процесс зашифровки и дешифровки сообщения с флагами WS_CHILD, WS_VISIBLE, BS_PUSHBUTTON (кнопка нажатия);

2.5. Два наборных счетчика (UP_DOWN_CONTROL) HWND hwndUDcontrol1 и hwndUDcontrol2 с флагами WS_CHILD, WS_VISIBLE, UDS_ARROWKEYS (клавиши со стрелками), UDS_SETBUDDYINT (установить счетчик), UDS_ALIGNRIGHT (клавиши справа от счетчика). Диапазон возможных значений от 0 до 10 у обоих.

3. Дескриптор логического шрифта с использованием структуры LOGFONT: HFONT hFont1 (шрифт: Arial Cyr, высота 14), hFont2 (шрифт: Arial Cyr, высота 16), hFont3 (шрифт: Arial Cyr, высота 18, ширина буквы-FW_MEDIUM, т.е. 500) служит для наглядности программы;

4. Дескриптор меню HMENU hMenu - основное, HMENU hPopupMenu -всплывающее контекстное меню. Осуществляет просмотр информации о программе и один из вариантов ее завершения;

5. Для внедрения вспомогательных надписей понадобятся структуры PAINTSTRUCT для системной информации и HDC дескриптор контекста устройства. Сами надписи С-строки.

2.3 Разработка структуры программы

Программа состоит из главного файла Shifr_Tritemius_ver2.cpp, двух заголовочных файлов, один из которых Shifr_Tritemius_ver2.h с прототипами функций и макросами, а другой - resource.h, созданный системой для подключения ресурсного файла, и сам ресурсный файл about_program.rc.

Заголовочный файл Shifr_Tritemius_ver2.h:

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

Рис. 11 «Макросы»

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

Рис. 12 «Прототип оконной функции главного окна и функций, отправляющих сообщения данному окну»

Рис. 13 «Прототип оконной функции диалогового окна и функций, отправляющих сообщения данному окну»

В заголовочном файле также определена функция int IndexOf(char*, char), которая возвращает номер символа в строке.

Рис. 14 «Определение функции IndexOf»

Описание функций (Рис.12, Рис.13) приводилось выше в «Аналитическом разделе», а их реализация находится в Приложении А.

Главный файл Shifr_Tritemius_ver2.cpp:

К главному файлу подключены библиотеки windows.h, windowsx.h, CommCtrl.h; заголовочные файлы Shifr_Tritemius_ver2.h, resource.h.

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

Точкой входа в программу является функция WinMain() с модификатором WINAPI, как и модификатор CALLBACK: «Это соглашение определяет, что при вызове функции ее параметры помещаются в стек в таком порядке, что в глубине стека оказывается последний параметр, а на вершине- первый. Сама функция, разумеется, знает о таком расположении ее параметров и выбирает их из стека в правильном порядке» (К.Г. Финогенов «Win32.Основы программирования» стр. 121). Т.е. оба этих модификатора являются переопределением специального модификатора _stdcall, соответствующего соглашению о передаче параметров, использующегося исключительно в Win32 API - стандартный вызов.

Особое место в главном теле программы занимает цикл обработки сообщений с помощью специальной функции GetMessage().

Функция TranslateMessage() переводит сообщения виртуальных клавиш в символьные сообщения. Функция DispatchMessage() распределяет сообщение оконной процедуре.

Рис. 15 «Цикл обработки сообщений»

Также одной из особенностей данной программы является создание простого модального диалогового окна с информацией о ее создателе. Макет содержится в файле ресурсов about_program.rc.

Рис. 16 «Модальное диалоговое окно»

3. Тестирование

Исходный текст сообщения (содержится в файле Тест.txt).

Входе работы программы, при линейном уравнении зашифрования , где A=5, B=3, получаем текст, зашифрованный шифром Тритемиуса. Создается файл CriptFile.txt.

Зная коэффициенты линейной функции (, где A=5, B=3), возможно совершить расшифровку сообщения. Создается файл enCriptFile.txt.

При A=8, B=2

CriptFile.txt

enCriptFile.txt

При A=4, B=7

CriptFile.txt

enCriptFile.txt

Заключение

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

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

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

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

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

1. Шифр Тритемиуса -- Википедия.

2. Руссинович М., Соломон Д., Ионеску А., Йосифович П. В60 Внутреннее устройство Windows. 7-е изд. СПб.: Питер, 2018. 944 с.: ил. (Серия «Классика computer science»).

3. Финогенов К. Г. Ф59 Win32. Основы программирования. 2-е изд., испр. и дополн. М.: ДИАЛОГ-МИФИ, 2006. 416 с.

Приложение А Листинг

Заголовочный файл Shifr_Tritemius.h

#pragma once

#define ID_CODE 101

#define ID_DECODE 102

#define ID_ABOUT 200

#define ID_UPDOWNA 201

#define ID_UPDOWNB 202

#define ID_EXIT 203

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

BOOL OnCreate(HWND, LPCREATESTRUCT);

void OnCommand(HWND, int, HWND, UINT);

void OnDestroy(HWND);

void OnPaint(HWND);

BOOL CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);

BOOL OnInitDlg(HWND, HWND, LPARAM);

void DlgOnCommand(HWND, int, HWND, UINT);

int IndexOf(char *str, char c)

{

int j = strchr(str, c) - str;

return j;

}

Главная программа Shifr_Tritemius.cpp

#include <windows.h>

#include <windowsx.h>

#include <CommCtrl.h>

#include "Shifr_Tritemiusa_ver2.h"

#include "resource.h"

// Глобальные переменные:

HINSTANCE hInst; // текущий экземпляр

HWND hwndEdit; // ввод текста

HWND hwndA, hwndB; //ввод коэффициентов для смещения

HFONT hFont1, hFont2, hFont3;

char Alph[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ.,/'!?%№1234567890"; //заданный алфавит

int WINAPI WinMain(HINSTANCE hI, HINSTANCE, LPSTR, int)

{

hInst = hI; // присваиваем глобальной переменной дескриптор приложения

char szTittle[] = "Шифр Тритемиуса"; // Текст строки заголовка

char szWindowClass[] = "Main Window"; // имя класса главного окна

MSG msg; // структура, которая ловит сообщения

WNDCLASS wc; // структура для создания окна

ZeroMemory(&wc, sizeof(wc)); //обнуление структуры

//заполнение структуры

wc.hInstance = hI;

wc.lpfnWndProc = WndProc;

wc.lpszClassName = szWindowClass;

wc.hIcon = LoadIcon(hI, IDI_APPLICATION);

wc.hCursor = LoadCursor(hI, IDC_ARROW);

wc.hbrBackground = CreateSolidBrush(RGB(234, 230, 202));

RegisterClass(&wc); //регистрация окна

HWND hwnd = CreateWindow(szWindowClass, szTittle, WS_CAPTION | WS_MINIMIZEBOX | WS_OVERLAPPED | WS_SYSMENU,

250, 250, 515, 300, HWND_DESKTOP, NULL, hI, NULL); //создание окна

ShowWindow(hwnd, SW_SHOWNORMAL);//показываем окно на экране

//меню программы

HMENU hMenu = CreateMenu();//создаем основное меню

HMENU hPopupMenu = CreatePopupMenu(); // создаем контекстное меню

AppendMenu(hMenu, MF_STRING | MF_POPUP, (UINT)hPopupMenu, "&Фаил");

{

AppendMenu(hPopupMenu, MF_STRING, ID_ABOUT, "О программе");

AppendMenu(hPopupMenu, MF_SEPARATOR, 1000, "");

AppendMenu(hPopupMenu, MF_STRING, ID_EXIT, "Выход");

}

SetMenu(hwnd, hMenu); //устанавливаем его

//цикл обработки сообщений

while (GetMessage(&msg, NULL, 0, 0))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

return 0;

}

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)//оконная функция главного окна

{

switch (msg)

{

HANDLE_MSG(hwnd, WM_CREATE, OnCreate);

HANDLE_MSG(hwnd, WM_COMMAND, OnCommand);

HANDLE_MSG(hwnd, WM_DESTROY, OnDestroy);

HANDLE_MSG(hwnd, WM_PAINT, OnPaint);

default: return DefWindowProc(hwnd, msg, wParam, lParam);

}

}

void OnDestroy(HWND)//функция, закрывающая окно

{

DeleteObject(hFont1);

DeleteObject(hFont2);

DeleteObject(hFont3);

PostQuitMessage(0);

}

BOOL OnCreate(HWND hwnd, LPCREATESTRUCT)//функция создания дополнительных элементов

{

//создаем шрифты

char szFont[] = "Arial Cyr";

LOGFONT lf;

memset(&lf, 0, sizeof(LOGFONT));

strcpy(lf.lfFaceName, szFont);

lf.lfHeight = 14;

hFont1 = CreateFontIndirect(&lf);

lf.lfHeight = 16;

hFont2 = CreateFontIndirect(&lf);

lf.lfHeight = 18;

lf.lfWeight = FW_MEDIUM;

hFont3 = CreateFontIndirect(&lf);

// дескрипторы кнопок

HWND hwndBC = CreateWindow("BUTTON", "Зашифровать", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,

340, 100, 110, 35, hwnd, (HMENU)ID_CODE, hInst, NULL);

HWND hwndBD = CreateWindow("BUTTON", "Расшифровать", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,

340, 200, 110, 35, hwnd, (HMENU)ID_DECODE, hInst, NULL);

hwndEdit = CreateWindow("EDIT", NULL, WS_BORDER | WS_CHILD | WS_VISIBLE|ES_AUTOHSCROLL,

30, 40, 425, 25, hwnd, NULL, hInst, NULL);

hwndA = CreateWindow("EDIT", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | ES_CENTER | ES_NUMBER,

150, 110, 50, 30, hwnd, NULL, hInst, NULL);

hwndB = CreateWindow("EDIT", NULL, WS_BORDER | WS_CHILD | WS_VISIBLE | ES_CENTER | ES_NUMBER,

150, 180, 50, 30, hwnd, NULL, hInst, NULL);

//создаем два спина и посылаем им сообщения

HWND hwndUDcontrol1 = CreateWindow(UPDOWN_CLASS, NULL, WS_CHILD | WS_VISIBLE | UDS_ARROWKEYS|UDS_SETBUDDYINT|UDS_ALIGNRIGHT,

180, 110, 50, 30, hwnd, NULL, hInst, NULL);

SendMessage(hwndUDcontrol1, UDM_SETBUDDY, (WPARAM)hwndA, 0);//связуем окно ввода со спином

SendMessage(hwndUDcontrol1, UDM_SETRANGE32, 0, MAKELONG(10, 0));//диапазон значений

SendMessage(hwndUDcontrol1, UDM_SETPOS32, 0, 1);//позиция

HWND hwndUDcontrol2 = CreateWindow(UPDOWN_CLASS, NULL, WS_CHILD | WS_VISIBLE | UDS_ARROWKEYS | UDS_SETBUDDYINT | UDS_ALIGNRIGHT,

180, 180, 50, 30, hwnd, NULL, hInst, NULL);

SendMessage(hwndUDcontrol2, UDM_SETBUDDY, (WPARAM)hwndB, 0);//связуем окно ввода со спином

SendMessage(hwndUDcontrol2, UDM_SETRANGE32, 0, MAKELONG(10, 0));//диапазон значений

SendMessage(hwndUDcontrol2, UDM_SETPOS32, 0, 1);//позиция

//посылаем сообщение об изменении шрифта надписи кнопки

SendMessage(hwndBC, WM_SETFONT, (WPARAM)hFont2, NULL);

SendMessage(hwndBD, WM_SETFONT, (WPARAM)hFont2, NULL);

SendMessage(hwndEdit, WM_SETFONT, (WPARAM)hFont3, NULL);

SendMessage(hwndA, WM_SETFONT, (WPARAM)hFont3, NULL);

SendMessage(hwndB, WM_SETFONT, (WPARAM)hFont3, NULL);

return TRUE;

}

void OnCommand(HWND hwnd, int id, HWND, UINT)

{

//выделяем динамическую память

char*szName=(char*)malloc(128*sizeof(char));//выделяем динамическую память для имени файла

char* nBuf; //буфер

char szA[3], szB[3]; //строки для коэффициентов

HANDLE hInFile, hOutFile; //дескрипторы файлов

HANDLE hHeap; //дескриптор кучи процесса

DWORD dwCnt; //для подсчета байтов

DWORD dwSize; //для размера файла

int nA, nB; //целые для коэффициентов

int N = strlen(Alph); //45 символов

int M; // переменная, для размера буфера

switch (id)

{

case ID_CODE: // кодирование

GetWindowText(hwndA, szA, 2); //взяли текст из А

GetWindowText(hwndB, szB, 2); //взяли текст из В

nA = atoi(szA); //перевод строки в целое число

nB = atoi(szB);

GetWindowText(hwndEdit, szName, strlen(szName)); //взяли имя файла

hInFile = CreateFile(szName, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); //открываем фаил

if (hInFile == INVALID_HANDLE_VALUE) break; //проверяем открыт ли

dwSize = GetFileSize(hInFile, NULL); //получаем размер файла

hHeap = GetProcessHeap(); //получаем кучу процесса

nBuf = (char*)HeapAlloc(hHeap, HEAP_ZERO_MEMORY, dwSize);//выделяем память

M =(int) dwSize;//преобразуем размер файла в целое

ReadFile(hInFile, nBuf, dwSize, &dwCnt, NULL); //читаем в буфер nBuf

WaitForSingleObject(hInFile, INFINITE); // ждем пока прочитается

CloseHandle(hInFile);//закрываем дескриптор файла

free(szName);//освобождаем память

for (int i = 0; i < M; i++) // код зашифровки кода Тритемиуса

{

nBuf[i] = toupper(nBuf[i]); //переводим в верхний регистр для удобства

int k = nA * i + nB; //вычисляем смещение

int L = (IndexOf(Alph, nBuf[i]) + k) % N; // IndexOf() находим позицию символа(из nBuf) в Alph

nBuf[i] = Alph[L]; // присваиваем его nBuf

}

hOutFile = CreateFile("CriptFile.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL); // создаем файл для вывода

if (hOutFile == INVALID_HANDLE_VALUE) break; //проверяем открыт ли

WriteFile(hOutFile, nBuf, dwSize, &dwCnt, NULL); // пишем в него из nBuf

CloseHandle(hOutFile); //закрываем дескриптор

MessageBox(hwnd, "Файл зашифрован", "Завершение работы", MB_OK);

// удаляем динамическую память

HeapFree(hHeap, 0, nBuf);

break;

case ID_DECODE: //декодирование

GetWindowText(hwndA, szA, 10);//взяли текст из А

GetWindowText(hwndB, szB, 10);//взяли текст из В

nA = atoi(szA);

nB = atoi(szB);

GetWindowText(hwndEdit, szName, 127);//взяли имя файла

hInFile = CreateFile(szName, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);//открываем фаил

if (hInFile == INVALID_HANDLE_VALUE) break;

dwSize = GetFileSize(hInFile, NULL);

hHeap = GetProcessHeap();

nBuf = (char*)HeapAlloc(hHeap, HEAP_ZERO_MEMORY, dwSize);

M = (int)dwSize;

ReadFile(hInFile, nBuf, dwSize, &dwCnt, NULL);//читаем в буфер nBuf

WaitForSingleObject(hInFile, INFINITE);// ждем пока прочитается

CloseHandle(hInFile);

free(szName);

for (int i = 0; i < M; i++) // код расшифровки шифра Тритемиуса

{

nBuf[i] = toupper(nBuf[i]);

int k = nA * i + nB;

int L = IndexOf(Alph, nBuf[i]) - k; //если разность < 0

while (L < 0)//прибавляем N, пока не станет равно или больше нуля

L = L + N;

int m = L % N;

nBuf[i] = Alph[m];

}

hOutFile = CreateFile("enCriptFile.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);// создаем файл для вывода

if (hOutFile == INVALID_HANDLE_VALUE) break;

WriteFile(hOutFile, nBuf, dwSize, &dwCnt, NULL);// пишем в него из nBuf

CloseHandle(hOutFile);

// удаляем динамическую память

MessageBox(hwnd, "Фаил расшифрован", "Завершение работы", MB_OK);

HeapFree(hHeap, 0, nBuf);

break;

case ID_ABOUT:

DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hwnd, DlgProc);

break;

case ID_EXIT:

DestroyWindow(hwnd);

break;

}

}

void OnPaint(HWND hwnd) //функция для вывода вспомогательных надписей

{

char szText1[] = "Введите коэффициент А";

char szText2[] = "Введите коэффициент B";

char szText3[] = "Введите полное имя файла:";

PAINTSTRUCT ps; //структура для заполнения системой

HDC hdc = BeginPaint(hwnd, &ps); //получаем дескриптор контекста устройства

SelectFont(hdc, hFont1); //выбираем нужный шрифт

SetTextColor(hdc, RGB(0, 0, 0));

SetBkMode(hdc, TRANSPARENT); //чтобы было без белых прямоугольников

TextOut(hdc, 5, 120, szText1, strlen(szText1));//пишем текст

TextOut(hdc, 5, 190, szText2, strlen(szText2));

TextOut(hdc, 33, 25, szText3, strlen(szText3));

EndPaint(hwnd, &ps);//закрываем контекст устройства

}

BOOL CALLBACK DlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)// оконная функция диалогового окна

{

switch (msg)

{

HANDLE_MSG(hwnd, WM_INITDIALOG, OnInitDlg);

HANDLE_MSG(hwnd, WM_COMMAND, DlgOnCommand);

default: return FALSE;

}

}

BOOL OnInitDlg(HWND, HWND, LPARAM)//создаем диалоговое окно без ничего (все в файле ресурсов)

{

return TRUE;

}

void DlgOnCommand(HWND hwnd, int id, HWND, UINT)//привязываем макросы к определенным действия

{

switch (id)

{

case IDOK:

case IDCANCEL: EndDialog(hwnd, 0);

break;

}

}

Приложение Б Содержание компакт-диска

Компакт-диск содержит:

1. проект программы Shifr_Tritemiusa_ver2. Он включает в себя файлы с исходным кодом и подключаемых библиотек, а также сам исполняемый файл Shifr_Tritemius_ver2.exe;

2. пояснительную записку;

3. тестовый файл с исходным текстом;

4. презентацию.

Приложение В Словарь терминов

Дескриптор20

Идентифицируемость6

Контекст устройства отображения для заданного окна14

Конфиденциальность6

Криптоанализ7

Криптография6

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

Куча процесса22

Массив22

Среда для создания приложений11

Уравнение зашифрования7

Целостность6

Шифрование6

Язык программирования11

Windows API20

Приложение Г Инструкция использования программного продукта

1. Открыть приложение Shifr_Tritemiusa_ver2.

2. Ввести в окно ввода полное имя файла, используя при разделении каталогов знак двойного слэша «\\»;

3. С помощью двух наборных счетчиков задать коэффициенты уравнения зашифрования;

4. Нажать кнопку «Зашифровать», если файл необходимо зашифровать, или кнопку «Расшифровать», если файл необходимо расшифровать.

Размещено на Allbest.ru


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.