Хеш-стеганография в dataset-ах. На этот раз быстрая

    Всех с пятницей! В своём прошлом посте про хеш-стеганографию я предложил иной подход в стеганографии — не вкраплять никакой информации в контейнер, а просто упорядочивать контейнеры в нужном порядке и тем самым передавать скрытую информацию. Два дня назад 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 --> '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. Там нет защиты от дурака и очень красивой гуидины.
    Спасибо за внимание.


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

    Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

    Насколько хеш-стеганография в датасетах интересней стеганографии в котиках?
    Поделиться публикацией
    Комментарии 14
      0
      Спасибо, что упомянули мой комментарий! А как насчёт моего предложения (померяться пись?? ми) в плане зажать максимум информации в JPEG? Хороший бы конкурс получился! А ещё если скинуться по полтиннику на приз?!
        +1
        Вы предлагаете стегодуэль? ))
        +1
        Ну с jpeg можно при квантовании некоторые коэффициенты округлять не к ближайшему целому, а к четному/нечетному в зависимости от передаваемого бита. Старшие коэффициенты наверное трогать не стоит — может быть заметно, младшие обнулятся и насильно переводить их в 1 тоже плохо. Но думаю от 1 до 8 битов, в зависимости от параметра качества, в каждый блок 8х8 пикселов можно запихнуть так, что будет визуально незаметно.
        0
        Что мешает использовать обычный текстовый файл? Можно также брать хэши от строк
          +1
          "«донорский csv». В идеальном случае сгенерировать его самому и после каждого использования — уничтожать." — смысл этого теряется. Датасет передается же открытым текстом.

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

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

                Не должно быть исходных кусков. CSV-донор тоже нужно генерировать самостоятельно. В эпоху BigData это не проблема.
                  0
                  И почему это в таком случае менее заметно нежели котики?
                0
                Тогда я вообще перестал схему понимать. И пароль должен быть известен двум сторонам. Соль тоже — значит приравнивается к паролю.

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

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

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

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

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

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

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

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

              Самое читаемое