Назад Наверх
Анализ данных

Мне был сделан подарок со следующим сообщением:

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. Анализ данных требует наличие эффективного инструментария.