LSB стеганография

Веднъж написах моята първа публикация в хъб. И тази публикация беше посветена на много интересен проблем, а именно стеганографията. Разбира се, предложеното в онази стара тема решение не може да се нарече стеганография в истинския смисъл на думата. Това е просто игра с файлови формати, но въпреки това доста интересна игра.

Днес ще се опитаме да копаем малко по-дълбоко и да разгледаме LSB алгоритъма. При интерес заповядайте под кат. (По-малко е трафикът: около мегабайт.)

Преди всичко е необходимо да се направи кратко въведение. Всеки знае, че целта на криптографията е да направи невъзможно четенето на секретна информация. Разбира се, криптографията има своите приложения, но има и друг подход за защита на данните. Не е нужно да шифроваме информацията, но се преструваме, че я нямаме. Точно затова е изобретена стеганографията. Уикипедия ни уверява, че „стеганографията (от гръцки στεγανοσ – скрит и гръцки γραφω – пиша, буквално „тайно писане“) е наука за скритото предаване на информация чрез запазване на самия факт на предаване в тайна.

Разбира се, никой не забранява комбинирането на криптографски и стеганографски методи. Освен това на практика те правят това, но нашата задача е да разберем основите. Ако внимателно проучите статията в Уикипедия, ще разберете, че стеганографските алгоритми включват т.нар. контейнер и съобщение. Контейнер е всяка информация, която помага да се скрие нашето тайно съобщение.

В нашия случай контейнерът ще бъде изображение в BMP формат. Първо, нека да разгледаме структурата на този файл. Файлът може да бъде разделен на 4 части: заглавка на файла, заглавка на изображението, палета и самото изображение. За нашите цели трябва да знаем само какво е написано в заглавката.

Първите два байта от заглавката са сигнатурата на BM, след това размерът на файла в байтове се записва в двойна дума, следващите 4 байта са запазени и трябва да съдържат нули и накрая друга двойна дума съдържа отместването от началото на файл към действителните байтове на изображението. В 24-битов bmp файл всеки пиксел е кодиран с три BGR байта.

Сега знаем как да стигнем до изображението, остава само да разберем как можем да напишем необходимата информация там. За целта ще ни трябва методът LSB. Същността на метода е следната: заместваме най-малко значимите битове в байтовете, отговорни за цветното кодиране. Да кажем, че следващият байт от нашето тайно съобщение е 11001011, а байтовете в изображението са...11101100 01001110 01111100 0101100111..., тогава кодирането ще изглежда така. Ще разделим байта на тайното съобщение на 4 двубитови части: 11, 00, 10, 11 и ще заменим битовете от нисък ред на изображението с получените фрагменти: ...11101111 01001100 01111110 0101100111…. Такава подмяна обикновено не се забелязва от човешкото око. Освен това много по-стари изходни устройства дори няма да могат да покажат такива незначителни промени.

Ясно е, че можете да промените не само 2-та най-малко значими бита, но произволен брой от тях. Съществува следният модел: колкото повече битове променим, толкова повече информация можем да скрием и толкова повече смущения ще предизвика това в оригиналното изображение. Ето например две изображения:

LSB стеганография
LSB стеганография

Въпреки всичките ми усилия не можах да видя разликата между тях, но въпреки това във второто изображение, използвайки описания метод, е скрито стихотворението на Луис Карол „Ловът на Снарк“. Ако сте прочели дотук, вероятно ще ви е интересно да научите за изпълнението. Много е просто, но веднага ще ви предупредя, че всичко се прави в Delphi. Има две причини за това: 1. Мисля, че Delphi е добър език; 2. Тази програма се роди в процеса на подготовка на курс по основи на компютърното зрение и момчетата, на които преподавам този курс, все още не знаят нищо друго освен Delphi. За тези, които не са запознати със синтаксиса, трябва да се обясни едно нещо: shl x е побитово изместване наляво с x, shr x е побитово изместване надясно с x.

Предполагаме, че пишем текст, съхранен в низ в контейнера, и заместваме долните два байта:
Код за запис:

for i:=1 to length(str) do
    започвам
      l1:=byte(str[i]) shr 6;
      l2:=byte(str[i]) shl 2; l2:=l2 shr 6;
      l3:=byte(str[i]) shl 4; l3:=l3 shr 6;
      l4:=byte(str[i]) shl 6; l4:=l4 shr 6;
 
      f.ReadBuffer(tmp,1);
      f.Position:=f.Position-1;
      tmp:=((tmp shr 2) shl 2)+l1;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Position:=f.Position-1;
      tmp:=((tmp shr 2) shl 2)+l2;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Position:=f.Position-1;
      tmp:=((tmp shr 2) shl 2)+l3;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Position:=f.Position-1;
      tmp:=((tmp shr 2) shl 2)+l4;
      f.WriteBuffer(tmp,1);
 
    края;

код за четене:

за i:=1 до MsgSize do
    започвам
      f.ReadBuffer(tmp,1);
      l1:=tmp shl 6;
      f.ReadBuffer(tmp,1);
      l2:=tmp shl 6; l2:=l2 shr 2;
      f.ReadBuffer(tmp,1);
      l3:=tmp shl 6; l3:=l3 shr 4;
      f.ReadBuffer(tmp,1);
      l4:=tmp shl 6; l4:=l4 shr 6;
      str:=str+char(l1+l2+l3+l4);
    края;

Е, за наистина мързеливите - връзка към програмата и нейния изходен код.

Благодаря.

Източник: www.habr.com

Купете надежден хостинг за сайтове с DDoS защита, VPS VDS сървъри 🔥 Купете надежден уеб хостинг със защита от DDoS атаки, VPS VDS сървъри | ProHoster