Всех с пятницей! В своём прошлом посте про хеш-стеганографию я предложил иной подход в стеганографии — не вкраплять никакой информации в контейнер, а просто упорядочивать контейнеры в нужном порядке и тем самым передавать скрытую информацию. Два дня назад romabibi опубликовал proof of consept для хеш-стеганографии в соц.сети вКонтакте.


Однако в использовании картинок как контейнеров есть важный изьян. Цитирую коммент alekseev_ap:


Всё это очень интересно, но КПД такой системы чрезвычайно низкий. Сколько надо отправить десятков (а то и сотен) килобайт чтобы передать строку из нескольких слов?!

Действительно, если изображение весит условно 0.5 — 2 Мбайт, а на каждое изображение мы передаем от 1 до 3 нибллов, то получаемая скорость очень мала: от 0.5 до 6 B/MB


Поэтому для практического применения нужно найти такой контейнер, который обладал бы следующими свойствами:


  1. был бы очень мал;
  2. при большом количестве контейнеров, стоящие друг за другом; не вызывал бы "подозрений";
  3. при смене порядка контейнеров, они бы не вызывали "подозрение".

Итак, капитан-очевидность решение: необходимо осуществлять хеш-стеганографию в больших датасетах. Одна строка — один ниббл (полубайт).



Gif-анимация, показывающая суть хеш-стеганографии в датасетах. Разумеется на практике нужно сжать и зашифровать перед стеганографией



Идея


Идея проста и очевидна:


  1. Берём очень большой датасет с данными.
  2. Хешируем каждую строку, берем первые n бит данных — это набор контейнеров для хеш-стеганографии
  3. Сообщение сжимаем, шифруем, разбиваем на блоки по n бит
  4. Упорядочиваем в соотвествии с передаваемым сообщением.

Пример 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 --> 'Qarqin,Afghanistan,Jowzjan,1129516'
94 --> 'Arroyo Seco,Argentina,Santa Fe,3865385'
44 --> 'Shahrak,Afghanistan,Ghowr,1125896'
48 --> 'Palpala,Argentina,Jujuy,3842190'
235 --> 'Lashkar Gah,Afghanistan,Helmand,1134720'
39 --> 'Karukh,Afghanistan,Herat,1137807'пишите
23 --> 'Uige,Angola,Uige,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 --> 'Kucove,Albania,Berat,3185060'
43 --> 'Morayfield,Australia,Queensland,2156934'
198 --> 'Rio 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 Tucuman,Argentina,Tucuman,3836873'
89 --> 'San Pedro,Argentina,Jujuy,3836772'
61 --> 'Madaripur,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 --> 'Art Khwajah,Afghanistan,Takhar,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. Там нет защиты от дурака и очень красивой гуидины.
Спасибо за внимание.


Орфография не моя сильная сторона. Если увидите ошибку — не поленитесь и напишите в личку, пожалуйста.

Комментарии (14)


  1. alekseev_ap
    23.03.2018 13:33

    Спасибо, что упомянули мой комментарий! А как насчёт моего предложения (померяться пись?? ми) в плане зажать максимум информации в JPEG? Хороший бы конкурс получился! А ещё если скинуться по полтиннику на приз?!


    1. PavelMSTU Автор
      23.03.2018 13:40
      +1

      Вы предлагаете стегодуэль? ))


      1. alekseev_ap
        23.03.2018 21:09

        Почему бы и нет?


    1. paluke
      23.03.2018 14:38

      Ну с jpeg можно при квантовании некоторые коэффициенты округлять не к ближайшему целому, а к четному/нечетному в зависимости от передаваемого бита. Старшие коэффициенты наверное трогать не стоит — может быть заметно, младшие обнулятся и насильно переводить их в 1 тоже плохо. Но думаю от 1 до 8 битов, в зависимости от параметра качества, в каждый блок 8х8 пикселов можно запихнуть так, что будет визуально незаметно.


  1. lancerx
    23.03.2018 13:37

    Что мешает использовать обычный текстовый файл? Можно также брать хэши от строк


  1. nchaly
    23.03.2018 13:38
    +1

    "«донорский csv». В идеальном случае сгенерировать его самому и после каждого использования — уничтожать." — смысл этого теряется. Датасет передается же открытым текстом.

    Хотел спросить — а не лень ли автору будет сделать небольшой скрипт для брутфорс взлома? Тогда и можно будет оценить защищенность.


    1. PavelMSTU Автор
      23.03.2018 13:43
      -1

      Как вы себе представляете брутфорс?
      Я же к паролю добавляю соль, потом получаю ключ с помощью хеширования. Этим ключом шифрую информацию. А уже потом стеганография.

      Следовательно если пароль «хороший» (а не 12345) и криптуха «хорошая» и соль «хорошая», то никакого брутфорса быть не может…


      1. domix32
        23.03.2018 14:34

        Есть мнение что наборы данных вполне могут оказаться упорядоченными, например. Или найти исходный кусок данных и зареверсить видится мне делом техники.


        1. PavelMSTU Автор
          23.03.2018 14:39

          найти исходный кусок данных

          Не должно быть исходных кусков. CSV-донор тоже нужно генерировать самостоятельно. В эпоху BigData это не проблема.


          1. domix32
            23.03.2018 22:36

            И почему это в таком случае менее заметно нежели котики?


      1. nchaly
        23.03.2018 18:33

        Тогда я вообще перестал схему понимать. И пароль должен быть известен двум сторонам. Соль тоже — значит приравнивается к паролю.

        Объясняю подход к брутфорсу: Если я перехватил в процессе передачи ваш файл, то все равно, какой был изначачальный порядок. Теперь мне надо просто посчитать хэши строк, взять первые n бит, и попробовать получить вменяемый текст. И так я делаю для разных «паролей», пока не получу что-то читаемое. Вроде несложно…


        1. PavelMSTU Автор
          23.03.2018 20:29

          Ключевая фраза:

          И так я делаю для разных «паролей», пока не получу что-то читаемое. Вроде несложно…

          А почему вы слово пароль взяли в кавычки?

          Ещё раз:
          сжатие --> шифрование --> хеш-стеганография.

          Предлагаю вам простую комбинаторную задачку.
          Дано: неизвестный пароль состоит из 30 символов в алфавите: А-Я, а-я, A-Z, a-z, 0-9, !, @, #, $, %, ^, &, *,, \, `, [, ], ;, :, ', ", <, >, ?, /, |.

          Вопрос: сколько потребуется времени для перебора:
          1. на вашем ноутбуке?
          2. на всех серваках вашей организации?


          1. nchaly
            23.03.2018 20:56

            Хм… ясно. Неясно, зачем стеганография. Можно просто шифровать и передавать. Чтобы запутать злоумышленника, передавай рандомный мусор, для надежности обернув его в тэг <мусор>, чтобы твой партнер его игнорировал, да и все).


  1. TrllServ
    23.03.2018 22:28

    Я вот уже 3й пост смотрю и не могу понять — критерии какие?
    Если это все же скрытая передача — тогда не надо мудрить с паролями и солью, это ж не обычное шифрование.
    Поставьте конкретное условие, и уже потом решения. Например:
    Сделать способ передачи инфы который не заметен человеком, а перебор автоматикой с достаточной точностью делал бессмысленным невозможным по времени. (примерно такое было в прошлых каментах)

    Шифрование в таком случае должно терять своё первоначальное назначение и если используется, то для целей энтропии.