Как упростить расшифровку фразы, зашифрованной простым моноалфавитным шифром подстановки
Частотный анализ не дает хорошего результата, так как фраза содержит всего 68 символов. Собвственно, сама фраза:
олхд ву мкбелл л омдыуэ бубдэ щн ялрз рщн щн шглдвьм шнцяд мдрык шнкч л шношмэ
Частотное распределение:
Ответы
Ответ 1
олхд ву мкбелл л омдыуэ бубдэ щн ялрз рщн щн шглдвьм шнцяд мдрык шнкч л шношмэ
сижу на лекции и слушаю какую то дичь что то приуныл пойду лучше поем и посплю
Как это сделано ?
Частотный анализ отдельных букв на столь коротком предложении практически ничег
не дал. Гадать какие могут быть окончания совершенно не хотелось. Загрузил из интернет
пару русских словарей (тупо списки слов), загрузил в БД, сделал в таблице колонки 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-гласная. Но в конечном анализе я ее не привел, потому как после того как нашел подход она оказалась не особо нужна.
Все равно основным инструментом оказался текстовый файл :)
олхд ву мкбелл л омдыуэ бубдэ щн ялрз рщн щн шглдвьм шнцяд мдрык шнкч л шношмэ
си а ле ии и сл к к то д то то п л по л е по и посп
кц ю а ую ч з ем лю
ю к яр снесла
е а д ии э с иу у у совсем
Вот как то так он выглядел в середине работы (просто понажимал 'назад' в редакторе)
Ответ 2
Есть несколько идей.
Поскольку у вас оставлены пробелы, попробуйте однобуквенные слова. Их не так много, они дадут предположение том, какая буква обозначена как «л».
Попробуйте частотный анализ пар букв.
У вас есть слова с повторяющимися буквами («мкбелл», «бубдэ», «шношмэ»). Попробуйт
найти в словаре подходящие слова. Особенно интересно выглядит «мкбелл» (на «л» у вас должно быть предположение согласно пункту 1.)
Проанализируйте последние буквы. У вас много «л», «э», «н» — что это может быть
Какие буквы часто бывают в конце слова?
Комментариев нет:
Отправить комментарий