Дешифратор Цезаря в 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);
}