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

Ключ как перестановка

Пусть алфавит содержит mm символов. Ключ kk — перестановка: каждую букву открытого текста он заменяет ровно одной буквой шифротекста. Число возможных ключей равно m!m!. Для 33 русских букв

33!8,681036.33!\approx8{,}68\cdot10^{36}.

Перебрать такое пространство невозможно. При этом шифр не скрывает длины слов, повторов букв и статистики соседства. В слове «топот» первая и последняя буквы совпадают и после шифрования.

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

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Открытая фраза, таблица ключа и шифротекст с соединёнными повторяющимися буквами
Рис. 68.1. Подстановка сохраняет рисунок повторов

Верхняя строка — фрагмент открытого текста, средняя — таблица замен букв, нижняя — шифротекст. Дуги соединяют одинаковые позиции до и после шифрования. Цветом отмечены биграммы: сами символы меняются, но число и взаимное расположение повторов остаются.

Язык как вероятностная цепь

Возьмём большой корпус русского текста и посчитаем частоты биграмм или триграмм. Сглаженная вероятность символа ctc_t после контекста:

p(ctct2,ct1)=N(ct2,ct1,ct)+λN(ct2,ct1)+λA.p(c_t\mid c_{t-2},c_{t-1}) =\frac{N(c_{t-2},c_{t-1},c_t)+\lambda} {N(c_{t-2},c_{t-1})+\lambda|\mathcal A|}.

Логарифмический балл расшифровки x1xnx_1\ldots x_n:

L(x)=t=3nlogp(xtxt2,xt1).L(x)=\sum_{t=3}^{n}\log p(x_t\mid x_{t-2},x_{t-1}).

Логарифм превращает произведение малых вероятностей в сумму и защищает от численного обнуления. Сглаживание λ>0\lambda>0 не даёт одной невиданной триграмме уничтожить весь балл.

Это маленькая языковая модель: она знает только короткий контекст, зато её балл прозрачен. Высокий LL не доказывает осмысленность текста, но обычно предпочитает русские сочетания случайным.

Локальные ходы в огромном пространстве

Соседний ключ получают обменом образов двух букв. Такой ход меняет лишь две строки таблицы, но может исправить много позиций текста. Предложение симметрично: вероятность поменять аа и бб такая же, как вернуть их обратно.

Целевая плотность на ключах:

π(k)exp{βL(k1y)}.\pi(k)\propto \exp\{\beta L(k^{-1}y)\}.

Коэффициент β\beta задаёт обратную температуру. Переход kkk\to k' принимается с вероятностью

a(k,k)=min(1,exp{β[L(k1y)L(k1y)]}).a(k,k')=\min\left(1, \exp\{\beta[L(k'^{-1}y)-L(k^{-1}y)]\}\right).

Нормировочная сумма по m!m! ключам не нужна: она сокращается, как в общем алгоритме Метрополиса–Хастингса.

От жадного взбирания к выборке

Если всегда принимать только улучшения, получим hill climbing. Он быстро находит ближайший локальный максимум и застревает. MCMC иногда принимает ухудшение, пересекает «перевал» и исследует другую область ключей.

Но есть тонкость: для строгой выборки из π\pi температура фиксирована. Для расшифровки нас чаще интересует максимум, поэтому применяют simulated annealing: начинают с малой β\beta, позволяющей свободное движение, затем повышают её. Это уже оптимизационная эвристика, а не стационарная выборка.

Несколько независимых запусков обязательны. Если разные цепи приходят к почти одинаковым текстам и баллам, уверенность растёт. Если результаты расходятся, нельзя выбирать самый приятный глазами вариант и молчать об остальных.

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Схема локальных максимумов балла ключей и две траектории жадного поиска и MCMC
Рис. 68.2. Энергетический рельеф перестановок

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

Лаборатория Диакониса

Расшифровка подстановки триграммной цепью

Загружается живая иллюстрация…

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

Затем уменьшите текст до 80 символов. Пространство ключей прежнее, а статистических свидетельств меньше: множество расшифровок получает близкий балл. Это не поломка алгоритма, а недостаток информации в задаче.

Диагностика без известного ответа

В настоящем шифре эталонного открытого текста нет. Значит, качество приходится оценивать косвенно:

  1. сравнивать лучшие баллы независимых запусков;
  2. смотреть, совпадают ли наиболее частые пары ключа;
  3. проверять правдоподобие на отложенной языковой модели;
  4. измерять стабильность результата при изменении корпуса и сглаживания;
  5. публиковать несколько конкурирующих расшифровок, если разрыв мал.

Можно зашифровать известные тексты и оценить долю правильно восстановленных букв. Это synthetic benchmark: он проверяет алгоритм, но может быть легче исторических шифров с опечатками, именами и необычной орфографией.

Корпус решает, какой язык «нормален»

Если обучить модель на газетах XXI века, она может плохо оценивать дореволюционное письмо, диалект или код. В открытом корпусе Taiga есть художественные тексты, новости, социальные сети и другие жанры. Их смесь задаёт prior на стиль.

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

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

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Кривые точности восстановления букв для униграммной биграммной и триграммной моделей при разной длине текста
Рис. 68.3. Длина шифротекста и восстановимость ключа

По горизонтали длина шифротекста от 50 до 2 000 символов, по вертикали доля правильно восстановленных пар ключа среди встретившихся букв. Линии показывают медианы 30 синтетических опытов, полосы — межквартильный диапазон. Видно, когда более сложная модель начинает окупать разреженность.

От частотного анализа к современным моделям

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

Современная нейросетевая модель могла бы оценивать длинный контекст лучше. Однако её score дороже вычислять, труднее калибровать и проще переоптимизировать: поиск найдёт странные строки, которым сеть случайно назначает высокий балл. Переход от триграмм к трансформеру не отменяет диагностику.

Мини-исследование: где заканчивается информация текста

Зашифруйте 30 независимых фрагментов одного корпуса при длинах 50, 100, 200, 500 и 1000 символов. Для каждого сохраните один и тот же истинный ключ, но запускайте цепь из разных случайных перестановок. Оценивайте две величины: долю верно восстановленных пар среди встретившихся букв и долю правильно расшифрованных позиций.

Эти метрики различаются. Редкая буква может иметь неверный образ, почти не влияя на текст; наоборот, обмен двух частых букв портит много позиций. Постройте uncertainty по каждой паре букв: как часто она совпала в двадцати лучших запусках. Получится не один ключ, а карта уверенности.

Теперь сравните три источника ошибки. Сначала дайте алгоритму истинную языковую модель, построенную на большом совместимом корпусе, и большой вычислительный бюджет. Затем уменьшите число итераций, не меняя текст. Наконец, смените корпус на другой жанр. Если при 50 символах даже огромный бюджет даёт разные ключи, ограничение информационное. Если при 1000 символах помогают дополнительные итерации, мешал поиск. Если меняет ответ жанр, виновата модель.

Такое разложение повторяет общую логику ошибки смещения и дисперсии: нельзя называть все неудачи «MCMC не сошёлся», когда данных недостаточно или score задаёт другой язык.

Информация, модель и поиск не взаимозаменяемы

Успех расшифровки определяется тремя отдельными вещами. Текст должен быть достаточно длинным и сохранять статистический след. Языковая модель должна быть согласована с языком и жанром. Цепь должна исследовать пространство ключей, а не застрять рядом со стартом. Нельзя лечить плохой корпус миллионом итераций или короткий шифротекст сложной диагностикой.

Следующий шаг курса переносит марковскую структуру из пассивного наблюдения в управление: у переходов появятся действия и награды.

Задачи