Выполнил студент гр.2181121 Гатин Р.К. Лабораторная работа №1 Цель работы: освоить метод шифрования перестановочным шифром 1 1 2 2 Рисунок 1 - алгоритм для шифрования и дешифрования сообщений горизонтальным перестановочным шифром для реализации на языке программирования C#. Рисунок 2 - алгоритм для шифрования и дешифрования сообщений горизонтальным перестановочным шифром. Листинг программы: using System; namespace HorizontalPlaceChangingCipher { class Program { static void Main(string[] args) { Console.BackgroundColor = (System.ConsoleColor)15; Console.ForegroundColor = 0; Console.Clear(); //Этап ввода сообщения и ключа зашифровки Console.WriteLine("Введите сообщение для зашифровки"); string msgFirst = Console.ReadLine(); Console.WriteLine("Введите ключ"); string key = Console.ReadLine(); char[,] indexedkey = new char[2, key.Length]; //удаление пробелов string msg = ""; for (int i = 0; i < msgFirst.Length; i++) { if (msgFirst[i]!=' ') { msg=msg+msgFirst[i]; } } int countKey = key.Length; int countMsg = msg.Length; int countLines; // Проверка количества строк (если последняя строка неполная - то берём 3 // 1-строка ключ, и последняя строка будет утеряна из-за целочисленного деления, // иначе, если последняя строка будет полной, то добавляем только две строки для ключа) if ((countMsg % countKey) != 0) { countLines = countMsg / countKey + 3; } else { countLines = countMsg / countKey + 2; } char[,] keyAndMsg = new char[countLines, countKey]; //цикл для ввода ключа в массив for (int j = 0; j<countKey; j++) { indexedkey[0, j] = key[j]; indexedkey[1, j] = (char)(j+100); } for (int j = 0; j < countKey; j++) { keyAndMsg[0, j] = indexedkey[0, j]; keyAndMsg[1, j] = indexedkey[1, j]; } Console.WriteLine(); //цикл для вывода сообщения в виде массива //j начинается с "1", поскольку нулевой строкой будет служить ключ int SymbNumb = 0; // SymbNumb - индекс символа в первоначальном сообщении for (int i = 2; i < countLines; i++) { for (int j = 0; j < countKey; j++) { if ((SymbNumb<countMsg)) //проверка на наличие символа (касается последней строки) { keyAndMsg[i, j] = msg[SymbNumb]; } else { keyAndMsg[i, j] = ' '; } SymbNumb++; } } for (int i=0; i < countLines; i++) { for (int j=0; j<countKey; j++) { Console.Write(keyAndMsg[i, j]); } Console.WriteLine(); } Console.WriteLine(); //Переходим к шифрованию - дешифрованию //Шифрование char[,] Cipher = keyAndMsg; for (int i = 0; i < countKey; i++) { for (int j = i + 1; j < countKey; j++) { if (Cipher[0,i].CompareTo(Cipher[0,j])>=0) { for(int k=0; k<countLines; k++) { char temp = Cipher[k,i]; Cipher[k,i] = Cipher[k,j]; Cipher[k,j] = temp; } } } } Console.WriteLine("Результат шифрования (первый набор символов-изменённый ключ)"); for (int i = 0; i < countLines; i++) { for (int j = 0; j < countKey; j++) { if (Cipher[i,j]!=' ') Console.Write(Cipher[i, j]); } Console.Write(" "); } Console.WriteLine(); Console.WriteLine(); //Дешифрование char[,] DeCipher = Cipher; for (int i = 0; i < countKey; i++) { for (int j = i + 1; j < countKey; j++) { if (DeCipher[1, i].CompareTo(DeCipher[1, j])>0) { for (int k = 0; k < countLines; k++) { char temp = DeCipher[k, i]; DeCipher[k, i] = DeCipher[k, j]; DeCipher[k, j] = temp; } } } } Console.WriteLine("Результат дешифрования (первый набор символов-ключ)"); for (int i = 0; i < countLines; i++) { for (int j = 0; j < countKey; j++) { if (DeCipher[i, j] != ' ') Console.Write(DeCipher[i, j]); } Console.Write(" "); } Console.WriteLine(); Console.ReadLine(); } } } Рисунок 3 – выполнение программы. Вывод: при выполнении данной лабораторной работы был освоен метод шифрования перестановочным шифром.