Шифры подстановки
Алгоритм моноалавитной подстановки. Проектирование программного модуля. Составление сценария взаимодействия. Разработка алгоритмов и интерфейса взаимодействия с пользователем. Программная реализация информационной системы. Выбор используемых технологий.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 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
...Подобные документы
Разработка функциональной и структурной схемы программного средства. Реализация основного модуля программы. Реализация модуля печати и модуля обновлений. Изучение взаимодействия информационных технологий, методов их интеграции и обмена данными.
дипломная работа [3,2 M], добавлен 27.10.2017Выбор технологии, языка и среды программирования. Анализ процесса обработки информации и выбор структур данных для ее хранения, разработка основных алгоритмов. Проектирование интерфейса пользователя. Выбор стратегии тестирования и разработка тестов.
курсовая работа [332,3 K], добавлен 09.12.2014Проектирование программного модуля: сбор исходных материалов; описание входных и выходных данных; выбор программного обеспечения. Описание типов данных и реализация интерфейса программы. Тестирование программного модуля и разработка справочной системы.
курсовая работа [81,7 K], добавлен 18.08.2014Выбор технологии, языка и среды программирования. Анализ процесса обработки информации и оценка структур данных для ее хранения. Разработка основных алгоритмов решения и структурной схемы программного продукта. Проектирование интерфейса пользователя.
курсовая работа [449,8 K], добавлен 14.01.2011Выбор методологии проектирования и разработка информационной системы "Расчёт зарплаты" для предприятия ОАО РТП "Авторемонтник". Архитектурное проектирование базы данных информационной системы и разработка её интерфейса. Тестирование программного модуля.
дипломная работа [2,3 M], добавлен 25.05.2014Структурная диаграмма программного модуля. Разработка схемы программного модуля и пользовательского интерфейса. Реализация программного модуля: код программы; описание использованных операторов и функций. Вид пользовательской формы с заполненной матрицей.
курсовая работа [215,3 K], добавлен 01.09.2010Исследование методов и средств многопоточного взаимодействия, особенности использования блокирующей и неблокирующей синхронизации. Разработка, программная реализация и тестирование структуры данных и алгоритмов чтения, записи, освобождения памяти.
дипломная работа [2,2 M], добавлен 24.06.2012Выбор методологии проектирования информационной системы, сбор требований, их моделирование. Архитектурное проектирование, разработка пользовательского интерфейса и модулей. Реализация и аттестация информационной системы. Методика работы с приложением.
дипломная работа [2,9 M], добавлен 25.05.2014Разработка концептуальной модели базы данных. Реализация алгоритмов и разработка управляющей программы. Разработка структуры системы управления данными. Методика проведения и результаты тестирования. Функционирование разработанного программного модуля.
курсовая работа [550,5 K], добавлен 08.06.2023Моделирование предметной области. Состав программного модуля. Разработка логической структуры единой базы данных банковской информационной системы "БИС". Создание экранных форм для ввода и корректировки информации. Разработка интерфейса пользователя.
курсовая работа [1,8 M], добавлен 17.05.2016Функциональные характеристики программы форматирования текстовых файлов, требования к ее интерфейсу и данным. Схема взаимодействия компонентов системы, выбор среды исполнения и программная реализация алгоритмов. Тестирование и оценка качества программы.
курсовая работа [61,1 K], добавлен 25.07.2012Использование бинарных деревьев для поиска данных. Схемы алгоритмов работы с бинарным деревом. Проектирование алгоритмов и программ. Структура программного комплекса. Язык С# как средство для разработки автоматизированной информационной системы "Адрес".
курсовая работа [914,9 K], добавлен 14.11.2013Целые числа в позиционных системах счисления. Недостатки двоичной системы. Разработка алгоритмов, структур данных. Программная реализация алгоритмов перевода в различные системы счисления на языке программирования С. Тестирование программного обеспечения.
курсовая работа [593,3 K], добавлен 03.01.2015Проектирование информационной системы. Анализ языков программирования и существующих решений для администрирования системы управления базами данных. Разработка модуля взаимодействия и структуры программы. Модули авторизации и соединения с базой данных.
дипломная работа [4,1 M], добавлен 19.07.2014Описание особенностей функционирования магазина. Проектирование системы: инфологическое моделирование и построение диаграммы потоков данных. Моделирование и программная реализация информационной системы. Проектирование пользовательского интерфейса.
курсовая работа [1,6 M], добавлен 18.02.2013Разработка структуры корпоративной информационной системы (иерархия взаимодействия отдельных элементов на программном и аппаратном уровнях). Выбор компьютерного оборудования (клиентские станции, серверы), системного и прикладного программного обеспечения.
курсовая работа [1,8 M], добавлен 13.02.2016Разработка алгоритма поставленной задачи и реализация средствами автоматизированного проектирования. Составление программного продукта на основе готовой спецификации на уровне модуля, проведение его тестирования, использование инструментальных средств.
контрольная работа [257,5 K], добавлен 01.05.2015- Разработка геоинформационного программного обеспечения на базе открытых продуктов для целей кадастра
Исследование современных геоинформационных технологий, анализ их преимуществ и недостатков. Проектирование структуры базы данных, приложения и интерфейса проекта. Программная реализация геоинформационной системы и оценка ее экономической эффективности.
дипломная работа [3,2 M], добавлен 21.06.2012 Характеристика основных потоков данных, существующих на предприятии. Способы и средства для разработки программного обеспечения. Проектирование пользовательского интерфейса. Разработка слоя взаимодействия с базой данных. Разработка слоя бизнес сервисов.
дипломная работа [750,8 K], добавлен 10.07.2017Описание структуры обучающего блока. Проектирование его алгоритма и лингвистического и информационного обеспечения. Организация его взаимодействия с базой данных. Разработка графического интерфейса. Программная реализация основных функций приложения.
дипломная работа [2,1 M], добавлен 20.12.2015