Помогите расшифровать текст методом частотного анализа

Рейтинг: 3Ответов: 2Опубликовано: 22.06.2023

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

ЩСЗ ЙАБПЫАИДЙАЮЮВЗ П ЮАИЧСБУЧС ЩАХБПДАБУЮВЗ НСИШХПЮВ ИГВЦШ 
ЮВЕГВБВ НГОДП П ГЙВЮШБВИУ ЙНАГАХ И ШЩСЩ ГВЦГАЦВЗ ЙСХШ РШБ 
ЩДСГВ ШИПБПБИЗ П ЦЙШЧ ИДВБ ЙОА З СРБЗЮШБВИУ ДАЩЮВЗ ИДАЮВ 
ИЧВБ ЕОИДГС ШХВБЗБВИУ ЦВ ЧСГВЕБАЩ ДЗЮШБИЗ НСЕБАИЧПЙВЛЭПЬ 
ИАГАЕГСЩ ИБАХ 

Ответы

▲ 6

Держите ручной инструмент в помощь :D на полный экран

const txt = 'ЩСЗ ЙАБПЫАИДЙАЮЮВЗ П ЮАИЧСБУЧС ЩАХБПДАБУЮВЗ НСИШХПЮВ ИГВЦШ ЮВЕГВБВ НГОДП П ГЙВЮШБВИУ ЙНАГАХ И ШЩСЩ ГВЦГАЦВЗ ЙСХШ РШБ ЩДСГВ ШИПБПБИЗ П ЦЙШЧ ИДВБ ЙОА З СРБЗЮШБВИУ ДАЩЮВЗ ИДАЮВ ИЧВБ ЕОИДГС ШХВБЗБВИУ ЦВ ЧСГВЕБАЩ ДЗЮШБИЗ НСЕБАИЧПЙВЛЭПЬ ИАГАЕГСЩ ИБАХ';

const alphabet = [{l: "а", v: 3}, {l: "б", v: 21}, {l: "в", v: 9}, {l: "г", v: 19}, {l: "д", v: 13}, {l: "е", v: 2}, {l: "ё", v: 33}, {l: "ж", v: 25}, {l: "з", v: 20}, {l: "и", v: 4}, {l: "й", v: 23}, {l: "к", v: 11}, {l: "л", v: 10}, {l: "м", v: 12}, {l: "н", v: 5},{l: "о", v: 1}, {l: "п", v: 14},{l: "р", v: 8}, {l: "с", v: 7},{l: "т", v: 6}, {l: "у", v: 15},{l: "ф", v: 31},{l: "х", v: 24},{l: "ц", v: 28},{l: "ч", v: 22},{l: "ш", v: 26},{l: "щ", v: 29},{l: "ъ", v: 32},{l: "ы", v: 17},{l: "ь", v: 18},{l: "э", v: 30},{l: "ю", v: 27},{l: "я", v: 16}];

$("#code").text(txt);

alphabet.sort((a,b) => a.v - b.v).forEach(function(item, idx){
  $(`<td>${item.l}</td>`).appendTo("#letters");
  $(`<td>${34-item.v}</td>`).appendTo("#src");
});

let map = txt.split('').reduce(function(acc, v){
    if (v != ' ') {
        acc[v] = (acc[v] || 0) + 1;
    }
    return acc;
  }, {});
Object.entries(map)
  .map(entry => ({ l: entry[0], v: entry[1] }))
  .sort((a,b) => b.v-a.v)
  .forEach(function(item){
     $(`<td>${item.l}</td>`).appendTo("#txt");
     $(`<td>${item.v}</td>`).appendTo("#target");
     $(`<td><input class="" style="width:25px"/></td>`).appendTo("#inputs");
  });
  
$("#inputs input").keyup(function(){
  let result = txt;
  $("#letters td").removeClass('active');
  $("input").each(function(idx, el){
     let letter = $("#txt td").eq(idx).text();     
     let v =  $(this).val();
     if (v) {
        result = result.replaceAll(letter, `<mark>${v}</mark>`);
        //console.dir(letter, v);
        $('#letters td').each(function(){               
          if ($(this).text() == v) {
              $(this).addClass('active');
          }
        });
     }
  });
  $("#code").html(result);  
});
.active {
    background-color: yellow !important;
}

#code {
   font-family: Courier, Consolas;
}
mark {
   padding: 0 !important;
}
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table class="table table-bordered text-center">
  <tr id="letters"></tr>
  <tr id="src"></tr>
    
</table>

<table class="table table-bordered text-center">
  <tr id="txt"></tr>
  <tr id="target"></tr>
  <tr id="inputs"></tr>
</table>
<div id="code" class="px-5"></div>

▲ 5

Текст в редактор, слова на отдельные строки и попробую менять буквы. Чтобы различать, что уже поменяно, а что осталось, заглавные меняются на строчные.

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

Тогда я попробовал анализировать слова. Тут кое-что получилось. Сперва меня увлекла пара слов ЩСЗ и ШЩСЩ. Второе слово вообще замечательное. Я придумал что это удод. А первое тогда до?. Что до?? дон? док? Тупик.

Однобуквенные слова П, И, З. Каждое из них может быть одним из авикосуя. Вариантов много, очевидного выбора я не увидел. Опять тупик.

Следующее слово, которое привлекло моё внимание, - ЙАБПЫАИДЙАЮЮВЗ. Особенно ЮЮВЗ. Это может быть нный, нное, нная, нные и ещё сколько-то вариантов. Если к этому добавить слово З, то, кажется, есть фаворит, и он один: нная. Три буквы есть, и я более или менее в них уверен. Такой старт - отличный стимул.

ЩСя ЙАБПЫАИДЙАнная П нАИЧСБУЧС ЩАХБПДАБУная НСИШХПна ИГаЦШ наЕГаБа НГОДП П
ГЙанШБаИУ ЙНАГАХ И ШЩСЩ ГаЦГАЦая ЙСХШ РШБ ЩДСГа ШИПБПБИя П ЦЙШЧ ИДаБ ЙОА я
СРБянШБаИУ ДАЩная ИДАна ИЧаБ ЕОИДГС ШХаБяБаИУ Ца ЧСГаЕБАЩ ДянШБИя
НСЕБАИЧПЙаЛЭПЬ ИАГАЕГСЩ ИБАХ

Слово Ца. Первая буква может быть одна из дзнт. Выбрать однозначно трудно. Но тут я заметил слово ГаЦГАЦая и догадался, что если Ц это з, то слово дописывается до разрезая! Для других букв варианты не придумались, а этот обещает сразу три буквы. Заменяем их.

ЩСя ЙеБПЫеИДЙенная П неИЧСБУЧС ЩеХБПДеБУная НСИШХПна ИразШ наЕраБа НрОДП П
рЙанШБаИУ ЙНереХ И ШЩСЩ разрезая ЙСХШ РШБ ЩДСра ШИПБПБИя П зЙШЧ ИДаБ ЙОе я
СРБянШБаИУ ДеЩная ИДена ИЧаБ ЕОИДрС ШХаБяБаИУ за ЧСраЕБеЩ ДянШБИя
НСЕБеИЧПЙаЛЭПЬ ИереЕрСЩ ИБеХ

Теперь ДеЩная и ИДена. Я решил что цепная и сцена. Не правда ли умственно? Меняю.

пСя ЙеБПЫесцЙенная П несЧСБУЧС пеХБПцеБУная НСсШХПна сразШ наЕраБа НрОцП П
рЙанШБасУ ЙНереХ с ШпСп разрезая ЙСХШ РШБ пцСра ШсПБПБся П зЙШЧ сцаБ ЙОе я
СРБянШБасУ цепная сцена сЧаБ ЕОсцрС ШХаБяБасУ за ЧСраЕБеп цянШБся
НСЕБесЧПЙаЛЭПЬ сереЕрСп сБеХ

Первое слово превратилось пСя, и я не знаю, как его починить, но конь уже закусил удила. сразШ это сразу, наЕраБа - набрала, уХаляласУ - удалялась.

пСя ЙелПЫесцЙенная П несЧСльЧС педлПцельная НСсудПна сразу набрала НрОцП П
рЙанулась ЙНеред с упСп разрезая ЙСду Рул пцСра усПлПлся П зЙуЧ сцал ЙОе я
СРлянулась цепная сцена сЧал бОсцрС удалялась за ЧСраблеп цянулся
НСблесЧПЙаЛЭПЬ серебрСп след

Всё больше слов читается: рЙанулась - рванулась, вНеред - вперед, звуЧ - звук. я СРлянулась - я оглянулась!

поя велПЫесцвенная П несколько педлПцельная посудПна сразу набрала прОцП П
рванулась вперед с упоп разрезая воду гул пцора усПлПлся П звук сцал вОе я
оглянулась цепная сцена скал бОсцро удалялась за кораблеп цянулся
поблескПваЛЭПЬ сереброп след

посудПна это посудина. Текст уже читается, хотя и несколько картавый:

поя велиЫесцвенная и несколько педлицельная посудина сразу набрала прОци и
рванулась вперед с упоп разрезая воду гул пцора усилился и звук сцал вОе я
оглянулась цепная сцена скал бОсцро удалялась за кораблеп цянулся
поблескиваЛЭиЬ сереброп след

поя - это ошибка. Должно быть моя. Ищу по истории замен, где я ошибся. Обнаруживаю, что цепная сцена на деле цемная сцена, а это, в свою, очередь темная стена! Откатываю изменения, правлю и получаю:

моя велиЫественная и несколько медлительная посудина сразу набрала прОти и
рванулась вперед с умом разрезая воду гул мтора усилился и звук стал вОе я
оглянулась темная стена скал бОстро удалялась за кораблем тянулся
поблескиваЛЭиЬ серебром след

велиЫественная - величественная, бОстро - быстро.

моя величественная и несколько медлительная посудина сразу набрала прыти и
рванулась вперед с умом разрезая воду гул мтора усилился и звук стал вые я
оглянулась темная стена скал быстро удалялась за кораблем тянулся
поблескиваЛЭиЬ серебром след

Тут я встрял. мтора и вые это, видимо, обещанные опечатки: мотора и выше. с умом воду не разрезают, её разрезают с шумом - ещё одна опечатка. А что такое тогда поблескиваЛЭиЬ? Сдаюсь и гуглю. Это поблескивающий из "Что сказал покойник" Иоанны Хмелевской.

моя величественная и несколько медлительная посудина сразу набрала прыти и
рванулась вперед с умом разрезая воду гул мтора усилился и звук стал вые я
оглянулась темная стена скал быстро удалялась за кораблем тянулся
поблескивающий серебром след

О да! Это был отличное расследование и очень в стиле Хмелевской. Спасибо!