Шифрування Цезаря

Шифр Цезаря – один з найбільш простих та широковідомих алгоритмів шифрування текстових даних. Цей метод названий в честь римського полководця Гая Юлія Цезаря, який використовував шифр для приватного листування з підлеглими.

Опис алгоритму

Алгоритм шифрування Цезаря полягає заміні кожного символу вхідного повідомлення на символ, який знаходиться на деякій константній відстані з правої чи лівої сторони. Відстань при цьому називають – ключем.

Наприклад для ключа 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();
    }
}

Результат роботи програми:

Дивіться також: