Мне был сделан подарок со следующим сообщением:
10010001101011111010000011100001101010001010000110101110.
Вводная:
Имеются следующие соображения:
- сообщение передано с подарком;
- скорее всего это шутка, а не криптозащищенный код;
- букв мало это все осложняет;
- очень надеюсь что это не хэш сообщения, на хэш у меня времени не хватит.
Как решаем?
Применяем методы анализа зашумленного сигнала, как в биологических (биометрических) системах.
Этап 1. Сбор первичной информации. Наработка гипотез
Решил что код байтовый, так как первые 4 бита повторяются, что приводит к неравномерности распределения энтропии по сообщению, значит последовательность не рандомизирована, т.е. предположительно не зашифрована криптоалгоритмами. За это отдельное спасибо :)
Получаем в десятичном виде:
10010001 - 145
10101111 - 175
10100000 - 160
11100001 - 225
10101000 - 168
10100001 - 161
10101110 - 174
Повторений нет. Все коды выше 127. Похоже на использование расширенной части таблицы кодировки ASCII.
145 175 160 225 168 161 174
Пробуем использовать наиболее популярные кодировки:
WIN-1251 - "‘Ї бЁЎ®";
KOI8-R - "▒╖═А╗║╝"
Печалька.
Попробуем просто распечатать со стандартной настройкой консоли (UTF-8):
���ᨡ� - ясности не добавило.
На всякий случай посмотрим по 4 бита:
1001 - 9
0001 - 1
1010 - 10
1111 - 15
1010 - 10
0000 - 0
1110 - 14
0001 - 1
1010 - 10
1000 - 8
1010 - 10
0001 - 1
1010 - 10
1110 - 14
Может так легче воспринимается.
-----------------
9 1 10 15 10 0 14 1 10 8 10 1 10 14
-----------------
Хорошо прослеживается первые 4 бита 1010, которые имеют отклонения в первом символе на 1001 и в четвертом 1110. Почему-то напоминает UTF-8, видимо выбросом на букву "ё" ))). Нулевое значение это плохо, в кодировках используется редко, возможно потребуются преобразования.
На этом этап рыскания завершены.
Выводы:
- коды выше 127;
- популярные кодировки не подошли;
- кодировка предположительно является однобайтовой из-за нуля, появляющегося при рассмотрении по 4 бита.
Этап 2. Начнем отрабатывать полученные версии
Вернемся к байтовому представлению.
145 175 160 225 168 161 174
Пробуем анализировать.
Есть три близкие символа 160, 168, 161. Так как они арифметически близко друг к другу, делаем предположение что это символы алфавита по порядку.
Теперь нужен словарь, который подберет слово с такой же разницей между буквами. Интересно как я буду это делать ручками?
Используем старый проведенный метод. Берем "Войну и мир" ... и сначало ищем полное совпадение в первом томе, затем во-втором томе. Оба тома в кодировке windows-1251.
Для более точного поцизионирования допустимо отбросить слова с иностранными буквами, пробелами, вспомогательными символами.
В случае отсутствия точных совпадений, будем искать наиболее близкие варианты.
Приведем кусочек кода, реализовавший обнаруженные зависимости.
do {
simbol = fgetc(text_file);
shifting((int *)&word[0],simbol);
//Собственно, сама зависимость
if (((word[4] - word[5]) == 7) && ((word[4] - word[2]) == 8))
show_word((int *)&word[0]);
}
while (simbol != EOF);
В результате работы написанной программы, первые том нетленного произведения выдал 457 комбинаций букв в кодировке UTF-8, а второй том 420 комбинаций в кодировке UTF-8.
Конечно фильтрация значительно сокращает список слов и работа со списком становится не такой долгой.
На мой взгляд, по смыслу больше всего подошло слово "спасибо".
Так как первый и четвертый символ имеют разный код и код первого символа меньше 160, предполагаем что первый символ это заглавная буква. В конце по всей вероятности восклицательный знак. Код не дает ответа на то, какой символ завершает слово.
В результате получилось "Спасибо!".
Вероятность правильно ответа значительна, но не 100%!!!
Кажется все очень примитивно просто, только в условиях отсутствия работающих инструментов и значительной аппариорной неопределенности все казалось не таким простым, когда я посмотрел на эту последовательность в первый раз.
Если бы сложнее было, мне бы стало скучно, наверное не доделал бы. Собственно в какой кодировке сделано я так и не понял ))).
На все, вместе с оформлением html-страницы и обновлением сайта ушло несколько часов.
А вот мой ответ
1. Ребята, огромное спасибо за подарок!
2. 24060bcf58655d28db099567c9ff63f5c0b67cb367eaef546a8844fea6320aa1d5f57e71
Кто декодирует математическим путем, буду добиваться места в аспирантуре по гос.заказу
без дополнительных условий.
Шума в данных нет, информация представлена последовательно.
Выводы
1. Анализ данных это интересно!
2. Анализ данных требует владения знаниями предметной области.
3. Анализ данных требует наличие эффективного инструментария.