Задачи
September 12, 2023

Взлом шифра Цезаря

Шифр Цезаря - это древний алгоритм шифрования, использовавшийся Юлием Цезарем. Он шифрует буквы, сдвигая их на определенное число мест в алфавите. Длину сдвига мы называем ключом. Например, если ключ равен 3, то A становится D, B - E, C - F и так далее.

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

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

Реализация

private void processCeasarHacker(string input)
{
    for (int i = 1; i <= SYMBOLS.Length; i++)
    {
        var decrypted = new StringBuilder();
        foreach (char sym in input)
        {
            if (SYMBOLS.Contains(sym))
            {
                int num = SYMBOLS.IndexOf(sym) - i;

                if (num < 0)
                    num += SYMBOLS.Length;

                decrypted.Append(SYMBOLS[num]);
            }
            else
            {
                decrypted.Append(sym);
            }
        }

        Console.WriteLine(string.Format("Key {0}: {1}", i, decrypted));
    }
}

https://github.com/unilecs/ugames/blob/main/games/CeasarHacker.cs

Play-test

https://dotnetfiddle.net/E9HCmY