Всех с пятницей! В своём прошлом посте про хеш-стеганографию я предложил иной подход в стеганографии — не вкраплять никакой информации в контейнер, а просто упорядочивать контейнеры в нужном порядке и тем самым передавать скрытую информацию. Два дня назад romabibi опубликовал proof of consept для хеш-стеганографии в соц.сети вКонтакте.
Однако в использовании картинок как контейнеров есть важный изьян. Цитирую коммент alekseev_ap:
Всё это очень интересно, но КПД такой системы чрезвычайно низкий. Сколько надо отправить десятков (а то и сотен) килобайт чтобы передать строку из нескольких слов?!
Действительно, если изображение весит условно 0.5 — 2 Мбайт, а на каждое изображение мы передаем от 1 до 3 нибллов, то получаемая скорость очень мала: от 0.5 до 6 B/MB
Поэтому для практического применения нужно найти такой контейнер, который обладал бы следующими свойствами:
- был бы очень мал;
- при большом количестве контейнеров, стоящие друг за другом; не вызывал бы "подозрений";
- при смене порядка контейнеров, они бы не вызывали "подозрение".
Итак, капитан-очевидность решение: необходимо осуществлять хеш-стеганографию в больших датасетах. Одна строка — один ниббл (полубайт).
Идея
Идея проста и очевидна:
- Берём очень большой датасет с данными.
- Хешируем каждую строку, берем первые n бит данных — это набор контейнеров для хеш-стеганографии
- Сообщение сжимаем, шифруем, разбиваем на блоки по n бит
- Упорядочиваем в соотвествии с передаваемым сообщением.
Пример csv-донора
В качестве примера возьмём CSV с координатами городов world-cities.csv.
Каждая строка содержит:
- название города
- страну
- регион (штат, область и т.д.)
В среднем одна запись имеет длину в 33 байта.
Это в моём датасете. Вы можете в качестве "донора" взять другой. Однако порядок цифр будет тем же.
Если мы передаем по одному нибблу (4 бита), то итоговая стеганографическая скорость будет аж ~16000 B/MB, что на три порядка (sic!) больше, чем в хеш-стеганографии с картинками!!!
CHS
Пример называется CHS (Csv Hash Steganography).
Сгенерировать CSV файл с сообщением:
$ python3 chs.py -m "" -i data/world-cities.csv -o stego.csv
Извлечь сообщение:
$ python3 chs.py -i stego.csv
При генерировании и извлечении следует указать один и тот же пароль, естественно.
Генерирование
~$ python3 chs.py -m "" -i data/world-cities.csv -o stego.csv
Run chs 2018-03-23 09:33:03.242100
Введите пароль: 12345
header:: 'name,country,subcountry,geonameid'
65 --> 'Soignies,Belgium,Wallonia,2786420'
129 --> 'Lagoa do Itaenga,Brazil,Pernambuco,3396769'
196 --> 'Dubai,United Arab Emirates,Dubai,292223'
138 --> 'Qarqīn,Afghanistan,Jowzjān,1129516'
94 --> 'Arroyo Seco,Argentina,Santa Fe,3865385'
44 --> 'Shahrak,Afghanistan,Ghowr,1125896'
48 --> 'Palpalá,Argentina,Jujuy,3842190'
235 --> 'Lashkar Gāh,Afghanistan,Helmand,1134720'
39 --> 'Karukh,Afghanistan,Herat,1137807'пишите
23 --> 'Uíge,Angola,Uíge,2236568'
166 --> 'La Paz,Argentina,Entre Rios,3432079'
240 --> 'Monte Caseros,Argentina,Corrientes,3430598'
121 --> 'Berat,Albania,Berat,3186084'
48 --> 'Amstetten,Austria,Lower Austria,2782555'
206 --> 'Ansfelden,Austria,Salzburg,3323063'
101 --> 'Kuçovë,Albania,Berat,3185060'
43 --> 'Morayfield,Australia,Queensland,2156934'
198 --> 'Río Ceballos,Argentina,Cordoba,3838902'
9 --> 'Esperanza,Argentina,Santa Fe,3856022'
168 --> 'Goris,Armenia,Syunik Province,174895'
119 --> 'Posadas,Argentina,Misiones,3429886'
187 --> 'San Miguel de Tucumán,Argentina,Tucumán,3836873'
89 --> 'San Pedro,Argentina,Jujuy,3836772'
61 --> 'Mādārīpur,Bangladesh,Dhaka,1337245'
1 --> 'Caxito,Angola,Bengo,2242001'
13 --> 'Tres Isletas,Argentina,Chaco,3833794'
192 --> 'Nivelles,Belgium,Wallonia,2790101'
25 --> 'Fier,Albania,Fier,3185672'
5 --> 'Botevgrad,Bulgaria,Sofiya,733014'
239 --> 'Ārt Khwājah,Afghanistan,Takhār,1148106'
41 --> 'Masis,Armenia,Ararat Province,616435'
178 --> 'Schwechat,Austria,Lower Austria,2765388'
Извлечение
~$ python3 chs.py -i stego.csv
Run chs 2018-03-23 11:34:12.443084
Введите пароль: 12345
Извлечённое сообщение:''
Нюансы
Можно ли обнаружить стеганографию? Самый тонкий момент — это "донорский csv". В идеальном случае сгенерировать его самому и после каждого использования — уничтожать. Таким образом если для каждой передачи данных мы будем использовать уникальный и перед стеганографией использовать надёжные криптосистемы, то систему хеш-стеганографии можно считать надёжной.
Так же искомый CSV, желательно не должен подразумевать никакую "упорядоченность". Например данные с треком мыши разумно упорядочить по времени. Что касается файла world-cities.csv, то возможно было бы логично упорядочить либо по странам либо по городам в алфавитном порядке. (Кстати, файл упорядочен по городам;) )
Исходники
Выложил на гитхабе: https://github.com/PavelMSTU/CHS
Это Proof-Of-Concept. Там нет защиты от дурака и очень красивой гуидины.
Спасибо за внимание.
Орфография не моя сильная сторона. Если увидите ошибку — не поленитесь и напишите в личку, пожалуйста.
Автор: PavelMSTU