Сап, любители криптоанализа и мамкины шифровальщики. Есть одна задачка. Коротко о главном: Дается текст, в котором только русские буквы (Е=Ё=е=ё) заменены на символы по рандомно сгенериной таблице. Суть задания - проанализировать зашифрованный текст и составить таблицу встречаемости символов (всего 32 используемых для кодирования символа, соответственно). Затем проанализировать какое-то русское произведение (или несколько), составить такую же таблицу частотности для русских букв, ну и сопоставить. И все вроде бы хорошо, вот только такая таблица для русских букв будет не 100% совпадать с таковой в исходном тексте. Поэтому приходится делать 4-5 свапов букв в этой таблице вручную. А в идеале программа должна расшифровывать текст без пользователя. Для улучшения алгоритма советуют использовать словари частотности 1,2,3 буквенных слов (или частей слов) в русском языке. Но я вот нихуя не понимаю как её можно прицепить к этой программе. Поясните на пальцах, как эти словари использовать в данной программе? 1 приклейтед - таблицы 2 приклейтед - дешифровка, в которой я в качестве текста для анализа закинул сам зашифрованный текст 3 приклейтед - дешифровка, в которой в качестве текста для анализа 3 произведения этого автора Булгакова
Как использовать словари 1,2,3 буквенных слов для улучшения алгоритма?
>А в идеале программа должна расшифровывать текст без пользователя. Можно список слов с буквой 'ё' составить на основе произведения или произведений, которые берем для составления частотной таблицы. Далее можнм искать похожие слова в зашифрованном тексте. Если будут пересечения, то задача решится в автоматическом режиме.
В /b/ анон посоветовал "возьми расшифрованный при помощи текущей частотной таблицы текст и проверь его на частоту вхождений в него из словаря сочетаний, выставляем оценку(возьми допустим Сумма(частота в словаре * частота в тексте)) поменяй соответствие алфавита и повтори оценку. соответствие с лучшей оценкой - ключ к шифру" но я не очень понял.
Придется каждое слово из словаря (~170 двубуквенных,~700 трёхбуквенных,~2700 четырёхбуквенных) прогонять через расшифрованный текст и создавать новую таблицу?
>Поясните на пальцах, как эти словари использовать в данной программе? Берем текст, расшифрованный на основе частотных таблиц. Вытаскиваем из него список коротких слов. Теперь задача сделать свапы таким образом, чтобы все короткие слова попали в список коротких слов из частотной таблицы. Если исходный шифрованный текст большой, то можно и частоты подогнать. Минимизировать среднеквадратичное отклонение, например.
>>451465 >Вытаскиваем из него список коротких слов. Не выйдет. Короткие слова - это любые 2,3,4 буквенные части слов, а не отдельные слова, ограниченные знаками. То есть в слове привет содержится 3 буквенное ПРИ (0.939251) и 2 буквенное ЕТ (ет 0.001174). Исходный текст - Записки юного врача, то есть да, большой. Еще идеи есть?
Составляем словарь слов по произведениям или берем готовый.
Вводим оценку расшифрованного текста. Т.е. насколько слова в расшифрованном тексте совпадают со словами из настоящего словаря. Тут я пока затрудняюсь предложить что-то умнее суммы минимального количества отличных букв, по сравнению со словами такой же длины. Скажем, для "саитября" будет величина x = 2 от слова "сентября", если такое окажется в эталонном словаре. В качестве оценке суммируем величины для всех слов в расшифрованном тексте.
После этого начинается поиск в дереве решений. Переход к потомку — свап в текущей таблице. При поиске можно использовать различные эвристики, альфа-бета отсечения и прочее дерьмо.
В таком методе трехбуквенники не используются. Видимо, надо как-то их искать в тексте. Я не знаю как.
А вообще, сдается, мы сидим тута и какой-то велосипед изобретаем тута.
>>451558 Весь день изобретаю, так ничего и не изобрел. Все методы какие-то слишком геморные, а задача изначально называлась простой. Да и вроде без всяких составных словарей должно получаться. По сути анализ этих словарей или их сопоставление с первым вариантом расшифрованного текста, должно как-то улучшать таблицу кодировки (частотная таблица для русских букв). Но что-то ничего путного не выходит. Пробовал реализовать вычленение всех 2/3 буквенных конструкций из текста, но понял, что по памяти это совсем не выгодно.
>Для улучшения алгоритма советуют использовать словари частотности 1,2,3 буквенных слов (или частей слов) в русском языке Можно попробовать брать не все возможные сочетания, а только слова длиной 1..2 буквы, а также приставки и окончания. Потом сравнивать частоты.
>>451572 >Как их вычленять-то? Проходишь по тексту и вычленяешь. Всё делается в один проход. Для длинных слов придется брать несколько вариантов начала и конца (от 1..3 символов, тут можно поиграться с эвристиками). Доступ тупо к словарю — O(log N). Всё пучком. Можно свою структуру данных намутить для коротких слов: 32 буквы в 3 степени (максимальная длина коротких слов) дают всего лишь 32768 комбинаций.
>>451592 35937 комбинаций с учетом, что слова могут иметь разную длину и понадобится пустой символ — ноль. В такой массив можно записывать частоты. А можно просто в словарь для начала, комбинаций не так много.
>>451596 Ну допустим я реализую вычленение всех 3 буквенных комбинаций. А сделать это будет нихуя не просто, правила для разделения слов не придумать, слово "привет" придется делить на "При Рив Иве Вет" Получу частотный словарь этих комбинаций для криво-расшифрованного текста. Дальше-то что?
Попробуй тогда без приставок и окончаний. Только короткие слова, только хардкор. Та же самая задачка по сопостовлению букв на основе частот. Только частоты для коротких слов брать.
>>451599 У тебя какой-то нефундаментальный подход.
Во-первых, я имел в виду, что надо брать приставки и окончания. Поэтому слово "привет" даст сочетания [п, пр, при, вет, ет]. Я бы такое вычленение сделал. Короткие слова, менее 5 букв, не разделять.
Во-вторых, надо вычленять ровно то, что вычленено в таблице на пикче. Если это буквы, идущие в словах подряд, то вычленять буквы, идущие в словах подряд. Если приставки, то приставки. Если только короткие слова, то только их. Тогда можно говорить о сравнении частот.
1) Считал слово -> зафиксировал данные (в частотах счетчики поинкрементил) -> считал слово -> ...
2) Построил таблицу на основе соответствий.
3) Открыл файл заново.
4) Считал букву -> вывел буквы через таблицу -> считал букву -> ...
Это для успешного алгоритма, который умеет за один проход расшифровывать.
Если это поиск решения с какой-то оценкой, то функция работает так: Считали слово -> заменили по текущей таблице -> поинкрементили оценку для решения -> считали слово -> ...
>>451605 Может глобально мыслить уже не могу, целый день над этим думаю. Начинаю считывать фейл - считал посимвольно целое слово (последовательность русских букв, ограниченную какими-то знаками), далее расчленяю это слово на 2/3/4 буквенные части и делаю новую таблиц частотности?
Дается текст, в котором только русские буквы (Е=Ё=е=ё) заменены на символы по рандомно сгенериной таблице.
Суть задания - проанализировать зашифрованный текст и составить таблицу встречаемости символов (всего 32 используемых для кодирования символа, соответственно). Затем проанализировать какое-то русское произведение (или несколько), составить такую же таблицу частотности для русских букв, ну и сопоставить. И все вроде бы хорошо, вот только такая таблица для русских букв будет не 100% совпадать с таковой в исходном тексте. Поэтому приходится делать 4-5 свапов букв в этой таблице вручную. А в идеале программа должна расшифровывать текст без пользователя.
Для улучшения алгоритма советуют использовать словари частотности 1,2,3 буквенных слов (или частей слов) в русском языке. Но я вот нихуя не понимаю как её можно прицепить к этой программе. Поясните на пальцах, как эти словари использовать в данной программе?
1 приклейтед - таблицы
2 приклейтед - дешифровка, в которой я в качестве текста для анализа закинул сам зашифрованный текст
3 приклейтед - дешифровка, в которой в качестве текста для анализа 3 произведения этого автора Булгакова
Как использовать словари 1,2,3 буквенных слов для улучшения алгоритма?