Шифр Цезаря – один из наиболее простых и широко известных алгоритмов шифрования текстовых данных. Этот метод назван в честь римского полководца Гая Юлия Цезаря, который применял шифр для личной переписки с подчиненными.
Описание алгоритма
Алгоритм шифрования Цезаря заключается в замене каждого символа входящего сообщения на символ, который находится на некотором константном расстоянии с правой или левой стороны. Расстояние при этом называют – ключом.
Например для ключа 5 получаем последовательность:
- Русский алфавит:
- А Б В Г Д Е Ё Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я
- Шифр:
- Е Ё Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я А Б В Г Д
То есть А заменяем на Е, Б на Ё, и т. д.
Математически шифр Цезаря можно описать следующими формулами:
- Encrypt(mn) = (Q + mn + k) % Q;
- Decrypt(cn) = (Q + cn - k) % Q.
где m - открытый текст, k - ключ шифрования, Q - количество символов в алфавите, c - зашифрованный текст.
Реализация шифрования Цезаря
using System;
public class CaesarCipher
{
//символы русской азбуки
const string alfabet = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ";
private string CodeEncode(string text, int k)
{
//добавляем в алфавит маленькие буквы
var fullAlfabet = alfabet + alfabet.ToLower();
var letterQty = fullAlfabet.Length;
var retVal = "";
for (int i = 0; i < text.Length; i++)
{
var c = text[i];
var index = fullAlfabet.IndexOf(c);
if (index < 0)
{
//если символ не найден, то добавляем его в неизменном виде
retVal += c.ToString();
}
else
{
var codeIndex = (letterQty + index + k) % letterQty;
retVal += fullAlfabet[codeIndex];
}
}
return retVal;
}
//шифрование текста
public string Encrypt(string plainMessage, int key)
=> CodeEncode(plainMessage, key);
//дешифрование текста
public string Decrypt(string encryptedMessage, int key)
=> CodeEncode(encryptedMessage, -key);
}
class Program
{
static void Main(string[] args)
{
var cipher = new CaesarCipher();
Console.Write("Введите текст: ");
var message = Console.ReadLine();
Console.Write("Введите ключ: ");
var secretKey = Convert.ToInt32(Console.ReadLine());
var encryptedText = cipher.Encrypt(message, secretKey);
Console.WriteLine("Зашифрованное сообщение: {0}", encryptedText);
Console.WriteLine("Расшифрованное сообщение: {0}", cipher.Decrypt(encryptedText, secretKey));
Console.ReadLine();
}
}
Результат работы программы: