Шифры подстановки

Алгоритм моноалавитной подстановки. Проектирование программного модуля. Составление сценария взаимодействия. Разработка алгоритмов и интерфейса взаимодействия с пользователем. Программная реализация информационной системы. Выбор используемых технологий.

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

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

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

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

Введение

программный алгоритм технология интерфейс

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

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

В целом, шифрование состоит из двух составляющих -- зашифровывание и расшифровывание.

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

Одним из вариантов шифрования данных является шифр подстановки -- метод шифрования, в котором элементы исходного открытого текста заменяются зашифрованным текстом в соответствии с некоторым правилом.

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

1.1 Описание предметной области

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

1.2 Входные и выходные данные

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

1.3 Составление математических (вербальных моделей)

В курсовой работе реализованы три алгоритма: моноалфавитной подстановки, Цезаря и Тритемиуса. Ниже будет рассмотрена математическая модель каждого из них.

2. Алгоритм моноалавитной подстановки

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

Символам Si исходного алфавита А0, с помощью которых записывается исходная информация, однозначно ставятся в соответствие символы Si шифрующего алфавита A1.

В курсовой оба алфавита состоят из одного и того же набора символов - букв русского алфавита.

Искодным алфавитом является: "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя", шифрующий алфавит: "ЯЮЭЬЫЪЩШЧЦХФУТСРПОНМЛКЙИЗЖЁЕДГВБАяюэьыъщшчцхфутсрпонмлкйизжёедгвба".

При шифровании символу из исходного алфавита ставится в соответсвие символ с тем же индексом из шифрующего алфавита.

1. Алгоритм Цезаря

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

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

В шифре Цезаря ключом служит произвольное число k, выбранное в интервале от 1 до 25. В разработанной системе ключ вводится пользователем с клавиатуры.

Если сопоставить каждому символу алфавита его порядковый номер (нумеруя с 0), то шифрование и дешифрование можно выразить формулами модульной арифметики:

где - символ открытого текста, - символ шифрованного текста, - мощность алфавита, а - ключ.

2. Алгоритм Тритемиуса

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

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

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

L=(m+k) mod N

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

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

Для корректной работы разрабатываемой системы должны выполняться следующие требования:

1. Корректное шифрование любым из предложенных алгоритмов.

2. Результат дешифрования должен соответстовать тексту, введенному для шифрования.

3. Система корректно считывает текст из файла.

4. Система корректно сохраняет текст в файл.

5. Система предоставляет верную статистику повторения введенных символов.

2. Проектирование программного модуля

2.1 Составление перечня функциональности (User Stories)

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

Таблица 2.1 - Перечень функциональности (User Stories)

Роль

Действие

Тип объекта

Объект

Сущность

Пользователь

Запускаeт

Приложение

Шифратор

MainForm

Пользователь

Вводит

Текст

Поле ввода

MainForm

Пользователь

Выбирает

Алгоритм

Алгоритм моноалфавитной подстановки

MainForm

Система

Активирует

Кнопку

Зашифровать

MainForm

Система

Активирует

Кнопку

Расшифровать

MainForm

Пользователь

Нажимает

Кнопку

Зашифровать

MainForm

Система

Шифрует

Текст

Поле ввода

MainForm

Система

Отображает

Текст

Поле вывода

MainForm

Система

Активирует

Кнопку

Сохранить текст в файл

MainForm

Система

Активирует

Кнопку

Показать частотный словрь

MainForm

Пользователь

Нажимает

Кнопку

Расшифровать

MainForm

Система

Расшифровывает

Текст

Поле вывода

MainForm

Система

Отображает

Исходный тексст

Поле ввода

MainForm

Система

Отображает

Расшифрованный текст

Поле вывода

MainForm

Пользователь

Вводит

Текст

Поле ввода

MainForm

Пользователь

Выбирает

Алгоритм

Алгоритм Цезаря

MainForm

Пользователь

Вводит

Текстовое поле

Ключ шифрования

MainForm

Пользователь

Нажимает

Кнопку

Зашифровать

MainForm

Система

Шифрует

Текст

Поле ввода

MainForm

Система

Отображает

Текст

Поле вывода

MainForm

Пользователь

Нажимает

Кнопку

Расшифровать

MainForm

Система

Расшифровывает

Текст

Поле вывода

MainForm

Система

Отображает

Исходный тексст

Поле ввода

MainForm

Система

Отображает

Расшифрованный текст

Поле вывода

MainForm

Система

Отображает

MasageBox

Ключ шифра

MainForm

Пользователь

Вводит

Текст

Поле ввода

MainForm

Пользователь

Выбирает

Алгоритм

АлгоритТритемиуса

MainForm

Пользователь

Вводит

Текстовое поле

Шифрующее слово

MainForm

Пользователь

Нажимает

Кнопку

Зашифровать

MainForm

Система

Шифрует

Текст

Поле ввода

MainForm

Система

Отображает

Текст

Поле вывода

MainForm

Пользователь

Нажимает

Кнопку

Расшифровать

MainForm

Система

Расшифровывает

Текст

Поле вывода

MainForm

Система

Отображает

Исходный тексст

Поле ввода

MainForm

Система

Отображает

Расшифрованный текст

Поле вывода

MainForm

Пользователь

Нажимает

Кнопку

Сохранить текст в файл

MainForm

Пользователь

Нажимает

Кнопку

Загрузить текст из файла

MainForm

Система

Отображает

Окно

Выбор файла

-

Пользователь

Выбирает

Файл

Текстовый файл

-

Система

Отображает

Текст из файла

Поле для ввода

MainForm

Пользователь

Нажимает

Кнопку

Показать частотный словарь

MainForm

Система

Отображает

Фомрму

Частотный словарь

FrequentDict

Пользователь

Нажимает

Кнопку

Закрыть

FrequentDict

Пользователь

Нажимает

Кнопку

Закрыть

MainForm

Система

Закрывает

-

-

MainForm

2.2 Составление сценария взаимодействия

Краткий сценарий взаимодействия:

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

Подробный сценарий взаимодействия:

1. Пользователь запускает приложение.

2. Пользователь вводит текст в поле для ввода

3. Пользователь выбирает

3.1 Алгоритм моноалфавитной подстановки

3.1.1 Пользователь нажимает Зашифровать

3.1.2 Система отображает зашифрованный текст в поле вывода

3.1.3 Пользователь нажимает Расшифровать

3.1.4 Система отображает зашифрованный текст в поле ввода

3.1.5 Система отображает расшифрованный текст в поле вывода

3.2 Алгоритм Цезаря

3.2.1 Пользователь вводит ключ шифрования

3.2.2 Пользователь нажимает Зашифровать

3.2.3 Система отображает зашифрованный текст в поле вывода

3.2.4 Пользователь нажимает Расшифровать

3.2.5 Система отображает зашифрованный текст в поле ввода

3.3 Алгоритм Тритемиуса

3.3.1 Пользователь вводит шифрующее слово

3.3.2 Пользователь нажимает Зашифровать

3.3.3 Система отображает зашифрованный текст в поле вывода

3.3.4 Пользователь нажимает Расшифровать

3.3.5 Система отображает зашифрованный текст в поле ввода

4. Пользователь нажимает Сохранить текст в файл

4.1 Пользователь выбирает файл для сохранения

4.2 Система сохраняет текст из поля вывода в файл

5. Пользователь нажимает Загрузить текст из файла

5.1 Система предлагает выбрать файл

5.2 Пользователь выбирает файл

5.3 Система отображает текст файла в поле ввода

6. Пользователь нажимает Показать частотный словарь

6.1 Система открывает форму FrequentDict

6.2 Пользователь изучает данные

6.3 Пользователь нажимает Закрыть

6.4 Система закрывает форму

7. Пользователь нажимает Закрыть

8. Система закрывает приложение

2.3 Разработка интерфейса взаимодействия с пользователем

На рисунке 2.1 представлено основное окно приложения.

Рисунок 2.1 - Главное окно приложения

На главном окне расположены:

1. Поле ввода - текстовое поле, куда пользователь может добавить текст

2. Поле вывода - поле, где отображаются результаты шифрования

3. Кнопки выбораа алгоритма

4. Поле для ввода ключа шифрования для алгоритма Цезаря

5. Поле для ввода шифрующего слова для алгоритма Тритемиуса

6. Кнопка Зашифровать - выполняет шифровку введенного текста

7. Кнопка Расшифровать - выполняет расшифровку введенного текста

8. Кнопка Загрузить текст из файла - позволяет выбрать текстовый файл для загрузки текста

9. Кнопка Сохранить текст в файл - позволяет сохранить текст из поля вывода в файл

10. Кнопка Показать частотный словрь - отображает пользователю статистику введенных символов

На рисунке 2.2 представлена главная форма во время работы приложения.

Рисунок 2.2 - Главная форма во время работы приложения

На рисунке 2.3 представлена форма Частотного словаря

Рисунок 2.3 - Форма Частотный словарь

На форме отображены следующие элементы:

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

2. Таблица частотного словаря русского языка - отображает частоту каждой буквы в русском языке

3 Разработка документации программного модуля

3.1 Разработка диаграммы классов

Диаграмма классов (англ. Static Structure diagram) -- диаграмма, демонстрирующая классы системы, их атрибуты, методы и взаимосвязи между ними. Диаграмма классов является ключевым элементом в объектно-ориентированном моделировании.

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

На рисунке 3.1.1 представлена диаграмма классов разрабатываемой системы.

Рисунок 3.1.1 -- Классы в программном модуле

3.2 Разработка диаграммы деятельности

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

Диаграмма деятельности программного модуля представлена на рисунке 3.2.

Рисунок 3.2 - Диаграмма взаимодействия пользователя с программой

3.3 Разработка основных алгоритмов

На рисунке 3.3 представлен основной алгоритм работы программы.

Рисунок 3.5 -Основной алгоритм программного модуля

4 Программная реализация информационной системы

4.1 Выбор и обоснование используемых технологий

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

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

2. Относится к языкам компилируемого типа, поэтому он обладает всеми преимуществами таких языков.

3. Объединяет лучшие идеи современных языков программирования Java, C++, Visual Basic и т.д.

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

5. Большая надёжность была достигнута из-за работы CLR машины, ведь в отличии от других компилятор CLR запускает разработанное приложение на виртуальном процессоре. Поэтому в случаях возникновения каких-либо ошибок, это никак не повлияет на работу других программ в системе, но это также обозначает, что для запуска программы необходимо дополнительное время. Соответственно программы написанные на языке программирования C# более надёжные, но менее быстрые (нежели теже программы, написанные на C++).

Для визуализации симуляции была выбрана технология WindowsForms. Windows Forms -- интерфейс программирования приложений (API), отвечающий за графический интерфейс пользователя и являющийся частью Microsoft .NET Framework. WindowsForms является отличным решением для реализации небольших приложений с простым дизайном.

4.2 Описание используемых структур данных

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

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

Используемые структуры данных:

1. Dictionary<T,V> - позволяет хранить данные в виде пары ключ-значение, таким образом, что любое значение можно получить по уникальному ключу.

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

3. Константы - атрибуты класса, являющиеся неизменными после присвоения им значения.

4.3 Исходный код программы

using System;

using System.Collections.Generic;

using System.Linq;

using System.Security.Cryptography.X509Certificates;

using System.Text;

using System.Threading;

using System.Threading.Tasks;

namespace Project

{

public class CaesarEncoder: ICryptable

{

private int cryptKey;

const string ALPHABET = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ";

public CaesarEncoder(int cryptKey = 1)

{

this.cryptKey = cryptKey;

}

public string Encrypt(string inputText)

{

var outputText = string.Empty;

var fullAlphabet = ALPHABET + ALPHABET.ToLower();

var fullAlphabetLength = fullAlphabet.Length;

foreach (var ch in inputText)

{

var index = fullAlphabet.IndexOf(ch);

if (index < 0)

{

outputText += ch;

}

else

{

outputText += fullAlphabet[(fullAlphabetLength + index + cryptKey) % fullAlphabetLength];

}

}

return outputText;

}

}

}

namespace Project

{

public static class FrequentCounter

{

const string ALPHABET = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя";

public static Dictionary<char, double> countAppearencesOfLetter(string text)

{

var freqDict = new Dictionary<char,double>(ALPHABET.Length);

var lowerText = text.ToLower();

foreach (var ch in ALPHABET)

{

freqDict[ch] = 0;

}

foreach (var letter in lowerText)

{

if (ALPHABET.Contains(letter.ToString()))

{

var counter = lowerText.Count(ch => ch == letter);

freqDict[letter] = Math.Round(((double)counter / lowerText.Length) * 100,2);

}

}

return freqDict;

}

}

}

public interface ICryptable

{

string Encrypt(string inputText);

}

public class MonoEncoder: ICryptable

{

const string ALPHABET = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя";

private const string REVERSE_ALPHABET = "ЯЮЭЬЫЪЩШЧЦХФУТСРПОНМЛКЙИЗЖЁЕДГВБАяюэьыъщшчцхфутсрпонмлкйизжёедгвба";

private static Dictionary<char, char> cryptAlphabet;

public string Encrypt(string inputText)

{

string outputText = string.Empty;

foreach (var ch in inputText)

{

var index = ALPHABET.IndexOf(ch);

outputText += index < 0 ? ch: REVERSE_ALPHABET.ToCharArray()[index];

}

return outputText;

}

public string Decrypt(string inputText)

{

string outputText = string.Empty;

foreach (var ch in inputText)

{

var index = REVERSE_ALPHABET.IndexOf(ch);

outputText += index < 0 ? ch: ALPHABET.ToCharArray()[index];

}

return outputText;

}

}

public class TritemiusEncoder: ICryptable

{

private string _cryptWord;

const string ALPHABET = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ";

public TritemiusEncoder(string key)

{

if (key == string.Empty) _cryptWord = "тритемиус";

else _cryptWord = key;

}

public string Encrypt(string inputText)

{

var outputText = string.Empty;

var fullAlphabet = ALPHABET + ALPHABET.ToLower();

var fullAlphabetLength = fullAlphabet.Length;

for (int i = 0; i < inputText.Length; i++)

{

var ch = inputText[i];

var index = fullAlphabet.IndexOf(ch);

if (index < 0)

{

outputText += ch;

}

else

{

var charInKey = _cryptWord[i % _cryptWord.Length];

outputText += fullAlphabet[(index + fullAlphabet.IndexOf(charInKey)) % fullAlphabetLength];

}

}

return outputText;

}

public string Decrypt(string inputText)

{

var outputText = string.Empty;

var fullAlphabet = ALPHABET + ALPHABET.ToLower();

var fullAlphabetLength = fullAlphabet.Length;

for (int i = 0; i < inputText.Length; i++)

{

var ch = inputText[i];

var index = fullAlphabet.IndexOf(ch);

if (index < 0)

{

outputText += ch;

}

else

{

var charInKey = _cryptWord[i % _cryptWord.Length];

outputText += fullAlphabet[((index + fullAlphabetLength) - fullAlphabet.IndexOf(charInKey)) % fullAlphabetLength];

}

}

return outputText;

}

}

}

public partial class MainForm: Form

{

Dictionary<char, double> _primaryDict = new Dictionary<char, double>

{

{ 'о', 10.98},

{ 'е', 8.45 },

{ 'а', 8.01 },

{ 'и', 7.37 },

{ 'н', 6.70 },

{ 'т', 6.32 },

{ 'с', 5.47 },

{ 'р', 4.75},

{ 'в', 4.54 },

{ 'л', 4.34},

{ 'к', 3.49},

{ 'м', 3.21},

{ 'д', 2.98},

{ 'п', 2.81},

{ 'у', 2.62},

{ 'я', 2.01},

{ 'ы', 1.90},

{ 'ь', 1.74},

{ 'г', 1.69},

{ 'з', 1.64},

{ 'б', 1.59},

{ 'ч', 1.45},

{ 'й', 1.21},

{ 'х', 0.97},

{ 'ж', 0.94},

{ 'ш', 0.72},

{ 'ю', 0.64},

{ 'ц', 0.49},

{ 'щ', 0.36},

{ 'э', 0.33},

{ 'ф', 0.27},

{ 'ъ', 0.04},

{ 'ё', 0.02}

};

public MainForm()

{

InitializeComponent();

caesarKeyInput.Maximum = 32;

caesarKeyInput.Minimum = 1;

}

private void btnEncrypt_Click(object sender, EventArgs e)

{

if (radioBtnMonoEncoding.Checked)

{

outputTextBox.Text = new MonoEncoder().Encrypt(inputTextBox.Text);

}

if (radioBtnCaesarEncoding.Checked)

{

outputTextBox.Text = new CaesarEncoder((int)caesarKeyInput.Value).Encrypt(inputTextBox.Text);

}

if (radioBtnTritemiusEncoding.Checked)

{

outputTextBox.Text = new TritemiusEncoder(tritemiusWordInput.Text).Encrypt(inputTextBox.Text);

}

}

private void enableCryptButton(object sender, EventArgs e)

{

if (inputTextBox.Text != string.Empty &&

(radioBtnCaesarEncoding.Checked || radioBtnMonoEncoding.Checked || radioBtnTritemiusEncoding.Checked))

{

btnDecrypt.Enabled = true;

btnEncrypt.Enabled = true;

}

else

{

btnDecrypt.Enabled = false;

btnEncrypt.Enabled = false;

}

}

private void btnLoadTextFromFile_Click(object sender, EventArgs e)

{

var explorer = new OpenFileDialog();

if (explorer.ShowDialog() == DialogResult.OK)

{

var textFromFile = File.ReadAllText(explorer.FileName,Encoding.UTF8);

inputTextBox.Text = textFromFile;

}

}

private void btnSaveTextToFile_Click(object sender, EventArgs e)

{

var explorer = new OpenFileDialog();

if (explorer.ShowDialog() == DialogResult.OK)

{

File.WriteAllText(explorer.FileName, outputTextBox.Text);

MessageBox.Show($"Файл {explorer.FileName} успешно сохранен!", "Success", MessageBoxButtons.OK);

outputTextBox.Text = string.Empty;

}

}

private void outputTextBox_TextChanged(object sender, EventArgs e)

{

if (outputTextBox.Text != string.Empty)

{

btnSaveTextToFile.Enabled = true;

btnShowFrequencyDictionaryForOutputText.Enabled = true;

}

else

{

btnSaveTextToFile.Enabled = false;

btnShowFrequencyDictionaryForOutputText.Enabled = false;

}

}

private void btnShowFrequencyDictionaryForOutputText_Click(object sender, EventArgs e)

{

new FrequentDictForm(FrequentCounter.countAppearencesOfLetter(outputTextBox.Text)).Show();

}

private void caesarKeyInput_TextChanged(object sender, EventArgs e)

{

int inputKey;

if (int.TryParse(sender.ToString().Substring(sender.ToString().LastIndexOf(" ")), out inputKey))

{

if (inputKey > 0 && inputKey < 10)

{

caesarKeyInput.Text = inputKey.ToString();

return;

}

}

caesarKeyInput.Text = string.Empty;

}

private void btnDecrypt_Click(object sender, EventArgs e)

{

inputTextBox.Text = outputTextBox.Text;

if (radioBtnMonoEncoding.Checked)

{

outputTextBox.Text = new MonoEncoder().Decrypt(inputTextBox.Text);

}

if (radioBtnCaesarEncoding.Checked)

{

Dictionary<int, double> sumArray = new Dictionary<int, double>();

for (int i = 1; i < _primaryDict.Keys.Count; i++)

{

var decryptText = new CaesarEncoder(-i).Encrypt(inputTextBox.Text);

double value;

sumArray[i] = decryptText.ToLower().Sum(ch => _primaryDict.TryGetValue(ch, out value) ? value: 0);

}

var caesarKey = sumArray.OrderByDescending(x => x.Value).First().Key;

MessageBox.Show($"Ключ шифрования: {caesarKey}", "Success", MessageBoxButtons.OK);

outputTextBox.Text = new CaesarEncoder(caesarKey * (-1)).Encrypt(inputTextBox.Text);

}

if (radioBtnTritemiusEncoding.Checked)

{

outputTextBox.Text = new TritemiusEncoder(tritemiusWordInput.Text).Decrypt(inputTextBox.Text);

}

}

private void MainForm_Load(object sender, EventArgs e)

{

}

}

}

public partial class FrequentDictForm: Form

{

Dictionary<char, double> _primaryDict = new Dictionary<char, double>

{

{ 'о', 10.98},

{ 'е', 8.45 },

{ 'а', 8.01 },

{ 'и', 7.37 },

{ 'н', 6.70 },

{ 'т', 6.32 },

{ 'с', 5.47 },

{ 'р', 4.75},

{ 'в', 4.54 },

{ 'л', 4.34},

{ 'к', 3.49},

{ 'м', 3.21},

{ 'д', 2.98},

{ 'п', 2.81},

{ 'у', 2.62},

{ 'я', 2.01},

{ 'ы', 1.90},

{ 'ь', 1.74},

{ 'г', 1.69},

{ 'з', 1.64},

{ 'б', 1.59},

{ 'ч', 1.45},

{ 'й', 1.21},

{ 'х', 0.97},

{ 'ж', 0.94},

{ 'ш', 0.72},

{ 'ю', 0.64},

{ 'ц', 0.49},

{ 'щ', 0.36},

{ 'э', 0.33},

{ 'ф', 0.27},

{ 'ъ', 0.04},

{ 'ё', 0.02}

};

public FrequentDictForm(Dictionary<char,double> dataSource)

{

InitializeComponent();

var i = 1;

dataGridFreqDict.DataSource =

(from pair in dataSource orderby pair.Value descending select new { indexColumn = i++, letterColumn = pair.Key, countColumn = pair.Value}).ToList();

i = 1;

dataGridPrimaryFreqDict.DataSource =

(from pair in _primaryDict orderby pair.Value descending select new { indexColumn = i++, letterColumn = pair.Key, countColumn = pair.Value }).ToList();

dataGridFreqDict.Columns[0].HeaderText = "Поряд.номер";

dataGridFreqDict.Columns[1].HeaderText = "Буква";

dataGridFreqDict.Columns[2].HeaderText = "Частота появления в %";

dataGridPrimaryFreqDict.Columns[0].HeaderText = "Поряд.номер";

dataGridPrimaryFreqDict.Columns[1].HeaderText = "Буква";

dataGridPrimaryFreqDict.Columns[2].HeaderText = "Частота появления в %";

}

private void DataGridFreqDict_CellContentClick(object sender, DataGridViewCellEventArgs e)

{

}

}

}

4.4 Описание основных модулей программы

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

1. Интерфейс ICryptable - общий интерфейс для всех алгоритмов шифрования, содержащий метод Encrypt(), отвечающий непосредственно за процесс шифрования.

2. Класс CeaserEncoder - реализует интерфейс ICryptable, отвечает за шефрование и дешифрование методом Цезаря.

3. Класс MonoEncoder - реализует интерфейс ICryptable, отвечает за шефрование и дешифрование методом моноалфавитной подстановки.

4. Класс TritemiusEncoder - реализует интерфейс ICryptable, отвечает за шефрование и дешифрование методом Тритемиуса.

5. Класс FrequentCounter - осуществляет подсчет частоты употребления букв в шифруемых текстах.

Графическая часть системы реализована в классах MainForm и FrequientDictForm. В данных классах также осуществляется обработка событий при взаимодействии пользователя с системой.

5. Тестирование программно-информационной системы

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

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

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

Заключение

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

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

2. Возможность шифрования текста любым из представленных алгоритмов.

3. Возможность дешифровки текста для каждого из алгоритмов.

4. Возможность чтения данных для шифрования из файла.

5. Возможность сохранения результатов шифрования в файл.

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

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

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

...

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

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