Вы находитесь на странице: 1из 8

Выполнил студент гр.

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 – выполнение программы.

Вывод: при выполнении данной лабораторной работы был освоен


метод шифрования перестановочным шифром.

Вам также может понравиться