Uploaded by cobinek769

Отчёт 1

advertisement
Выполнил студент гр.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 – выполнение программы.
Вывод: при выполнении данной лабораторной работы был освоен метод
шифрования перестановочным шифром.
Download