Страницы

Поиск по вопросам

понедельник, 1 октября 2018 г.

Расшифровка небольшой фразы, зашифрованной шифром подстановки

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


Ответ

олхд ву мкбелл л омдыуэ бубдэ щн ялрз рщн щн шглдвьм шнцяд мдрык шнкч л шношмэ сижу на лекции и слушаю какую то дичь что то приуныл пойду лучше поем и посплю
Как это сделано ?
Частотный анализ отдельных букв на столь коротком предложении практически ничего не дал. Гадать какие могут быть окончания совершенно не хотелось. Загрузил из интернета пару русских словарей (тупо списки слов), загрузил в БД, сделал в таблице колонки s1 s2 ... s8 в которые скопировал из слов соответствующие по номеру буквы, что бы проще было писать запросы вида "первая буква равна третьей".
То что буква 'л' обязана быть 'и' было понятно практически сразу. Т.е. я рассмотрел варианты, что она может быть другой, но у нас было слово оканчивающиеся на 'лл', оно очень понизило шансы того, что л<>и.
Очень сильно заинтриговали 4 слова, начинающиеся на 'ш', причем целых 3 из них начинаются на 'шн'. Простейший запрос в базу со словарем по частоте двухбуквенных начал слов дал просто ошеломляющий результат, 7% русских слов начинаются на 'ПО', еще 6.3% на 'ПР', следующая по частоте приставка 'за' всего с 4% и далее процент очень быстро падает. 'ПР' не подходил, потому что вторая буква 'Р' в таком случае должна была быть в двухбуквенных словах в середине фразы. Таких слов не найдено, зато буква 'О' отлично подходит для таких слов. И есть предположение, что двухбуквенные - 'ТО', а трехбуквенное что то типа 'что, кто, это'
Но у нас в последнем слове вдобавок есть повтор буквы 'п', поиск в словаре дал немного слов по маске по_п__ причем, последняя буква слова 'э' встречается в конце других слов в предложении, но всегда с разными предпоследними, было решено, что она гласная. Предыдущее слово, начинающееся на 'ПО' всего из 4х букв. И таких слов так же оказалось не много. В глаза практически мгновенно бросилась комбинация 'поем и посплю'.
Подставляем открывшиеся нам буквы в остальное предложение, где у нас уже расставлены буквы 'И'. первое слово становится интересным, всего 4 буквы, начинается на 'СИ', далее идет редкая буква, более не встречающаяся в предложении и некое окончание, которое есть еще в одном слове. Выбор опять невелик, хотя варианты были. Но пробуем расставить букву 'У' по предложению. Слово 'бубдэ' начинает вырисовываться '_у__ю', причем первая буква равна третьей, вариантов с словаре не особо много, плюс к этому ясно, что 1я и 3я буквы согласные, а между ними гласная. Буква 'А' в качестве этой гласной очень подходит, потому как есть двухбувенное слово оканчивающееся на 'А' и очень подозрительно напоминающее 'НА', потому как предыдущее слово скорее всего 'сижу'. Опять расставляем предположения по предложению и по словарю находится слово 'лекции', очень подходящее под под 'сижу на' и по смыслу предложения перекликающееся с 'посплю' :) Еще несколько подобных предположений и фраза нарисовалась ...
И так, словарь со свободным поиском обязателен, частоты букв нужны, но чаще в работе помогало понимание 'редких' букв. Частотный анализ начал слов и немного удачи.
Делая все это, я конечно понимал, что текст может быть не русским, но так хотелось верить, что русскими буквами зашифровали не язык какого нибудь племени из бразильских лесов :)
=====================================================
По просьбам трудящихся, несколько слов по технической реализации. Лично мне было в БД проще, sql запросами оно как то короче. Сначала скриптом (perl) входные файлы прочитал, переводы кареток убрал, чистые слова вставил в таблицу. получил таблицу с единственной колонкой 'word'. Далее запросы вида:
update v1words set s3=substr(word,3,1) where length(word)>2
Можно было конечно в одном запросе через запятую все поля сразу заполнить, но лень как известно ... проще 8 раз запустить было поправив циферки. substr(строка,X,Y) берет из строки Y символов, начиная с X. С другой стороны можно было поля и не делать, все на ходу брать, но опять же лень выписывать select ... where substr(word,1,1)=substr(word,3,1). А запросы пока я правильный путь не нащупал уже раздулись то чего-то такого:
select * from v1words where s1=s4 and length(word)=6 and s3 in(select lit from v1lit where tp='s') and s2 not in(s3,s4,s5,s6) and s3 not in(s4,s5,s6)
Ах, да, еще была служебная табличка v1lit с 33 записями, в колонке lit буква, в колонке tp признак s-согласная или g-гласная. Но в конечном анализе я ее не привел, потому как после того как нашел подход она оказалась не особо нужна.
Все равно основным инструментом оказался текстовый файл :)
олхд ву мкбелл л омдыуэ бубдэ щн ялрз рщн щн шглдвьм шнцяд мдрык шнкч л шношмэ си а ле ии и сл к к то д то то п л по л е по и посп кц ю а ую ч з ем лю ю к яр снесла е а д ии э с иу у у совсем
Вот как то так он выглядел в середине работы (просто понажимал 'назад' в редакторе)

Комментариев нет:

Отправить комментарий