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

Еднаш одамна го напишав моето прва објава на hub. И тој пост беше посветен на еден многу интересен проблем, а тоа е стеганографијата. Секако, решението предложено во таа стара тема не може да се нарече стеганографија во вистинска смисла на зборот. Тоа е само игра со формати на датотеки, но сепак прилично интересна игра.

Денес ќе се обидеме да копаме малку подлабоко и да го разгледаме алгоритмот 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 стеганографија

И покрај моите најдобри напори, не можев да ја видам разликата меѓу нив, но сепак, на втората слика, користејќи го опишаниот метод, се крие поемата на Луис Керол „Ловот на снаркот“. Ако сте прочитале досега, тогаш веројатно сте заинтересирани да дознаете за имплементацијата. Тоа е прилично едноставно, но веднаш ќе ве предупредам дека сè е направено во Делфи. Постојат две причини за ова: 1. Мислам дека Делфи е добар јазик; 2. Оваа програма е родена во процесот на подготовка на курс за основите на компјутерската визија, а момците на кои го предавам овој курс се уште не знаат ништо друго освен Делфи. За оние кои не се запознаени со синтаксата, едно нешто треба да се објасни: shl x е малку поместување налево за x, shr x е малку поместување надесно за x.

Претпоставуваме дека пишуваме текст зачуван во низа во контејнерот и ги заменуваме долните два бајта:
Код за снимање:

за i:=1 до должина(str) do
    започне
      l1:=бајт(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.Позиција:=f.Позиција-1;
      tmp:=((tmp shr 2) shl 2)+l1;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Позиција:=f.Позиција-1;
      tmp:=((tmp shr 2) shl 2)+l2;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Позиција:=f.Позиција-1;
      tmp:=((tmp shr 2) shl 2)+l3;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Позиција:=f.Позиција-1;
      tmp:=((tmp shr 2) shl 2)+l4;
      f.WriteBuffer(tmp,1);
 
    end;

код за читање:

за i:=1 до MsgSize направи
    започне
      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);
    end;

Па, за навистина мрзливите - линк до програмата и нејзиниот изворен код.

Ви благодариме.

Извор: www.habr.com

Додадете коментар