Стеганография
Давайте предположим, что вы шпион и (как у любого уважающего себя шпиона) у вас на жестком диске имеется много секретной информации. Вам нужно её спрятать так, чтоб никто её не нашел. Причем в случае если вас поймают, то ваш компьютер отдадут на обследование и тот кто будет искать эту информацию будет на 99% уверен, что такая информация на жестком диске есть.
Так какие же способы спрятать информацию есть в нашем распоряжении…
Способ 1 — Банальный
Самый простой способ — это переименовать файл. К примеру у вас есть картинка, которую надо спрятать. Вы просто переименовываете расширение файла и картинка больше не определяется системой как картинка. Но, понятное дело, что это защита от дурака. Если вы, к примеру, переименуете файл JPG в RAR, то такой RAR архив нельзя будет открыть, WinRar поругается на то, что этот архив битый, что вызовет подозрение и более глубокое изучение данного файла.
Способ 2 — Банальный, продвинутый
Ещё один простой способ, но всё же более продвинутый — это склеивание двух разных файлов в один. Простейший пример: добавление RAR архива в конец JPEG изображения. Такое изображение будет без проблем открываться в любой программе для просмотра/редактирования картинок, а также будет открываться и в программе WinRar. Дело в том, что почти все программы для работы с архивами рассчитаны на то, что архив начинается не с начала файла, так как возможно, что архив заключен в самораспаковывающуюся оболочку. Но недостатки данного способа в том, что такое склеивание можно легко заметить. К примеру если картинка имеет размер 200х200 и при этом весит 2 мегабайта, то тут же возникают подозрения. К тому же все форматы (контейнеры) обычно имеют четкую структуру и если вдруг в файле имеется какая то избыточная информация, то это легко обнаружить.
Поэтому нам нужен способ скрытия информации, который не нарушает структуру файла выбранного формата.
Способ 3 — LSB
Как уже писалось ранее, данный способ очень прост в реализации, при этом он не нарушает правила контейнера и файл не хранит избыточную информацию. Но данный способ имеет и не мало минусов. Во-первых он применим лишь к малому количеству контейнеров. К примеру его нельзя применить к формату JPG, MP3 или AVI. А ведь как правило файлы именно этих форматов хранятся сотнями на наших компьютерах и именно там удобнее всего прятать информацию. Лично я сразу заподозрил бы не ладное, найдя на компьютере большую библиотеку картинок в формате BMP. Также этот способ выдает себя с потрохами на изображениях с однородной поверхностью. А попробуйте применить данный метод к MP3 файлу. Изменение всего одного бита раз в 2 и даже более байтов, приведет к неминуемой порче аудио данных.
Для желающих поиграться с этим способом могу предложить плагин для Total Commander'a который позволяет прятать данные в некоторых контейнерах картинок, а также в WAV (при условии, что аудио данные закодированы кодеком PCM).
Также имеются более продвинутые алгоритмы, к примеру алгоритм Коха-Жао, который прячет данные только в картинках. Его отличие в том, что он кодирует один бит информации в блоках 8х8 пикселей. К сожалению, из-за малого количества информации об этом алгоритме в интернете, не могу рассказать о нем что то ещё.
Способ 4 — Мета данные
Очень многие форматы могут хранить определенные мета-данные. Плюс этого способа в том, что он так же не нарушает формат файла, а также работа с этими мета-данными обычно хорошо задокументирована и есть уже готовые библиотеки позволяющие быстро написать программу для хранения своих данных в этих файлах. Почти все медиа-форматы имеют поддержку мета-данных. Однако далеко не всегда там можно хранить данные так, чтоб их не было видно. Так где же можно попробовать хранить секретные данные:
MP3
Только недавно на хабре появился пост Прячем текст в MP3 где описывается реализация на PHP хранении своей информации в тэге ID3v1. Но дело в том, что тэг ID3v1 имеет очень жесткие ограничения и много информации там не сохранить. К тому же в любом нормальном медиа-проигрывателе все ваши данные видны как на ладони. Совсем другое дело тэг ID3v2.4 который позволяет хранить данные гораздо больших размеров, а также позволяет сохранять какие либо не стандартные данные. К примеру некоторые программы хранят там настройки громкости и нормализации для каждого отдельного файла. Медиа-плееры обычно не отображают не известные им параметры.
Раз уж мы говорим об MP3, то стоит упомянуть и про малоизвестный тэг Lyrics3, который был создан для хранения в файле текста песен, а также как расширение тэга ID3v1 (к примеру позволял сохранять более длинное название песни), но выход стандарта тэга ID3v2 так и не дал тэгу Lyrics3 получить широкое распространение. Но как не странно, большое количество MP3 файлов которые сейчас можно найти на просторах интернета, содержат в себе этот тэг (хотя кроме название песни там больше ничего не хранится).
JPEG
У JPEG формата есть поддержка EXIF тэга. Данные в этом тэге хранятся парами ключ=значение. В теории нет никаких проблем добавить туда какой то не стандартный ключ содержащий ваши зашифрованные данные. Программа работающая с этим тэгом, наткнувшись на этот ключ, скорей всего просто проигнорирует его и не отобразит.
AVI
Не многим известно, что файлы формата AVI также имеют поддержку мета-данных, причем хранить там можно много всего. Как и в MP3 и JPEG можно создать какой то свой ключ, который будет просто проигнорирован программами работающими с мета-данными. Могу порекомендовать хорошую программу для просмотра мета-данных AVI файлов: abcAvi Tag Editor
Минус хранения секретных данных в мета-данных файла очевиден, есть множество программ которые отображают абсолютно полностью их содержимое, включая нестандартные и частные значения.
Способ 5
Ну и напоследок хочу рассказать про один замечательный способ хранения секретных данных в MP3 файлах. Реализован он в программе MP3Stego. К сожалению автор данной программы не обновлял проект с 2006 года. Идея заключается в том, что данные сначала шифруются, а затем в сердце процесса кодирования MP3 файла (из WAV) подмешиваются в конечный результат. В итоге получается обычный MP3 файл, без заметных для слуха искажений, однако хранящий в себе закодированные данные.