Классические шифры подстановки. Лабораторная работа 1. Классические шифры подстановки
Скачать 0.56 Mb.
|
Лабораторная работа №1. Классические шифры подстановки Цель работы: изучение классических криптографических алгоритмов моноалфавитной и многоалфавитной подстановки; криптоанализ классических шифров на основе гистограмм частот встречаемости символов алфавита; приобретение навыков шифрования информации с использованием простейших методов шифрования. Ход работы: Изначально в среде программирования Visual Studia 2017 с использованием инструмента winForms был разработан дизайн приложения(рис. 1) Рис. 1 – Дизайн приложения “Шифр” В текстовое поле в левой части программы вводится текст, который требуется зашифровать или расшифровать, во втором текстовом поле в правой части программы появляется результат работы алгоритма шифрования/дешифрования, который выбирается одним из двух элементов radioButton. В строке ниже выводится сообщение о том, что нужно ввести в поле параметр сдвига или ключ, под этим сообщением находится строка, в которую данный параметр вводится с клавиатуры. Ниже располагаются две кнопки, каждая из которых отвечает за свой метод в соответствии названию. Класс шифра Цезаря: public class CaesarCipher { //символы русской азбуки const string alfabet = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"; private string CodeEncode(string text, int k) { //добавляем в алфавит маленькие буквы var fullAlfabet = alfabet + alfabet.ToLower(); var letterQty = fullAlfabet.Length; var retVal = ""; for (int i = 0; i < text.Length; i++) { var c = text[i]; var index = fullAlfabet.IndexOf(c); if (index < 0) { //если символ не найден, то добавляем его в неизменном виде retVal += c.ToString(); } else { var codeIndex = (letterQty + index + k) % letterQty; retVal += fullAlfabet[codeIndex]; } } return retVal; } //шифрование текста public string Encrypt(string plainMessage, int key) => CodeEncode(plainMessage, key); //дешифрование текста public string Decrypt(string encryptedMessage, int key) => CodeEncode(encryptedMessage, -key); } Класс шифра Виженера: public class VigenereCipher { const string defaultAlphabet = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя"; readonly string letters = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя"; /* public VigenereCipher(string alphabet = null) { letters = string.IsNullOrEmpty(alphabet) ? defaultAlphabet : alphabet; } */ //генерация повторяющегося пароля private string GetRepeatKey(string s, int n) { var p = s; while (p.Length < n) { p += p; } return p.Substring(0, n); } private string Vigenere(string text, string password, bool encrypting = true) { var gamma = GetRepeatKey(password, text.Length); var retValue = ""; var q = letters.Length; for (int i = 0; i < text.Length; i++) { var letterIndex = letters.IndexOf(text[i]); var codeIndex = letters.IndexOf(gamma[i]); if (letterIndex < 0) { //если буква не найдена, добавляем её в исходном виде retValue += text[i].ToString(); } else { retValue += letters[(q + letterIndex + ((encrypting ? 1 : -1) * codeIndex)) % q].ToString(); } } return retValue; } //шифрование текста public string Encrypt(string plainMessage, string password) => Vigenere(plainMessage, password); //дешифрование текста public string Decrypt(string encryptedMessage, string password) => Vigenere(encryptedMessage, password, false);} Рис. 2 - Демонстрация работы Шифра Цезаря Рис. 3 – Демонстрация работы Шифра Виженера По снимкам экрана видно, что программа игнорирует знаки пунктуации и заглавные буквы в шифре Виженера. Это происходит от того, что они отсутствуют в алфавите в коде программы. Вывод: были изучены шифры подстановки, разработана программа позволяющая проводить шифрование и дешифрование текста. Для повышения эффективности программы можно добавить в алфавит дополнительные символы, включить в него латинские буквы. Для упрощения работы с программой можно добавить возможность чтения и записи текста из файла и обработку исключений. |