5/29/2007

Шифрование в Linux: Стеганография

Задача: требуется скрыть сам факт передачи важных данных по открытым каналам связи.
Решение: несколько стеганографических утилит, доступных по лицензии GNU GPL и имеющихся в Debian, помогут решить проблему.

Дистрибутив Дебиан - просто энциклопедия самых разнообразных и чрезвычайно полезных утилит манипулирования данными. А уж программ сокрытия данных в нём просто огромное количество. Вот одна из них - небольшая, но весьма навороченная утилита steghide для стеганографического внедрения данных в рисунки или звуковые файлы.

Стеганография
- в переводе с греческого дословно означает «тайнопись». Это наука о скрытой передаче информации путём сохранения в тайне самого факта передачи. В отличие от криптографии, которая скрывает содержимое секретного сообщения, стеганография скрывает само его существование.

О программе steghide и пойдёт речь далее.

Установка и работа
Для того, чтобы поставить все стеганографические утилиты, что есть в Дебиан, мне потребовалось 4Мб и несколько секунд ожидания. При помощи друга всех дебианщиков, команды apt-get install, было установлено:
outguess - Universal Steganographic tool
stegdetect - Detect and extract steganography messages inside JPEG
steghide - A steganography hiding tool
snowdrop - plain text watermarking and watermark recovery
Чего с лихвой хватит для любых параноидально одержимых приватностью своих данных граждан.

Сокрытие данных
Хотелось бы отметить чрезвычайно подробный и толковый мануал steghide - увлекательнейшее чтиво, где подробно расписываются параметры и рассказывается вкратце, как программа работает и какие алгоритмы использует.
Вдоволь насладившись чтением, приступаем к непосредственно скрыванию своих сокровенных данных в какой-нибудь безобидный рисунок. Например, такой:


Когда я оформлял трудовой контракт, меня попросили написать свою краткую автобиографию - чем не конфиденциальные данные? Файл сохранился, вот его и внедрю в картинку - благо это простой текст, форматирования нет.
Для этого нужно набрать команду:
$ steghide embed -ef autobio.txt -cf MacOS.jpg -sf MacOShide.jpg
То есть внедряем файл autobio.txt (ключ -ef, embed file) внутрь рисунка MacOS.jpg (ключ -cf, cover file), в результате чего имеем рисунок со внедрённым стего под названием MacOShide.jpg (ключ -sf, stego file). При этом прогамма спросит дважды пароль:
Enter passphrase:
Re-Enter passphrase:
embedding "autobio.txt" in "MacOS.jpg"... done
writing stego file "MacOShide.jpg"... done
Всё готово, вот в этом рисунке весь мой жизненный путь за четверть века :-)

Для того, чтобы снова иметь возможность прочесть скрытый текст, извлекаем его оттуда:
$ steghide extract -sf MacOShide.jpg -xf autobio2.txt
То есть извлечь из стего-файла MacOShide.jpg скрытую информацию в файл autobio2.txt (ключ -xf, extract file). Утилита будет лаконична:
Enter passphrase:
wrote extracted data to "autobio2.txt".
Готово, файл записан.

Небольшое исследование
Кто умеет читать маны, мог почерпнуть тоже, читая пример в коце man steghide. Но мне стало интересно, насколько изменился рисунок не визуально, а количественно. Для этого люди, занимающиеся обработкой изображений, традиционно применяют среднеквадратическое отклонение между двумя изображениями. Вооружившись исчерпывающий статьёй Финапа [1] и реализовав её в MATLAB, вычисляем разницу:
>> kmvRMSandnorm('MacOS.jpg', 'MacOShide.jpg')

ans =

0.0032
Да, ну разумеется, такую разницу в изображении мы не увидим, даже если будем пристально вглядываться: всего отличие всего лишь на 0.32%! Отличия между изображениями можно увидеть, не сильно напрягаясь, где-то при 3-5%.
Ну и разумеется, что контрольная сумма файла изменилась:
$ md5sum MacOS.jpg
da6d7d25d5560fb22eb9d2f6ca09417f MacOS.jpg

$ md5sum MacOShide.jpg
87a02d9714ed43f49d2aeb37c4e75d94 MacOShide.jpg
Так что изменения, конечно, есть, но очень небольшие - на глаз не заметить, так что можно смело переправлять личную информацию по электронной почте, даже если её просматривает злобный админ.

Литература
[1] Fienup, J. Invariant error metrics for image reconstruction, Applied Optics, 32, 1997, 36, 8352-57
[2] Стеганография. Прячем секреты Dru Lavigne

22 комментария:

  1. Интересненько! Дедушка Ленин был бы рад, а то все молоком да на полях...
    Надо будет поэкспериментировать с размерами исходных jpg и txt на предмет сколько текста можно впихнуть в картинку. И что будет если jpg с текстом пересохранить, например, gimp'ом?

    ОтветитьУдалить
  2. 2 Анонимный пишет...
    Надо будет поэкспериментировать с размерами исходных jpg и txt на предмет сколько текста можно впихнуть в картинку.
    По идее, чем больше впихнуть в картинку текста, тем заметнее отличие. Но я больше не пробовал...

    И что будет если jpg с текстом пересохранить, например, gimp'ом?
    Если в ней ничего не менять - по идее, ничего и не произойдёт. Но если сохранить с другим типом сжатия - должно перестать восстанавливаться. Спасибо за идею - надо будет попробовать.

    ОтветитьУдалить
  3. И что будет если jpg с текстом пересохранить, например, gimp'ом?

    IMHO, при каждом сохранении jpg-а происходит пересчет, так что скорее всего данные будут потеряны.

    ОтветитьУдалить
  4. а как же ключи шифрования?

    и вообще-то, логично было бы указать исходные размеры файлов (графического и текстового) и конечного!
    poooch

    ОтветитьУдалить
  5. Статья как всегда интересная. Потешу свою паранойю :)

    ОтветитьУдалить
  6. Очень интересно, спасибо. А если встраивать сообщение в звуковой файл?

    ОтветитьУдалить
  7. Тут спрашивали про изменение размера файлов. Вот пример:

    -rw-r--r-- 1 nik nik 88K 2007-05-29 19:37 12hide.jpg
    -r--r--r-- 1 nik nik 83K 2007-05-29 19:35 12.jpg
    -rw-r--r-- 1 nik nik 59K 2007-05-29 19:39 12out.jpg

    12.jpg оригинальный файл, файл 12hide.jpg содержащий послание от steghide подрос на 5 килобайт, а вот 12out.jpg, содержащий то же самое послание но внедренное при помощи outguess уменьшился в размере на 24 килобайта, то есть почти на треть.

    Да, ни одно внедрение не было обнаружено программой stegdetect.

    ОтветитьУдалить
  8. Простейшую тулзу писал в универе...текст запихивала в обычный HTML =)
    И текста не было видно даже в исходнике - всё дело в волшебных пробелах =)

    ОтветитьУдалить
  9. Кстати не думал об этом. Вернее пару раз мелькала мысль посмотреть, как это работает, но какая-то она вялая была ;)
    А ведь я админ. И именно почтовый :)
    Все, спасибки за наводку. После мелкософтового семинара поковыряю :)
    ...
    Стоп. Не, не поковыряю. После отпуска поковыряю ;)

    ОтветитьУдалить
  10. 2 Дмитрий пишет...
    А если встраивать сообщение в звуковой файл?
    Можно, только не этой программой :-) Но вообще такие системы есть.

    2 Nikolay пишет...
    Да, ни одно внедрение не было обнаружено программой stegdetect.
    Обнаруживается, только stegdetect нужно поставить дополнительный параметр --с-пристрастием :-))
    О наличии стеганограммы оно сообщит - жаль, выудить не может. Почтовым админам, отписывавшимся в комментариях, на заметку ;-)


    2 pento пишет...
    Простейшую тулзу писал в универе...текст запихивала в обычный HTML
    Есть тулзы и покруче - одна из них есть в Дебиане и называется snowdrop. Принцип, насколько я могу понять, тот же. Только с кириллицей не дружит.

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

    Сейчас переполз на Этч и посты будут уже в духе современного состояния софта. Старые посты тоже буду править - вот только жара немного спадёт...

    ОтветитьУдалить
  11. Это что ещё за опция? Я безуспешно пробовал -t o использовать для стеганограммы от outguess, например.

    ОтветитьУдалить
  12. ЗА всю стеганографию не скажу, но по поводу большого количества реализаций недавно было серьезное исследование, в результате которого была выработана четкая методика выявления картинок с текстом.

    ОтветитьУдалить
  13. некоторые картинки можно распаковывать RARом... и получать различные файлы

    ОтветитьУдалить
  14. Если отправлять фото с цифрового фотоаппарата, то лучше всего, чтобы размер фото остался исходным, т.к. фотоаппараты клепают фото одинакового размера. Или я не прав?

    ОтветитьУдалить
  15. В который раз убеждаюсь - насколько хорош Дебиан. Спасибо за статью. Очень интересно.
    Да, так вот и знакомимся с софтом, который есть в этом дистре: то в журнале вычитаешь про интересную прогу, то в Инете че-нить найдешь... глядь, а это есть в твоем репозитории. Класс!
    Непонятно, тока как могут лоровцы говорить, мол "эта статья - Дешёвая пропаганда Debian'а?" и тому подобное.. :)
    Сорри за оффт.

    ОтветитьУдалить
  16. Кошмар, на ЛОР протащили... За что!? :-)


    2 Nikolay пишет...
    Это что ещё за опция? Я безуспешно пробовал -t o использовать для стеганограммы от outguess, например.
    Оно стеганограмму определяет, но не может её выудить. Жаль. Надо этчевскую версию поставить и поглядеть.

    2 GQ пишет...
    ЗА всю стеганографию не скажу, но по поводу большого количества реализаций недавно было серьезное исследование, в результате которого была выработана четкая методика выявления картинок с текстом.
    Любопытно. Вот бы ссылочку кинуть. :-)


    2 Анонимный пишет...
    В который раз убеждаюсь - насколько хорош Дебиан.
    Он не хорош, он "просто работает".

    Да, так вот и знакомимся с софтом, который есть в этом дистре: то в журнале вычитаешь про интересную прогу, то в Инете че-нить найдешь... глядь, а это есть в твоем репозитории. Класс!
    Именно. Я вот когда прочитал, кто написал foremost - чуть в обморок не упал.

    Непонятно, тока как могут лоровцы говорить, мол "эта статья - Дешёвая пропаганда Debian'а?"
    Ананимусы на ЛОРе зажигают как всегда. Только сегодня узнал с утра - подумал, что ещё сплю. Оказалось хуже :-)

    ОтветитьУдалить
  17. А результат? хочется увидеть насколько картинка модифицируется, или боитесь за потерю персональных данных? :)

    ОтветитьУдалить
  18. 2 axet пишет...
    А результат?
    Точно такая же картинка на вид. Я ж писал про среднеквадратическое отклонение - ничем его не разглядеть.

    боитесь за потерю персональных данных? :)
    Именно: у ЛОРовских криптоаналитиков длинные руки :-)

    ОтветитьУдалить
  19. Да надо заливать текст в картинки BMP - там попиксильная информация, а значит, если к примеру, менять один-два бита (лучше младшие) в каждом пикселе (его цвете), то тут никакя прога не вычислит наличие стенограммы - кто его знает, мож исходный файл в фотошопе на цвет подкорректировали.. и визуально такое изменение не определишь, а потом его можно сжать просто заархивировав, размер получится почти как у jpg'а при хорошеим сжатии.

    ОтветитьУдалить
  20. Ногами не пинать плизик :)
    А что есть брать rnd-rbg картинку (каждый пиксель случаен) и налеплять на нее данные в base64?

    p.s. в свое время почти так со старой работы вынес (правда на ~5 листках по 3 копии) вынес смарт-ключ от их системы но там уже известная картинка (ну блин... просто мне его не давали домой а туда надобыло часто бегать работать)

    ОтветитьУдалить
  21. Интересная мысль про потерю данных при сжатии картинки. Можно все исходящие пикчерсы, прикрепленные к письмам, пережимать... Как один из методов борьбы :)

    ОтветитьУдалить
  22. У меня после внедрения сообщения в файл размер стего-файла оказался меньше исходного. Интересный эффект. Думаю это результат слишком короткого сообщения (всего одна строка).

    ОтветитьУдалить