Дешифратор Цезаря в c#. Как сделать дешифратор в этой ситуации? Сейчас он просто выдает прошлое зашифрованное слово либо ничего

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace Cezar
{
    class Program
    {
        static void Main()
        {
            int n = 1, key = 1;
            string s1 = "";
            string alfphabet = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя";
            int m = alfphabet.Length;
            //Цикл для повтора задачи
            do
            {
                //Переменная выбора шифрования/дешифрования
                uint k = 0;
                //Вывод сообщения на экран
                Console.WriteLine("Введите 1 для шифрования или 2 для дешифрования");
                //Считывание переменной выбора, пока она не станет равной 1 или 2
                while ((k != 1) && (k != 2))
                {
                    //Считывание переменной k, если введенные данные имеют тип uint
                    uint.TryParse(Console.ReadLine(), out k);
                    //Вывод сообщения об ошибке, если k != 1 или k != 2
                    if ((k != 1) && (k != 2))
                        Console.WriteLine("Ошибка ввода, повторите попытку");
                }
                //Если было выбрано шифрование
                if (k == 1)
                {
                    Console.WriteLine("Введите слово,которое нужно зашифровать:");
                    string s = Console.ReadLine();
                    Console.WriteLine("Введите ключ:");
                    key = Convert.ToInt32(Console.ReadLine());
                    for (int i = 0; i < s.Length; i++)
                    {
                        for (int j = 0; j < alfphabet.Length; j++)
                        {
                            if (s[i] == alfphabet[j])
                            {
                                int temp = j * n + key;

                                while (temp >= m)
                                    temp -= m;

                                s1 = s1 + alfphabet[temp];
                            }
                        }
                    }
                    Console.WriteLine("Зашифрованное слово:" + s1);
                    Console.ReadLine();
                }
                    //Если было выбрано дешифрование
                    if (k == 2)
                {
                    string str = null;
                    for (int i = 0; i < s1.Length; i++)
                    {
                        for (int j = 0; j < alfphabet.Length; j++)
                        {
                            if (s1[i] == alfphabet[j])
                            {
                                if ((j - key) >= 0)
                                    str += alfphabet[j - key];
                                else
                                    str += alfphabet[m + j - key];
                            }
                        }
                    }
                    Console.WriteLine("Дешифрованное слово:" + str);
                }
                Console.WriteLine("Для выхода из программы нажмите Escape");
            } while (Console.ReadKey(true).Key != ConsoleKey.Escape);
        }
    }
}

Ответы (1 шт):

Автор решения: Mark Shcerbakov

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

// Кодируем
static string CaesarEncode(string s, int key)
{
    string alphabet = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя";
    string result = "";
    int lettersNumber = alphabet.Length;

    for (int i = 0; i < s.Length; i++)
    {
        result += alphabet[(alphabet.IndexOf(s[i]) + key) % lettersNumber];
    }

    return result;
}

// Декодируем
static string CaesarDecode(string s, int key)
{
    string alphabet = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя";
    int lettersNumber = alphabet.Length;
    string result = "";

    for (int i = 0; i < s.Length; i++)
    {
        result += alphabet[((alphabet.IndexOf(s[i]) - key) % lettersNumber + lettersNumber) % lettersNumber];
    }

    return result;
}

Отредактированный рабочий код автора:

//Если было выбрано дешифрование
if (k == 2)
{
    Console.WriteLine("Введите слово,которое нужно расшифровать:");
    string s = Console.ReadLine();
    Console.WriteLine("Введите ключ:");
    key = Convert.ToInt32(Console.ReadLine());
    string str = "";
    for (int i = 0; i < s.Length; i++)
    {
        for (int j = 0; j < alfphabet.Length; j++)
        {
            if (s[i] == alfphabet[j])
            {
                if ((j - key) >= 0)
                    str += alfphabet[j - key];
                else
                    str += alfphabet[m + j - key];
            }
        }
    }
    Console.WriteLine("Дешифрованное слово:" + str);
}
→ Ссылка