Взлом частотным анализом

Главное оружие против классических шифров — статистика. Буквы в языке встречаются неравномерно, и это всё выдаёт.
Это учебная классика: частотный анализ показывает, ПОЧЕМУ простые шифры небезопасны. Мы ломаем собственный шифр, а не чужие системы.

Идея частотного анализа

В любом естественном языке буквы встречаются с разной частотой. В английском чаще всего идут E, T, A, O. В русском — О, Е, А, И. Шифр подстановки не меняет частоты — он только переименовывает буквы. Значит, самая частая буква шифр-текста, скорее всего, соответствует самой частой букве языка.

Считаем частоты

В Python модуль collections даёт удобный Counter. Посчитаем частоты букв в зашифрованном тексте:

from collections import Counter

cipher = "WKLV LV D VLPSOH PHVVDJH HQFUBSWHG ZLWK FDHVDU"
letters = [c for c in cipher if c.isalpha()]
freq = Counter(letters)

for letter, count in freq.most_common(5):
    print(letter, count)

Вывод:

H 5
L 4
V 4
W 3
D 3

Чаще всего встречается H. В английском чаще всего E. Сделаем предположение: H в шифре — это E в оригинале. Это даёт сдвиг 3 (от E до H ровно три буквы). Проверим гипотезу.

Проверяем гипотезу автоматически

Раз мы подозреваем шифр Цезаря, найдём сдвиг автоматически: предположим, что самая частая буква шифр-текста — это E, и вычислим ключ.

import string
from collections import Counter
alphabet = string.ascii_uppercase

cipher = "WKLV LV D VLPSOH PHVVDJH HQFUBSWHG ZLWK FDHVDU"

def decrypt(text, key):
    return "".join(
        alphabet[(alphabet.index(c) - key) % 26] if c in alphabet else c
        for c in text
    )

most_common = Counter(c for c in cipher if c.isalpha()).most_common(1)[0][0]
guessed_key = (alphabet.index(most_common) - alphabet.index("E")) % 26
print("Предполагаемый ключ:", guessed_key)
print("Расшифровка:", decrypt(cipher, guessed_key))

Вывод:

Предполагаемый ключ: 3
Расшифровка: THIS IS A SIMPLE MESSAGE ENCRYPTED WITH CAESAR

Сработало! Мы взломали шифр, не зная ключа заранее — просто посчитали буквы. Для шифра подстановки приём чуть сложнее (нужно подбирать соответствие для каждой буквы), но принцип тот же.

Главный вывод урока

Частотный анализ — причина, по которой все классические шифры считаются небезопасными. Чем длиннее перехваченный текст, тем точнее статистика и тем легче взлом. Современные шифры специально устроены так, чтобы шифр-текст выглядел абсолютно случайным и никакая статистика буквы не выдавала.

Историческая справка

Частотный анализ описал арабский учёный аль-Кинди ещё в IX веке. Так что приёму, который мы только что запустили на Python, больше тысячи лет.

Проверьте себя
1. На чём основан частотный анализ?
AНа переборе всех ключей подряд
BНа том, что буквы языка встречаются с разной, известной частотой
CНа длине ключа
DНа скорости компьютера взломщика
2. Почему длинный перехваченный текст облегчает частотный анализ?
AДлинный текст шифруется другим алгоритмом
BЧем больше текста, тем точнее статистика частот букв
CДлинный текст нельзя зашифровать
DДлина текста не влияет на взлом
Поддержать проект