Стеганография в Linux. Как спрятать информацию внутри изображения?

Стеганогра́фия (от греч. στεγανός — скрытый + γράφω — пишу; буквально «тайнопись») — это наука о скрытой передаче информации путём сохранения в тайне самого факта передачи. Этот термин ввел в 1499 году Иоганн Тритемий в своем трактате «Стеганография» (Steganographia), зашифрованном под магическую книгу.

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

Преимущество стеганографии над чистой криптографией состоит в том, что сообщения не привлекают к себе внимания. Сообщения, факт шифрования которых не скрыт, вызывают подозрение и могут быть сами по себе уличающими в тех странах, в которых запрещена криптография.[1] Таким образом, криптография защищает содержание сообщения, а стеганография защищает сам факт наличия каких-либо скрытых посланий – Wikipedia.

Steghide

Steghide – это утилита командной строки (как и подавляющее большинство в Linux ^_^) которая позволяет спрятать информацию внутри аудио или фото файлов. Она так же умеет сжимать и шифровать информацию которую прячут.

С установкой все понятно:

sudo apt-get install steghide
sudo apt-get install steghide

Начальный размер файла:

-rw-rw-r-- 1 booch booch 159K Feb  4 11:25 kote_original.jpg
-rw-rw-r-- 1 booch booch 159K Feb  4 11:25 kote_original.jpg

Первый пример. Прячeм текстовый файл внутрь изображения:

steghide embed -cf kote.jpg -ef secrettext.txt 
Enter passphrase: 
Re-Enter passphrase: 
embedding "secrettext.txt" in "kote.jpg"... done
steghide embed -cf kote.jpg -ef secrettext.txt 
Enter passphrase: 
Re-Enter passphrase: 
embedding "secrettext.txt" in "kote.jpg"... done

Размер файла после того, как спрятали там инфу:

-rw-rw-r-- 1 booch booch 161K Feb  4 11:01 kote.jpg
-rw-rw-r-- 1 booch booch 161K Feb  4 11:01 kote.jpg

Поддерживаемые расширения: AU, BMP, JPEG, WAV
Извлечь наш текстовый файлик обратно можно так:

steghide extract -sf kote.jpg 
Enter passphrase: 
wrote extracted data to "secrettext.txt".
steghide extract -sf kote.jpg 
Enter passphrase: 
wrote extracted data to "secrettext.txt".

Получить информацию о том, каков размер спрятанного текста внутри картинки, какое использовалось шифрование, можно так:

steghide info kote.jpg 
 
"kote.jpg":
  format: jpeg
  capacity: 8.7 KB
Try to get information about embedded data ? (y/n) y
Enter passphrase: 
  embedded file "secrettext.txt":
    size: 668.0 Byte
    encrypted: rijndael-128, cbc
    compressed: yes
steghide info kote.jpg 

"kote.jpg":
  format: jpeg
  capacity: 8.7 KB
Try to get information about embedded data ? (y/n) y
Enter passphrase: 
  embedded file "secrettext.txt":
    size: 668.0 Byte
    encrypted: rijndael-128, cbc
    compressed: yes

Сама утилита поддерживает кучу алгоритмов шифрования:

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
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

В принципе это все. Немного более подробная информация имеется на официальной странице.

OutGuess

OutGuess – утилита еще более умная и хитрая =) Она умеет находить и извлекать избыточные биты из изображения, после чего подменять их на полезные биты с информацией которую вы пытаетесь скрыть. Это усложняет сам факт обнаруженя “левой” информации внутри файла, неговоря уже о ее рашифровке и извлечении.

Установка:

sudo apt-get install outguess
sudo apt-get install outguess

Например встроить текст можно так:

outguess -d secrettext.txt kote.jpg kote_with_info.jpg 
 
Reading kote.jpg....
JPEG compression quality set to 75
Extracting usable bits:   139430 bits
Correctable message size: -7731 bits, 13230110958157824.00%
Encoded 'secrettext.txt': 5344 bits, 668 bytes
Finding best embedding...
    0:  2696(50.1%)[50.4%], bias  3007(1.12), saved:    -3, total:  1.93%
    1:  2659(49.5%)[49.8%], bias  2887(1.09), saved:     1, total:  1.91%
    3:  2685(49.9%)[50.2%], bias  2857(1.06), saved:    -1, total:  1.93%
    4:  2658(49.4%)[49.7%], bias  2883(1.08), saved:     1, total:  1.91%
    5:  2637(49.1%)[49.3%], bias  2880(1.09), saved:     4, total:  1.89%
    7:  2654(49.4%)[49.7%], bias  2800(1.06), saved:     2, total:  1.90%
   12:  2610(48.5%)[48.8%], bias  2776(1.06), saved:     7, total:  1.87%
  231:  2596(48.3%)[48.6%], bias  2773(1.07), saved:     9, total:  1.86%
231, 5369: Embedding data: 5344 in 139430
Bits embedded: 5376, changed: 2596(48.3%)[48.6%], bias: 2773, tot: 139230, skip: 133854
Foiling statistics: corrections: 1846, failed: 19, offset: 54.856988 +- 148.271820
Total bits changed: 5369 (change 2596 + bias 2773)
Storing bitmap into data...
Writing kote_with_info.jpg....
outguess -d secrettext.txt kote.jpg kote_with_info.jpg 

Reading kote.jpg....
JPEG compression quality set to 75
Extracting usable bits:   139430 bits
Correctable message size: -7731 bits, 13230110958157824.00%
Encoded 'secrettext.txt': 5344 bits, 668 bytes
Finding best embedding...
    0:  2696(50.1%)[50.4%], bias  3007(1.12), saved:    -3, total:  1.93%
    1:  2659(49.5%)[49.8%], bias  2887(1.09), saved:     1, total:  1.91%
    3:  2685(49.9%)[50.2%], bias  2857(1.06), saved:    -1, total:  1.93%
    4:  2658(49.4%)[49.7%], bias  2883(1.08), saved:     1, total:  1.91%
    5:  2637(49.1%)[49.3%], bias  2880(1.09), saved:     4, total:  1.89%
    7:  2654(49.4%)[49.7%], bias  2800(1.06), saved:     2, total:  1.90%
   12:  2610(48.5%)[48.8%], bias  2776(1.06), saved:     7, total:  1.87%
  231:  2596(48.3%)[48.6%], bias  2773(1.07), saved:     9, total:  1.86%
231, 5369: Embedding data: 5344 in 139430
Bits embedded: 5376, changed: 2596(48.3%)[48.6%], bias: 2773, tot: 139230, skip: 133854
Foiling statistics: corrections: 1846, failed: 19, offset: 54.856988 +- 148.271820
Total bits changed: 5369 (change 2596 + bias 2773)
Storing bitmap into data...
Writing kote_with_info.jpg....

Как бы это не было странно, но оригинал в размере получается больше, чем фото с текстовым контейнером внутри:

-rw-rw-r-- 1 booch booch 159K Feb  4 11:38 kote.jpg
-rw-rw-r-- 1 booch booch 127K Feb  4 11:38 kote_with_info.jpg
-rw-rw-r-- 1 booch booch 159K Feb  4 11:38 kote.jpg
-rw-rw-r-- 1 booch booch 127K Feb  4 11:38 kote_with_info.jpg

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

outguess -k 'secret message' -d secret.txt kote.jpg kote_output.jpg
outguess -k 'secret message' -d secret.txt kote.jpg kote_output.jpg

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

outguess -k "my secret key" -r kote_output.jpg secret.txt
outguess -k "my secret key" -r kote_output.jpg secret.txt

Чуть больше инфы:

man outguess
man outguess

UPD: Именно эту программу использовали Cicada 3301 для шифрования своих сообщений внутри картинки, которую они потом вешали на 4сhan или Reddit. Подробнее о них можно прочитать в Вики посвященной разгадке тайны Cicada 3301.

Steg

Steg – это кросс-платформенная утилита, написанная на С++. Созданная для стенографии и криптографии информации и имеет дружественный GUI интерфейс. Одинаково хорошо работает на Windows и на Linux. Может прятать инфу в JPEG (JPG), TIFF, PNG, BMP.

Скачать для Linux:

wget https://googledrive.com/host/0B-_yxJMDtRxyRDNGNk1YcXR0UTg/steg-v1.0.0.2-linux32.tgz
wget https://googledrive.com/host/0B-_yxJMDtRxyRDNGNk1YcXR0UTg/steg-v1.0.0.2-linux32.tgz

Страница загрузки тут.
Извлекаем и запускаем:

tar xvf steg-v1.0.0.2-linux32.tgz
cd steg-v1.0.0.2-linux32/
./steg.sh
tar xvf steg-v1.0.0.2-linux32.tgz
cd steg-v1.0.0.2-linux32/
./steg.sh

Интерфейс прост и понятен.
Screenshot from 2014-02-04 11:56:31
Ну и конечно фотография, содержащая послание внутри.
sseugtuo

kote_output