cтеганография в *nix

Меня всегда увлекали алгоритмы. Сама их концепция. Немного математики - и можно сжать изображение, звук или видео. Или отследить, куда именно запишутся файлы на винчестере. Или, может быть, смешать два файла так, чтобы только мой потенциальный адресат смог расшифровать их. Представьте, я даже не претендую на то, чтобы понимать, какая математика стоит за этими алгоритмами. Но меня успокаивает то, что в этом мире есть люди, которые понимают, и их действия помогают поддерживать компьютеры в рабочем состоянии.

В этой статье я расскажу вам кое что о стеганографии, используя для демонстрации два кросс-платформенных приложения (примеры из этой статьи выполнялись под FreeBSD). Попутно мы также обнаружим некоторые интересные характеристики алгоритмов сжатия.

совсем немного теории

Итак, для начала, что же такое стеганография?

Термин стеганография происходит от греческих слов, обозначавших скрытую запись. Если в детстве вы когда-либо писали невидимое сообщение лимонным соком (или молоком, как дедушка Ленин - прим. переводчика) и давали друзьям, чтобы они прогревали его около лампочки для того, чтобы наблюдать, как чудесным образом появляется сообщение, вы использовали стеганографию.

При использовании стеганографии в компьютере, вы прячете сообщение в другом файле. Такой файл называют "стего-файл". Особенность компьютерной стеганографии в том, что надо выбрать файл, способный скрыть сообщение. Изображения - звуковые или видеофайлы - идеальны по нескольким причинам: - эти типы файлов уже сжаты некоторым алгоритмом. Например, .jpeg, .mp3, .mp4, и .wav форматы - все это примеры алгоритмов сжатия;

- эти файлы достаточно велики, что облегчает задачу нахождения участков, способных скрыть какой-либо текст;

- эти файлы замечательно скрывают. Если стеганографическая утилита делает свою работу хорошо, пользователь не обратит внимания на различие в качестве изображения или звука, даже если некоторые биты изменены для того, чтобы скрыть сообщение.

Если вы новичок в стеганографии, вы можете найти интересные статьи на сайте Steganography and Digital Watermarking.

элементарные вещи

Порт outguess состоит из нескольких утилит, которые я продемонстрирую. Не все они связаны непосредственно со стеганографией, некоторые использованы для манипуляции с jpeg-изображениями. Вы можете найти больше информации об этих утилитах в JPEGclub.org.

Итак, давайте построим порт:

$ cd /usr/ports/security/outguess
$ make install clean

Существует неплохая документация на outguess и сопутствующие утилиты. Порт установит /usr/local/share/doc/README, а также страницы man для следующих утилит: outguess, cjpeg, djpeg, jpegtran, rdjpgcom, и wrjpgcom.

Поскольку набор приложений outguess первоначально создавался для работы с jpeg-образами, вы можете обратиться к JPEG FAQ и Compression FAQ, что может быть полезно для быстрого начала работы.

Я начну с утилит rdjpgcom и wrjpgcom. Знали ли вы, что стандарт JPEG содержит COM, или блок комментариев, включаемый в JPEG-изображение? Когда я впервые узнала это, я просто умирала от любопытства, какие скрытые комментарии содержат файлы JPEG на моем винчестере. К счастью, у меня было средство rdjpgcom, так что я могла прочитать комментарии моих JPG:

$ cd ~/images
$ rdjpgcom pic1.jpg
$ rdjpgcom pic2.jpg

Я была несколько разочарована, когда узнала, что большинство моих JPEG-ов совсем не имели сообщения. Только в одном оно сообщало, что изображение было создано, используя VT-Compress (tm) Xing Technology Corp. а в другом, что это "Created with The GemMP". К счастью, я могла изменить эту ситуацию, используя утилиту wrjpgcom, чтобы записывать свои собственные комментарии в JPG:

$ wrjpgcom -comment "This picture was taken on my June 2003 canoeing trip" pic1.jpg >pic1a.jpg

Убедитесь, что вы даете свежепрокомментированному файлу другое имя, или вы закончите с пустым исходным файлом.Теперь, если я проверю результаты:

$ rdjpgcom pic1a.jpg
Created with The GemMP
This picture was taken on my June 2003 canoeing trip

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

Если я хочу удалить предыдущий комментарий GemMP, мне нужно использовать ключ -replace вместо ключа -comment.

Если я взгляну на изображения, например, с помощью gimp, я не увижу между ними никакой разницы. Давайте поищем другие различия:

$ ls -l pic1*
-rw-r--r-- 1 dlavigne6 wheel 6817 Nov 15 14:36 pic1.jpg
-rw-r--r-- 1 dlavigne6 wheel 6873 Nov 15 14:36 pic1a.jpg

Что ж, файл с комментариями несколько больше. А вот утилита file не показывает никакой разницы:

$ file pic1* pic1.jpg: JPEG image data, JFemF standard 1.01,
resolution (DPem), "Created with The GemMP", 72 x 72
pic1a.jpg: JPEG image data, JFemF standard 1.01,
resolution (DPem), "Created with The GemMP", 72 x 72

прячем больше данных

Давайте, продолжим развитие этой идеи и спрячем в JPEG-файле полный текстовый файл. Скажем, я хочу спрятать бабушкин рецепт печенья с шоколадными крошками. Сейчас он находится в cookie.txt:

$ ls -l cookie.txt
-rw-r--r-- 1 dlavigne6
wheel 296 Nov 15 14:56 cookie.txt

У меня также есть фотография моей бабушки, которая и дала мне этот рецепт, когда она была много моложе:

$ ls -l gramma.jpg
-rw-r--r-- 1 dlavigne6 wheel 50873 Sep 5
09:13 gramma.jpg

Давайте посмотрим, что случится, если я спрячу рецепт в изображении:

$ outguess -k "don't worry, the recipe is safe" -d
cookie.txt gramma.jpg grandma.jpg

Давайте взглянем на синтаксис. За ключом -k следует кодовая фраза, ограниченная двойными кавычками. Мне нужно запомнить ее, если я хочу в будущем извлечь этот рецепт. Затем я использовала ключ -d, чтобы указать имя файла, который будет скрыт (cookie.txt), затем имя файла, в котором мы будем скрывать (gramma.jpg), и имя нового стего-файла (grandma.jpg). Когда я ввела эту команду, я получила следующий вывод:

Reading gramma.jpg.... JPEG compression quality set to 75
Extracting usable bits: 55365 bits Correctable message size: 25855
bits, 46.70% Encoded 'cookie.txt': 2368 bits, 296 bytes Finding best
embedding... 0: 1219(50.8%)[51.5%], bias 1301(1.07), saved: -4,
total: 2.20% 1: 1215(50.6%)[51.3%], bias 1235(1.02), saved: -3,
total: 2.19% 5: 1192(49.7%)[50.3%], bias 1241(1.04), saved: -1,
total: 2.15% 7: 1164(48.5%)[49.2%], bias 1217(1.05), saved: 2,
total: 2.10% 13: 1155(48.1%)[48.8%], bias 1176(1.02), saved: 3,
total: 2.09% 25: 1163(48.5%)[49.1%], bias 1156(0.99), saved: 2,
total: 2.10% 28: 1141(47.5%)[48.2%], bias 1145(1.00), saved: 5,
total: 2.06% 28, 2286: Embedding data: 2368 in 55365 Bits embedded: 2400,
changed: 1141(47.5%)[48.2%], bias: 1145, tot: 55200, skip: 52800
Foiling statistics: corrections: 499, failed: 0, offset: 46.129114 +-142.525859
Total bits changed: 2286 (change 1141 + bias 1145)
Storing bitmap into data... Writing grandma.jpg....

Если теперь я открою оба JPEG-файла и, поставив их бок о бок, буду сравнивать, мне будет трудно найти различия между ними. Это вполне ожидаемо, поскольку файл, который мы прячем, очень мал (296 bytes) по сравнению с файлом-контейнером (50873 bytes). Забавно, но размер нового изображения меньше оригинального:

$ ls -l grandma.jpg
-rw-r--r-- 1 dlavigne6 wheel 50415 Nov 15 15:04 grandma.jpg

извлечение скрытого файла

Чтобы извлечь скрытый файл, мне понадобится ключ -r:

$ outguess -k "don't worry, the recipe is safe" -r grandma.jpg test.txt
Reading grandma.jpg....
Extracting usable bits: 55365 bits
Steg retrieve: seed: 28, len: 296

Нужно использовать тот же ключ или кодовую фразу, которая была использована при скрытии сообщения. Если я прочитаю получившийся файл test.txt, то увижу рецепт в целости и сохранности.

Утилита outguess скрывает сообщения в файлах .jpeg, .ppm, и .pnm. Если у вас есть изображение .bmp, в котором вы хотите спрятать файл, используйте утилиту cjpeg, для преобразования его в JPEG:

$ cjpeg santa.bmp >test.jpeg

На мой невооруженный взгляд, оба файла в gimp выглядят одинаково. Теперь я могу использовать этот jpeg с утилитой outguess.

Утилита djpeg, что неудивительно, преобразует файл обратно; из JPEG в любой требуемый формат:

$ djpeg -bmp frosty.jpeg >icicle.bmp
$ djpeg -gif frosty.jpeg >icicle.gif

Обе утилиты имеют несколько ключей, позволяющих контролировать качество изображения. Подробности смотрите в их man-страницах.

steghide

Перейдем ко второму решению - утилите steghide. Эта утилита устанавливает man steghide, равно как и информацию в /usr/local/share/doc/steghide/README.
Мне нравится outguess, поскольку с ним идут утилиты для манипуляций с JPEG-файлами. Мне нравится steghide, поскольку, при несколько более значительном синтаксисе, он поддерживает больше файловых форматов (.jpeg, .bmp, .wav, и .au) и позволяет задать алгоритм шифрования. Снова прячем рецепт. Взгляните что получится, если я спрячу этот рецепт в WAV-файл:

$ steghide embed -cf hohoho.wav -ef cookie.txt -sf new.wav
Enter passphrase:
Re-Enter passphrase:
embedding "cookie.txt" in "hohoho.wav"... done%
writing stego file "new.wav"... done

Эти ключи имеют следующие значения, для определения трех типов файлов:
-cf - coverfile - файл-контейнер;
-ef - embedded file – встраеваемый файл;
-sf - stegofile – результирующий или стего-файл.
Если я прослушаю оба файла - как файл-контейнер, так и стего-файл - в xmms, я не смогу услышать разницу в качестве звучания. Во всяком случае я никогда не находила большой разницы в WAV-файлах.

Когда я захочу извлечь рецепт из стего-файла, я использую утилиту extract:

$ steghide extract -sf new.wav
Enter passphrase:
wrote extracted data to "cookie.txt".

Или так:

$ steghide extract -sf new.wav -xf secret.txt
Enter passphrase:
wrote extracted data to "secret.txt".

В первом случае, рецепт будет извлечен в файл с тем же именем, под каким и скрывался, во втором, я задаю новое имя для извлечения.

Команда steghide info очень полезна. Она сообщает, содержит ли файл скрытые данные (но, насколько я знаю, только в файлах, созданных steghide):

$ steghide info new.wav
"new.wav":
format: wave audio, PCM encoding
capacity: 1.9 KB
Try to get information about embedded data ? (y/n) y
Enter passphrase:
embedded file "cookie.txt":
size: 296.0 Byte
encrypted: rijndael-128, cbc
compressed: yes

Обратите внимание, что алгоритм шифрования по умолчанию - Rijndael, также называемый AES, 128 бит. Чтобы посмотреть, какие еще шифровальные алгоритмы доступны, делаем так:

$ steghide encinfo
encryption algorithms:
:...
cast-128: cbc cfb ctr ecb ncfb nofb ofb
gost: cbc cfb ctr ecb ncfb nofb ofb
rijndael-128: cbc cfb ctr ecb ncfb nofb ofb
twofish: cbc cfb ctr ecb ncfb nofb ofb
arcfour: stream
cast-256: cbc cfb ctr ecb ncfb nofb ofb
loki97: cbc cfb ctr ecb ncfb nofb ofb
rijndael-192: cbc cfb ctr ecb ncfb nofb ofb
saferplus: cbc cfb ctr ecb ncfb nofb ofb
wake: stream
des: cbc cfb ctr ecb ncfb nofb ofb
rijndael-256: cbc cfb ctr ecb ncfb nofb ofb
serpent: cbc cfb ctr ecb ncfb nofb ofb
xtea: cbc cfb ctr ecb ncfb nofb ofb
blowfish: cbc cfb ctr ecb ncfb nofb ofb
enigma: stream
rc2: cbc cfb ctr ecb ncfb nofb ofb
tripledes: cbc cfb ctr ecb ncfb nofb ofb

Ух ты, сколько поддерживаемых алгоритмов. Чтобы выбрать другой алгоритм, просто используйте ключ -e в конце команды embed. В этом примере я выберу blowfish:

$ steghide embed -cf hohoho.wav -ef cookie.txt -sf new.wav -e blowfish

вывод

Надеюсь, это поможет вам начать пользоваться стеганографическими утилитами. Единственный вопрос, который вы можете себе задать вопрос - зачем мне все это? Может быть для того, чтобы хранить пароли. Все мы знаем, что для разных задач нужны разные пароли. К примеру, вам нужны пароли для доступа к компьютеру, для электронной почты, для электронного банкинга и еще для аккаунта на веб-сервере. Если вы администратор – прибавьте к этому еще минимум пяток различных паролей. Очень удобно хранить их все в текстовом файле, защищенном паролем и спрятанном в том месте, где его никто и не подумает искать.



Dru Lavigne, перевод Евгения Чайкина aka StraNNick.


Сетевые решения. Статья была опубликована в номере 06 за 2005 год в рубрике sysadmin

©1999-2024 Сетевые решения