Шифрование методом Трисемуса - C#

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

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

Здравствуйте. Напишу здесь алгоритм шифрования, чтобы было понятней: Выбирается размерность таблицы. В таблицу вписывается ключевое слово, удаляя повторяющиеся буквы(оставляя первые). Затем таблица дополняется буквами алфавита по порядку исключая буквы из ключевого слова. Для шифрования фразы буква открытого текста заменяется буквой, находящейся ниже нее в том же столбце. Так вот. Таблицу с алфавитом я сделал, повторяющиеся буквы из ключа удалил. Не знаю как в таблицу сначала вписать ключ, а затем алфавит. Нужен хелп).
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string s ; 
            string result; 
            string key ;
            int n, m;

            Console.WriteLine("Введите размерность таблицы");
            n = Convert.ToInt32(Console.ReadLine());
            m = Convert.ToInt32(Console.ReadLine());
 
            char[,] mas = new char[n, m];
            
            //Заполняем таблицу алфавитом
            for (char i = 'А'; i <= 'Я'; i++)
                mas[(i - 'А') / m, (i - 'А') % m] = i;
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < m; j++)
                    Console.Write(mas[i, j] + " ");
                Console.WriteLine();
            }

            Console.WriteLine("Введите сообщение");
            s = Console.ReadLine();
 
            Console.WriteLine("Введите ключ");
            key = Console.ReadLine();

          key = new string(key.Distinct().ToArray()); //Удаляем повторения в ключе.
            Console.WriteLine("Ключ без повторяющихся смиволов: "+key);
 
            Console.ReadKey();
 
        }
    }
}

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

textual
Листинг программы
char[] alphabet = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ ,.".ToCharArray();
 
// Пытаемся вычислить размерность таблицы
Console.WriteLine("Символов в алфавите: " + alphabet.Length);
int rows = 0, columns;
bool isValidTable;
do
{
    Console.Write("Количество колонок в таблице: ");
    isValidTable = int.TryParse(Console.ReadLine(), out columns) && columns > 1;
    if (!isValidTable)
    {
        Console.WriteLine("Необходимо ввести число больше 1");
    }
    else
    {
        rows = alphabet.Length / columns;
        isValidTable &= rows > 1 && rows * columns == alphabet.Length;
        if (!isValidTable)
        {
            Console.WriteLine("Необходимо ввести число колонок таким образом, чтобы число строк таблицы было больше 1 и таблица могла вмещать в себе все символы алфавита");
        }
    }
}
while (!isValidTable);
 
// Пытаемся получить ключевое слово
char[] keyWord;
bool isValidKeyWord;
do
{
    Console.Write("Введите ключевое слово: ");
    keyWord = Console.ReadLine().ToUpper().Distinct().ToArray();
    isValidKeyWord = keyWord.Length > 0 && keyWord.Length <= alphabet.Length;
    if (!isValidKeyWord)
    {
        Console.WriteLine("Ключевое слово не может быть пустой строкой или содержать число уникальных символов больше размера алфавита");
    }
    else
    {
        isValidKeyWord &= !keyWord.Except(alphabet).Any();
        if (!isValidKeyWord)
        {
            Console.WriteLine("Ключевое слово не может содержать символы, которых нет в алфавите");
        }
    }
}
while (!isValidKeyWord);
 
// Создаем таблицу
var table = new char[rows, columns];
 
// Вписываем в нее ключевое слово
for (var i = 0; i < keyWord.Length; i++)
{
    table[i / columns, i % columns] = keyWord[i];
}
 
// Исключаем уникальные символы ключевого слова из алфавита
alphabet = alphabet.Except(keyWord).ToArray();
 
// Вписываем алфавит
for (var i = 0; i < alphabet.Length; i++)
{
    int position = i + keyWord.Length;
    table[position / columns, position % columns] = alphabet[i];
}
 
// Получаем сообщение, которое необходимо зашифровать
string message;
bool isValidMessage;
do
{
    Console.Write("Введите сообщение: ");
    message = Console.ReadLine().ToUpper();
    isValidMessage = !string.IsNullOrEmpty(message);
    if (!isValidMessage)
    {
        Console.WriteLine("Сообщение не может быть пустой строкой");
    }
}
while (!isValidMessage);
 
// Создаем место для будущего зашифрованного сообщения
var result = new char[message.Length];
 
// Шифруем сообщение
for (var k = 0; k < message.Length; k++)
{
    char symbol = message[k];
    // Пытаемся найти символ в таблице
    for (var i = 0; i < rows; i++)
    {
        for (var j = 0; j < columns; j++)
        {
            if (symbol == table[i, j])
            {
                symbol = table[(i + 1) % rows, j]; // Смещаемся циклически на следующую строку таблицы и запоминаем новый символ
                i = rows; // Завершаем цикл по строкам
                break; // Завершаем цикл по колонкам
            }
        }
    }
    // Записываем найденный символ
    result[k] = symbol;
}
 
// Выводим зашифрованное сообщение
Console.WriteLine("Зашифрованное сообщение: " + new string(result));

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


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

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

12   голосов , оценка 3.917 из 5