LSB stiganography

Einu sinni skrifaði ég mitt fyrsta færslan á hub. Og þessi færsla var tileinkuð mjög áhugaverðu vandamáli, nefnilega stiganography. Auðvitað er lausnin sem lögð er til í því gamla efni ekki hægt að kalla stiganography í eiginlegum skilningi þess orðs. Þetta er bara leikur með skráarsniðum, en nokkuð áhugaverður leikur engu að síður.

Í dag munum við reyna að kafa aðeins dýpra og skoða LSB reikniritið. Ef þú hefur áhuga þá ertu velkominn undir kött. (Undir niðurskurðinum er umferð: um megabæt.)

Fyrst af öllu er nauðsynlegt að gera stuttan inngang. Allir vita að tilgangur dulritunar er að gera það ómögulegt að lesa leynilegar upplýsingar. Auðvitað hefur dulkóðun sín forrit, en það er önnur nálgun við gagnavernd. Við þurfum ekki að dulkóða upplýsingarnar heldur láta eins og við höfum þær ekki. Þetta er einmitt ástæðan fyrir því að steganography var fundið upp. Wikipedia fullvissar okkur um að „steganography (af grísku στεγανοσ - falinn og grísku γραφω - ég skrifa, bókstaflega „leynileg skrif“) er vísindin um falinn miðlun upplýsinga með því að halda sjálfri flutningsstaðreyndinni leyndri.

Auðvitað bannar enginn að sameina dulritunar- og stiganógrafískar aðferðir. Þar að auki, í reynd gera þeir þetta, en verkefni okkar er að skilja grunnatriðin. Ef þú rannsakar Wikipedia greinina vandlega muntu komast að því að steganography reiknirit innihalda svokallaða. ílát og skilaboð. Gámur er allar upplýsingar sem hjálpa til við að fela leyniskilaboð okkar.

Í okkar tilviki mun ílátið vera mynd á BMP sniði. Fyrst skulum við skoða uppbyggingu þessarar skráar. Hægt er að skipta skránni í 4 hluta: skráarhaus, myndhaus, litatöflu og myndina sjálfa. Í okkar tilgangi þurfum við aðeins að vita hvað er skrifað í hausnum.

Fyrstu tvö bæti haussins eru BM undirskriftin, síðan er skráarstærðin í bætum skrifuð í tvöföldu orði, næstu 4 bæti eru frátekin og verða að innihalda núll, og að lokum inniheldur annað tvöfalt orð frávikið frá upphafi skrá í raunveruleg bæti myndarinnar. Í 24 bita bmp skrá er hver pixla kóðaður með þremur BGR bætum.

Nú vitum við hvernig á að komast að myndinni, það eina sem er eftir er að skilja hvernig við getum skrifað þær upplýsingar sem við þurfum þar. Til þess þurfum við LSB aðferðina. Kjarni aðferðarinnar er sem hér segir: við skiptum út minnstu bitunum í bætum sem bera ábyrgð á litakóðun. Segjum að ef næsta bæti í leyniskilaboðum okkar er 11001011 og bætin á myndinni eru...11101100 01001110 01111100 0101100111... þá mun kóðun líta svona út. Við munum skipta leyniboðabætinu í 4 tveggja bita hluta: 11, 00, 10, 11, og skipta út lægstu bitum myndarinnar með brotunum sem myndast: ...11101111 01001100 01111110 0101100111…. Slík skipti er almennt ekki áberandi fyrir mannsauga. Þar að auki munu mörg eldri framleiðslutæki ekki einu sinni geta sýnt slíkar smávægilegar breytingar.

Það er ljóst að þú getur breytt ekki aðeins 2 minnstu bitunum heldur hvaða fjölda þeirra sem er. Það er eftirfarandi mynstur: því fleiri bita sem við breytum, því meiri upplýsingar getum við falið og því meiri truflun mun þetta valda í upprunalegu myndinni. Hér eru til dæmis tvær myndir:

LSB stiganography
LSB stiganography

Þrátt fyrir mitt besta gat ég ekki séð muninn á þeim, en engu að síður, á annarri myndinni, með því að nota lýst aðferð, er ljóð Lewis Carrolls „The Hunting of the Snark“ falið. Ef þú hefur lesið þetta langt, þá hefur þú líklega áhuga á að fræðast um framkvæmdina. Það er frekar einfalt, en ég mun vara þig strax við að allt er gert í Delphi. Það eru tvær ástæður fyrir þessu: 1. Mér finnst Delphi vera gott tungumál; 2. Þetta forrit fæddist í því ferli að undirbúa námskeið um undirstöðuatriði tölvusjónar og strákarnir sem ég er að kenna þetta námskeið fyrir þekkja ekki neitt annað en Delphi. Fyrir þá sem ekki þekkja setningafræðina þarf að útskýra eitt: shl x er bitaskipting til vinstri með x, shr x er bitaskipt til hægri með x.

Við gerum ráð fyrir að við séum að skrifa texta sem geymdur er í streng í ílátið og skipta um neðri tvö bæti:
Upptökukóði:

fyrir i:=1 að lengd(str) gera
    byrja
      l1:=bæti(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.Staða:=f.Staða-1;
      tmp:=((tmp shr 2) shl 2)+l1;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Staða:=f.Staða-1;
      tmp:=((tmp shr 2) shl 2)+l2;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Staða:=f.Staða-1;
      tmp:=((tmp shr 2) shl 2)+l3;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Staða:=f.Staða-1;
      tmp:=((tmp shr 2) shl 2)+l4;
      f.WriteBuffer(tmp,1);
 
    enda;

kóða til að lesa:

fyrir i:=1 til MsgSize gera
    byrja
      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);
    enda;

Jæja, fyrir þá sem eru virkilega latir - tengil á forritið og frumkóðann þess.

Þakka þér.

Heimild: www.habr.com

Bæta við athugasemd