Шифр Цезаря – один з найбільш простих та широковідомих алгоритмів шифрування текстових даних. Цей метод названий в честь римського полководця Гая Юлія Цезаря, який використовував шифр для приватного листування з підлеглими.
Опис алгоритму
Алгоритм шифрування Цезаря полягає заміні кожного символу вхідного повідомлення на символ, який знаходиться на деякій константній відстані з правої чи лівої сторони. Відстань при цьому називають – ключем.
Наприклад для ключа 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();
}
}
Результат роботи програми: