Шифрование методом двойной перестановки - C#

Узнай цену своей работы

Формулировка задачи:

Нужно разработать которая производила бы шифрование предложения, введённого пользователем методом двойной перестановки. При этом на рабочем поле программы должны отображаться: исходная фраза, таблица, с помощью которой осуществлялось шифрование, ключ шифрования и зашифрованная фраза.

Решение задачи: «Шифрование методом двойной перестановки»

textual
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4.  
  5. namespace TestConsole
  6. {  
  7.     /// <summary>
  8.     /// Класс который содержит символ и его порядковый номер в строке, зависящий от алфавита.
  9.     /// </summary>
  10.     class CharNum
  11.     {
  12.         #region Fields
  13.         /// <summary>
  14.         /// Символ.
  15.         /// </summary>
  16.         private char _ch;
  17.         /// <summary>
  18.         /// Порядковый номер зависящий от алфавита.
  19.         /// </summary>
  20.         private int _numberInWord;
  21.         #endregion Fieds
  22.  
  23.         #region Properties
  24.         /// <summary>
  25.         /// Символ.
  26.         /// </summary>
  27.         public char Ch
  28.         {
  29.             get { return _ch; }
  30.             set
  31.             {
  32.                 if (_ch == value)
  33.                     return;
  34.                 _ch = value;
  35.             }
  36.         }
  37.         /// <summary>
  38.         /// Порядковый номер в строке, зависящий от алфавита.
  39.         /// </summary>
  40.         public int NumberInWord
  41.         {
  42.             get { return _numberInWord; }
  43.             set
  44.             {
  45.                 if (_numberInWord == value)
  46.                     return;
  47.                 _numberInWord = value;
  48.             }
  49.         }
  50.         #endregion Properties
  51.     }
  52.  
  53.     class Program
  54.     {
  55.         static void Main(string[] args)
  56.         {  
  57.             // Первый ключ, количество столбцов
  58.             string firstKey = "Сканер";
  59.             // Второй ключ, количество строк
  60.             string secondKey = "Надо";
  61.             // Предложение которое шифруем
  62.             string stringUser = "Системный пароль изменен";
  63.  
  64.             // Матрица в которой производим шифрование
  65.             char[,] matrix = new char[secondKey.Length, firstKey.Length];
  66.  
  67.             // Счетчик символов в строке
  68.             int countSymbols = 0;
  69.  
  70.             // Переводим строки в массивы типа char
  71.             char[] charsFirstKey = firstKey.ToCharArray();
  72.             char[] charsSecondKey = secondKey.ToCharArray();
  73.             char[] charStringUser = stringUser.ToCharArray();
  74.  
  75.             // Создаем списки в которых будут храниться символы и порядковы номера символов
  76.             List<CharNum> listCharNumFirst =
  77.                 new List<CharNum>(firstKey.Length);
  78.  
  79.             List<CharNum> listCharNumSecond =
  80.                 new List<CharNum>(secondKey.Length);
  81.  
  82.             // Заполняем символами из ключей
  83.             listCharNumFirst = FillListKey(charsFirstKey);
  84.             listCharNumSecond = FillListKey(charsSecondKey);
  85.  
  86.             // Заполняем порядковыми номерами
  87.             listCharNumFirst = FillingSerialsNumber(listCharNumFirst);
  88.             listCharNumSecond = FillingSerialsNumber(listCharNumSecond);
  89.  
  90.             ShowKey(listCharNumFirst, "Первый ключ: ");
  91.             ShowKey(listCharNumSecond, "Второй ключ: ");
  92.            
  93.             // Заполнение матрицы строкой пользователя
  94.             for (int i = 0; i < listCharNumSecond.Count; i++)
  95.             {
  96.                 for(int j = 0; j < listCharNumFirst.Count; j++)
  97.                 {
  98.                     matrix[i, j] = charStringUser[countSymbols++];
  99.                 }
  100.             }
  101.  
  102.             ShowMatrix(matrix, "Первоначальное значение: ");
  103.          
  104.             countSymbols = 0;
  105.             // Заполнение матрицы с учетом шифрования.
  106.             // Переставляем столбцы по порядку следования в первом ключе.
  107.             // Затем переставляем строки по порядку следования во втором ключа.
  108.             for(int i = 0; i < listCharNumSecond.Count; i++)
  109.             {
  110.                 for(int j = 0; j < listCharNumFirst.Count; j++)
  111.                 {
  112.                     matrix[listCharNumSecond[i].NumberInWord,
  113.                        listCharNumFirst[j].NumberInWord] = charStringUser[countSymbols++];
  114.                 }
  115.             }
  116.  
  117.             ShowMatrix(matrix, "Зашифрованное значение: ");
  118.  
  119.             Console.ReadKey();
  120.         }
  121.  
  122.         #region Methods
  123.         /// <summary>
  124.         /// Возвращает порядковый номер символа по алфавиту.
  125.         /// </summary>
  126.         /// <param name="s">Символ, чей порядковый номер, необходимо узнать.</param>
  127.         /// <returns></returns>
  128.         public static int GetNumberInThealphabet(char s)
  129.         {
  130.             string str = @"АаБбВвГгДдЕеЁёЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЪъЫыЬьЭэЮюЯя";
  131.  
  132.             int number = str.IndexOf(s) / 2;
  133.  
  134.             return number;
  135.         }
  136.  
  137.         /// <summary>
  138.         /// Заполнение символами списка с ключом.
  139.         /// </summary>
  140.         /// <param name="chars">массив символов.</param>
  141.         /// <returns>Список символов.</returns>
  142.         public static List<CharNum> FillListKey(char[] chars)
  143.         {
  144.             List<CharNum> listKey = new List<CharNum>(chars.Length);
  145.  
  146.             for (int i = 0; i < chars.Length; i++)
  147.             {
  148.                 CharNum charNum = new CharNum()
  149.                 {
  150.                     Ch = chars[i],
  151.                     NumberInWord = GetNumberInThealphabet(chars[i])
  152.                 };
  153.  
  154.                 listKey.Add(charNum);
  155.             }
  156.             return listKey;
  157.         }
  158.         /// <summary>
  159.         /// Отображение ключа.
  160.         /// </summary>
  161.         /// <param name="listCharNum">Список в котором содержатся символы с порядковыми номерами.</param>
  162.         public static void ShowKey(List<CharNum> listCharNum, string message)
  163.         {
  164.             Console.WriteLine(message);
  165.  
  166.             foreach (var i in listCharNum)
  167.             {
  168.                 Console.Write(i.Ch + " ");
  169.             }
  170.             Console.WriteLine();
  171.  
  172.             foreach (var i in listCharNum)
  173.             {
  174.                 Console.Write(i.NumberInWord + " ");
  175.             }
  176.             Console.WriteLine();
  177.             Console.WriteLine();
  178.         }
  179.         /// <summary>
  180.         /// Заполнение символов ключей, порядковыми номерами.
  181.         /// </summary>
  182.         /// <param name="listCharNum"></param>
  183.         /// <returns></returns>
  184.         public static List<CharNum> FillingSerialsNumber(
  185.             List<CharNum> listCharNum)
  186.         {
  187.             int count = 0;
  188.  
  189.             var result = listCharNum.OrderBy(a =>
  190.                 a.NumberInWord);
  191.  
  192.             foreach (var i in result)
  193.             {
  194.                 i.NumberInWord = count++;
  195.             }
  196.  
  197.             return listCharNum;
  198.         }
  199.         /// <summary>
  200.         /// Отображение матрицы.
  201.         /// </summary>
  202.         /// <param name="matrix">Матрица с символами.</param>
  203.         public static void ShowMatrix(char[,] matrix, string message)
  204.         {
  205.             Console.WriteLine(message);
  206.             for(int i = 0; i < matrix.GetLength(0); i++)
  207.             {
  208.                 for(int j = 0; j < matrix.GetLength(1); j++)
  209.                 {
  210.                     Console.Write(matrix[i, j] + " ");
  211.                 }
  212.                 Console.WriteLine();
  213.             }
  214.             Console.WriteLine();
  215.             Console.WriteLine();
  216.         }
  217.  
  218.         #endregion Methods
  219.     }
  220.  
  221. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.125 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут