ЛСБ стеганографија

Једном давно сам написао своје први пост на чворишту. И тај пост је био посвећен веома занимљивом проблему, а то је стеганографија. Наравно, решење предложено у тој старој теми не може се назвати стеганографијом у правом смислу те речи. То је само игра са форматима датотека, али ипак прилично занимљива игра.

Данас ћемо покушати да копамо мало дубље и погледамо ЛСБ алгоритам. Ако сте заинтересовани, добродошли сте под кат. (Испод одсека је саобраћај: око мегабајта.)

Пре свега, потребно је направити кратак увод. Сви знају да је сврха криптографије да онемогући читање тајних информација. Наравно, криптографија има своје примене, али постоји и други приступ заштити података. Не морамо да шифрујемо информације, већ се претварамо да их немамо. Управо због тога је измишљена стеганографија. Википедија нас уверава да је „стеганографија (од грчког στεγανοσ – скривен и грчког γραφω – пишем, буквално „тајно писање”) наука о скривеном преношењу информација тако што се сама чињеница преношења чува у тајности.

Наравно, нико не забрањује комбиновање криптографских и стеганографских метода. Штавише, у пракси то раде, али наш задатак је да разумемо основе. Ако пажљиво проучите чланак на Википедији, сазнаћете да стеганографски алгоритми укључују тзв. контејнер и порука. Контејнер је свака информација која помаже у скривању наше тајне поруке.

У нашем случају, контејнер ће бити слика у БМП формату. Прво, погледајмо структуру ове датотеке. Датотека се може поделити на 4 дела: заглавље датотеке, заглавље слике, палета и сама слика. За наше потребе, потребно је само да знамо шта пише у заглављу.

Прва два бајта заглавља су БМ потпис, затим се величина датотеке у бајтовима пише у двострукој речи, следећа 4 бајта су резервисана и морају да садрже нуле, и на крају, друга двострука реч садржи помак од почетка датотеку у стварне бајтове слике. У 24-битној бмп датотеци, сваки пиксел је кодиран са три БГР бајта.

Сада знамо како да дођемо до слике, остаје нам само да разумемо како можемо тамо да запишемо информације које су нам потребне. За ово ће нам требати ЛСБ метода. Суштина методе је следећа: замењујемо најмање значајне битове у бајтовима одговорним за кодирање боја. Рецимо ако је следећи бајт наше тајне поруке 11001011, а бајтови на слици су...11101100 01001110 01111100 0101100111..., онда ће кодирање изгледати овако. Поделићемо бајт тајне поруке на 4 двобитна дела: 11, 00, 10, 11 и заменити битове нижег реда слике резултујућим фрагментима: ...11101111 01001100 01111110 0101100111…. Таква замена генерално није приметна људском оку. Штавише, многи старији излазни уређаји чак неће моћи да прикажу тако мање промене.

Јасно је да можете променити не само 2 најмање значајна бита, већ било који њихов број. Постоји следећи образац: што више битова променимо, више информација можемо сакрити и то ће више сметњи изазвати у оригиналној слици. На пример, ево две слике:

ЛСБ стеганографија
ЛСБ стеганографија

Упркос свим напорима, нисам могао да уочим разлику између њих, али ипак, на другој слици, користећи описани метод, сакривена је песма Луиса Керола „Лов на Снарк“. Ако сте читали до сада, вероватно сте заинтересовани да сазнате више о примени. Прилично је једноставно, али ћу вас одмах упозорити да се све ради у Делпхију. Два су разлога за ово: 1. Мислим да је Делпхи добар језик; 2. Овај програм је настао у процесу припреме курса о основама компјутерског вида, а момци којима предајем овај курс још не знају ништа осим Делпхија. За оне који нису упознати са синтаксом, треба објаснити једну ствар: схл к је померање по биту улево за к, схр к је померање у битовима удесно за к.

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

за и:=1 до дужине(стр) до
    почети
      л1:=бајт(стр[и]) схр 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;
 
      ф.РеадБуффер(тмп,1);
      ф.Позиција:=ф.Позиција-1;
      тмп:=((тмп схр 2) схл 2)+л1;
      ф.ВритеБуффер(тмп,1);
 
      ф.РеадБуффер(тмп,1);
      ф.Позиција:=ф.Позиција-1;
      тмп:=((тмп схр 2) схл 2)+л2;
      ф.ВритеБуффер(тмп,1);
 
      ф.РеадБуффер(тмп,1);
      ф.Позиција:=ф.Позиција-1;
      тмп:=((тмп схр 2) схл 2)+л3;
      ф.ВритеБуффер(тмп,1);
 
      ф.РеадБуффер(тмп,1);
      ф.Позиција:=ф.Позиција-1;
      тмп:=((тмп схр 2) схл 2)+л4;
      ф.ВритеБуффер(тмп,1);
 
    енд;

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

за и:=1 до МсгСизе уради
    почети
      ф.РеадБуффер(тмп,1);
      л1:=тмп схл 6;
      ф.РеадБуффер(тмп,1);
      l2:=tmp shl 6; l2:=l2 shr 2;
      ф.РеадБуффер(тмп,1);
      l3:=tmp shl 6; l3:=l3 shr 4;
      ф.РеадБуффер(тмп,1);
      l4:=tmp shl 6; l4:=l4 shr 6;
      стр:=стр+цхар(л1+л2+л3+л4);
    енд;

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

Хвала.

Извор: ввв.хабр.цом

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