Скачиваний:
71
Добавлен:
17.04.2013
Размер:
234.34 Кб
Скачать

1

Андрей Беляев, nikolsk@mail.ru

Стеганография : скрытие информации.

Стеганография очень близкая к криптографии, но все таки независимая отрасль computer science. Она ставит целью сокрытие конфиденциальной информации от непосвященных глаз в самых обычных почтовых отправлениях, файлах, картинках и т.п.. Недаром сам это термин переводится как "тайнопись".

Основные определения.

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

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

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

Практически все существующие стегоалгоритмы можно разбить на 4 основные категории : 1) преобразования текста, 2) метод незначащих бит, 3) использование неотображаемых областей форматов файлов и 4) незначимое преобразование форматов файлов.

2

Преобразования текста

Данный класс методов является самым старым, поскольку появился он в "реальной", а не виртуальной среде и был просто перенесен на средства ВТ с учетом их особенностей и возможностей. Существует огромное множество алгоритмов, которые можно отнести к данной категории. К полностью автоматическим относится, например, форматирование текста количеством пробелов отличным от единицы. Скажем, один пробел соответствует биту "0", а два – "1". Программа получает произвольный текст в качестве контейнера и кодирует внутрь его какое-либо стегосообщение. К полуавтоматичским относятся, например, метод переменной длины слов и метод первой буквы. В этих случаях программа кодирования работает в режиме подсказки : после того как ей указан файл-сообщение, она предлагает оператору начать набор текста, но накладывает на вводимые слова ограничения, несущие собственно информацию.

В методе переменной длины слова набираемые создателем стеганограммы слова должны соответствовать длине, которую укажет программа обычно в одно слово кодируется два бита информации из стего-сообщения. Например, слова длиной в 4 и 8 символов могут означать комбинацию бит "00", длиной в 5

и9 – "01", 6 и 10 – "10", 7 и 11 букв – "11". Слова короче 4 и длиннее 11 букв можно вставлять где угодно для лексической и грамматической связки слов в предложении программа-декодер их будет просто игнорировать.

Метод первой буквы может передавать еще больше бит стего- информации в одном слове : обычно это три или четыре бита. Программа- помощник в этом методе накладывает ограничение уже не на длину слова, а на первую (реже на вторую и т.д.) букву. Обычно код придумывается таким образом, чтобы одну и ту же комбинацию могло кодировать несколько букв, например, комбинацию "101" означают слова, начинающиеся с "А", "Г" или "Т". Это дает большую свободу выбора оператору, придумывающему стегосообщение, и текст не становится косноязыким.

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

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

Метод незначащих бит.

Данный класс алгоритмов представляет собой очень интересный и широко используемый пласт программ. Он основан на том факте, что в некоторых форматах файлов (в подавляющем случае это мультимедиа данные) младшие биты значений хотя и присутствуют в файле, но не воспринимаются человеком. На этом же принципе основано, как Вы знаете, сжатие с потерями (JPEG, MP3, MP4 и т.п.). А стеганография использует это "неиспользуемое" место в файлах для хранения стего-сообщений. Наиболее часто в качестве контейнеров используются графические форматы с прямым

3

цветокодированием в 24 и более бит на пиксел(BMP, TIFF и т.п.). Реже звуковые файлы с абсолютным кодированием амплитуды аудиосигнала (WAV). При разумном наполнении контейнера исходный файл от заполненного не отличит простыми средствами восприятия даже искушенный специалист.

В отношении 24-битных графических изображений можно у каждой из составляющих (RED, GREEN, BLUE) заменять по одному-два младших бита на стегоинформацию без какого-либо ущерба качеству изображения. Биты, которые были до заполнения контейнера на этих местах, просто безжалостно выбрасываются. Естественно, если Вы предполагаете, что кто-то будет подозревать в Вашей переписке или личном каталоге стего-сообщения, то в качестве контейнера необходимо выбирать не искуственно созданные картинки (стего в них обманет только неискушенного пользователя), а отсканированные фотоизображения. Ведь только в них присутствуют шумы квантования случайное заполнение младших бит под которые и маскируются кусочки стего-сообщения. Более того, необходимо избегать фотографий с большими областями очень ярких и черного цветов. На таких картинках большие области в исходном файле имеют цветовые составляющие 255 и 0 соответственно и стегобиты будут характерно выделяться при просмотре файла в кодах своими

254 и 1.

Здесь приведена основная часть алгоритма записывающего и считывающего стего-сообщение в/из 24-битного BMP-файла (полный текст программы и рабочий проект с примером стегосообщения находится на сайте журнала). Из соображений повышенной скрытности в каждом байте используется только 1 младший бит. Кроме того длина сообщения записывается не прямым 16-битным кодом, а двухступенчато это позволяет избежать подозрительной последовательности нулей в начале сообщения, если его длина мала. Сначала в 4 битах записывается N – длина длины сообщения, затем в N последующих битах собственно длина стего-сообщения в битах (старший (N+1)-ый бит считается установленным). Максимальная длина стегосообщения – 16 килобайт.

procedure AddLSBStego(const ContainerFileName:string; const Stego; BitCnt:integer); var Header:TBMPHeader; F:TFileStream;

Buffer:array[0..$103FF] of byte; Ps,i,x,CntLen,BytesInLine,BytesRead:integer;

procedure AddLeastBit(Bit:integer); begin

if Header.Width*3 <= Ps mod BytesInLine then

// перепрыгиваем выравнивание BMP-строк по границе dword inc(Ps,BytesInLine-Header.Width*3);

Buffer[Ps]:=((Buffer[Ps]) and $FE) or (Bit and $01); inc(Ps)

end;

begin

if (BitCnt<=$FFFF) and FileExists(ContainerFileName) then begin

F:=TFileStream.Create(ContainerFileName,fmOpenReadWrite or fmShareExclusive); F.Read(Header,sizeof(TBMPHeader));

if (Header.Signature=$4D42) and (Header.BMOffset=sizeof(TBMPHeader)) and (Header.ColorDepth=24) and (Header.Width*Header.Height*3>BitCnt) then begin

4

BytesInLine:=(((Header.Width*3)+3) div 4)*4;

BytesRead:=F.Read(Buffer,sizeof(Buffer)); Ps:=0;

x:=BitCnt; CntLen:=0;

определяем "длину длины"

while x>0 do

//

begin x:=x shr 1; inc(CntLen) end;

for i:=0 to 3 do

//

записываем "длину длины"

AddLeastBit(CntLen shr

(3-i));

for i:=0 to CntLen-2

do //

записываем длину

AddLeastBit(BitCnt shr

(CntLen-2-i));

for i:=0 to BitCnt-1

do //

записываем саму стеганограмму

AddLeastBit(TByteArray(Stego)[i div 8] shr (7-(i mod 8))); // возвращаемся и записываем измененный буфер на место

F.Seek(sizeof(TBMPHeader),soFromBeginning);

F.Write(Buffer,BytesRead);

end;

F.Free;

end;

end;

procedure ReadLSBStego(const ContainerFileName:string; var Stego; var BitCnt:integer); var Header:TBMPHeader; F:TFileStream;

Buffer:array[0..$103FF] of byte; Ps,i,x,CntLen,BytesInLine:integer;

function ReadLeastBit:integer; begin

if Header.Width*3 <= Ps mod BytesInLine then

// перепрыгиваем выравнивание BMP-строк по границе dword inc(Ps,BytesInLine-Header.Width*3);

Result:=Buffer[Ps] and $01; inc(Ps) end;

begin

if FileExists(ContainerFileName) then begin

F:=TFileStream.Create(ContainerFileName,fmOpenRead or fmShareExclusive); F.Read(Header,sizeof(TBMPHeader));

if (Header.Signature=$4D42) and (Header.BMOffset=sizeof(TBMPHeader)) and (Header.ColorDepth=24) then

begin

BytesInLine:=(((Header.Width*3)+3) div 4)*4; F.Read(Buffer,sizeof(Buffer)); Ps:=0;

CntLen:=0;

// определяем "длину длины"

for i:=0 to 3 do

 

CntLen:=(CntLen shl 1) or ReadLeastBit; if CntLen=0 then CntLen:=16;

BitCnt:=1;

// определяем длину

for i:=0 to CntLen-2 do

 

BitCnt:=(BitCnt shl 1) or ReadLeastBit;

x:=0;

// считываем стеганограмму

for i:=0 to BitCnt-1 do

 

begin

 

x:=(x shl 1) or ReadLeastBit; if i mod 8 = 7 then

begin TByteArray(Stego)[i div 8]:=x; x:=0 end; end;

// "досмещение" и запись последнего неполного байта (если он был) if BitCnt mod 8 <> 0 then

begin

x:=x shl (8-(BitCnt mod 8)); TByteArray(Stego)[BitCnt div 8]:=x; end

end;

F.Free;

end;

end;

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

пересылка по почте или хранение больших WAV файлов при наличии удобного формата MP3 само по себе вызывает подозрения. BMP-файлы пока

5

избежали подобной участи, видимо, из-за гораздо более широкого распространения средств работы с ними и все-таки приемлимых (сотни килобайт) размеров.

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

Отсюда еще два правила для стегоалгоритмов. Во-первых, необходимо стремиться подавать на вход "смешивателя" стего с хорошей статистической распределенностью. Для этого используется либо кодирование (если Вы уверены, что алгоритм преобразования не известен третьей стороне), либо полноценное шифрование (результат любых стойких криптопреобразований тоже имеет очень хорошие случайные характеристики). В качестве кодера для первого способа можно применять наложение по "исключающему ИЛИ" (XOR) исходной стеганограммы с потоком, порождаемым генератором псевдослучайных чисел приемлимой разрядности. Естественно, начальное заполнение ГПСЧ должно быть как-либо известно принимающей стороне. Кроме того, хорошим тоном является предварительное сжатие текстовых сообщений, которое убивает двух зайцев : уменьшение объема стего и повышение его "случайности".

Вторым правилом является рекомендация распределять стегосообщение равномерно по всей длине контейнера. Проще всего это реализовать модификацией не всех подряд разрешенных бит контейнера, а только каждого второго, каждого третьего и т.д.. С точки зрения маскировки спектральных составляющих лучше всего вообще динамически генерировать длины подобных "прыжков", например, с помощью того же ГПСЧ – "модифицируем бит, пропускаем 1, модифицируем бит, пропускаем 4 и т.д.".

Метод неотображаемых областей форматов файлов

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

6

данных, корректно смещая указатель на основное тело файла чуть правее. Многие форматы имеют многоблочную структуру с идентификаторами типа данных, записанными в начале каждого блока. В этом случае программы просмотра обычно игнорируют все блоки с неизвестными им идентификаторами, что собственно нам и нужно. В качестве примера язык HTML с его тегами : несуществующие теги не отображаются практически всеми браузерами. Наберите в тексте HTML-страницы <x value="торт готов"> и запустите ее на просмотр браузером.

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

Метод незначимых преобразований форматов файлов

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

В качестве примера приведу часть программы, которая используется для изменения порядка цветов в 256-цветной палитре BMP-файла. Перестановка цветов в палитре никак не сказывается на вид файла и только с небольшой долей вероятности может быть заподозрена как стегоконтейнер. При этом она позволяет гарантированно передавать около 200 байт даже в совсем небольшой картинке. С использованием алфавитного сжатия это дает стеготекст длиной в 400 символов например, данный абзац. Данный исходный код и проект для его тестирования также размещен на сайте.

type

TPTPStego=array[0..191]

of

byte;

TTransposition=array[0..255]

of

byte;

procedure EncodeTransposition(const Stego:TPTPStego; var TP:TTransposition); var Src:TTransposition; i,part,bit,value,InPs,OutPs:integer;

begin

for i:=0 to 255 do Src[i]:=i; OutPs:=0; InPs:=0;

for bit:=7 downto 1 do

for part:=0 to (1 shl bit)-1 do begin

value:=0;

for i:=0 to bit-1 do begin

value:=(value shl 1) or

( (Stego[InPs shr 3] shr (7-(InPs and 7))) and 1 ); inc(InPs)

end;

TP[OutPs]:=Src[value]; inc(OutPs); move(Src[value+1],src[value],255-value) end;

TP[254]:=Src[0]; TP[255]:=Src[1]; end;

procedure DecodeTransposition(const TP:TTransposition; var Stego:TPTPStego); var Src:TTransposition; i,part,bit,value,InPs,OutPs:integer;

7

begin

for i:=0 to 255 do Src[i]:=i; FillChar(Stego,sizeof(Stego),0); bit:=7; part:=0; OutPs:=0;

for InPs:=0 to 253 do begin

value:=0;

while Src[value]<>TP[InPs] do inc(value); move(Src[value+1],src[value],255-value); for i:=0 to bit-1 do

begin

Stego[OutPs shr 3]:=Stego[OutPs shr 3] or

( ((value shr (bit-1-i)) and 1) shl (7-(OutPs and 7)) ); inc(OutPs)

end;

inc(part);

if part=(1 shl bit) then begin

dec(bit); part:=0 end;

end;

end;

Данные процедуры производят только кодирование стеганограммы в перестановку из 256 элементов и обратно. В самой программе Вам потребуется : а) при кодировании отсортировать палитру по полученному из стеганограммы закону перестановок, б) при декодировании определить из палитры закон ее перестановки, а затем с помощью DecodeTransposition извлечь из нее стего. Не забывайте проверять перед использованием BMP-файла наличие в его палитре 256 разных (!) цветов (хотя для отсканированных изображений, переведенных в 256-цветную палитру, это выполняется практически всегда).

Заключение

В небольшой статье невозможно рассказать обо всех существующих стегоалгоритмах. Стеганография отличается от многих областей computer science тем, что зачастую метод, придуманный самостоятельно, может успешно конкурировать с широко известными схемами. Основные принципы этой отрасли : 1) скрытность превыше всего, 2) не надо недооценивать противника.

Соседние файлы в папке Лаба2 документация