Шифрование методом двойной перестановки - 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
    }
 
}

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


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

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

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