Шифрование методом двойной перестановки - C#
Формулировка задачи:
Нужно разработать которая производила бы шифрование предложения, введённого пользователем методом двойной перестановки. При этом на рабочем поле программы должны отображаться: исходная фраза, таблица, с помощью которой осуществлялось шифрование, ключ шифрования и зашифрованная фраза.
Решение задачи: «Шифрование методом двойной перестановки»
textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Linq;
namespace TestConsole
{
/// <summary>
/// Класс который содержит символ и его порядковый номер в строке, зависящий от алфавита.
/// </summary>
class CharNum
{
#region Fields
/// <summary>
/// Символ.
/// </summary>
private char _ch;
/// <summary>
/// Порядковый номер зависящий от алфавита.
/// </summary>
private int _numberInWord;
#endregion Fieds
#region Properties
/// <summary>
/// Символ.
/// </summary>
public char Ch
{
get { return _ch; }
set
{
if (_ch == value)
return;
_ch = value;
}
}
/// <summary>
/// Порядковый номер в строке, зависящий от алфавита.
/// </summary>
public int NumberInWord
{
get { return _numberInWord; }
set
{
if (_numberInWord == value)
return;
_numberInWord = value;
}
}
#endregion Properties
}
class Program
{
static void Main(string[] args)
{
// Первый ключ, количество столбцов
string firstKey = "Сканер";
// Второй ключ, количество строк
string secondKey = "Надо";
// Предложение которое шифруем
string stringUser = "Системный пароль изменен";
// Матрица в которой производим шифрование
char[,] matrix = new char[secondKey.Length, firstKey.Length];
// Счетчик символов в строке
int countSymbols = 0;
// Переводим строки в массивы типа char
char[] charsFirstKey = firstKey.ToCharArray();
char[] charsSecondKey = secondKey.ToCharArray();
char[] charStringUser = stringUser.ToCharArray();
// Создаем списки в которых будут храниться символы и порядковы номера символов
List<CharNum> listCharNumFirst =
new List<CharNum>(firstKey.Length);
List<CharNum> listCharNumSecond =
new List<CharNum>(secondKey.Length);
// Заполняем символами из ключей
listCharNumFirst = FillListKey(charsFirstKey);
listCharNumSecond = FillListKey(charsSecondKey);
// Заполняем порядковыми номерами
listCharNumFirst = FillingSerialsNumber(listCharNumFirst);
listCharNumSecond = FillingSerialsNumber(listCharNumSecond);
ShowKey(listCharNumFirst, "Первый ключ: ");
ShowKey(listCharNumSecond, "Второй ключ: ");
// Заполнение матрицы строкой пользователя
for (int i = 0; i < listCharNumSecond.Count; i++)
{
for(int j = 0; j < listCharNumFirst.Count; j++)
{
matrix[i, j] = charStringUser[countSymbols++];
}
}
ShowMatrix(matrix, "Первоначальное значение: ");
countSymbols = 0;
// Заполнение матрицы с учетом шифрования.
// Переставляем столбцы по порядку следования в первом ключе.
// Затем переставляем строки по порядку следования во втором ключа.
for(int i = 0; i < listCharNumSecond.Count; i++)
{
for(int j = 0; j < listCharNumFirst.Count; j++)
{
matrix[listCharNumSecond[i].NumberInWord,
listCharNumFirst[j].NumberInWord] = charStringUser[countSymbols++];
}
}
ShowMatrix(matrix, "Зашифрованное значение: ");
Console.ReadKey();
}
#region Methods
/// <summary>
/// Возвращает порядковый номер символа по алфавиту.
/// </summary>
/// <param name="s">Символ, чей порядковый номер, необходимо узнать.</param>
/// <returns></returns>
public static int GetNumberInThealphabet(char s)
{
string str = @"АаБбВвГгДдЕеЁёЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЪъЫыЬьЭэЮюЯя";
int number = str.IndexOf(s) / 2;
return number;
}
/// <summary>
/// Заполнение символами списка с ключом.
/// </summary>
/// <param name="chars">массив символов.</param>
/// <returns>Список символов.</returns>
public static List<CharNum> FillListKey(char[] chars)
{
List<CharNum> listKey = new List<CharNum>(chars.Length);
for (int i = 0; i < chars.Length; i++)
{
CharNum charNum = new CharNum()
{
Ch = chars[i],
NumberInWord = GetNumberInThealphabet(chars[i])
};
listKey.Add(charNum);
}
return listKey;
}
/// <summary>
/// Отображение ключа.
/// </summary>
/// <param name="listCharNum">Список в котором содержатся символы с порядковыми номерами.</param>
public static void ShowKey(List<CharNum> listCharNum, string message)
{
Console.WriteLine(message);
foreach (var i in listCharNum)
{
Console.Write(i.Ch + " ");
}
Console.WriteLine();
foreach (var i in listCharNum)
{
Console.Write(i.NumberInWord + " ");
}
Console.WriteLine();
Console.WriteLine();
}
/// <summary>
/// Заполнение символов ключей, порядковыми номерами.
/// </summary>
/// <param name="listCharNum"></param>
/// <returns></returns>
public static List<CharNum> FillingSerialsNumber(
List<CharNum> listCharNum)
{
int count = 0;
var result = listCharNum.OrderBy(a =>
a.NumberInWord);
foreach (var i in result)
{
i.NumberInWord = count++;
}
return listCharNum;
}
/// <summary>
/// Отображение матрицы.
/// </summary>
/// <param name="matrix">Матрица с символами.</param>
public static void ShowMatrix(char[,] matrix, string message)
{
Console.WriteLine(message);
for(int i = 0; i < matrix.GetLength(0); i++)
{
for(int j = 0; j < matrix.GetLength(1); j++)
{
Console.Write(matrix[i, j] + " ");
}
Console.WriteLine();
}
Console.WriteLine();
Console.WriteLine();
}
#endregion Methods
}
}