LSB steganografija

Jednom davno sam napisao svoju prvi post na hub-u. A taj post je bio posvećen vrlo zanimljivom problemu, naime steganografiji. Naravno, rješenje predloženo u toj staroj temi ne može se nazvati steganografijom u pravom smislu riječi. To je samo igra s formatima datoteka, ali ipak prilično zanimljiva igra.

Danas ćemo pokušati da kopamo malo dublje i pogledamo LSB algoritam. Ako ste zainteresovani, dobrodošli ste pod kat. (U nastavku je promet: oko megabajta.)

Prije svega, potrebno je napraviti kratak uvod. Svi znaju da je svrha kriptografije da onemogući čitanje tajnih informacija. Naravno, kriptografija ima svoje primjene, ali postoji i drugi pristup zaštiti podataka. Ne moramo šifrirati informacije, već se pretvaramo da ih nemamo. Upravo zbog toga je izmišljena steganografija. Wikipedia nas uvjerava da je „steganografija (od grčkog στεγανοσ - skriven i grčkog γραφω - pišem, doslovno "tajno pisanje") nauka o skrivenom prenošenju informacija čuvanjem same činjenice prijenosa u tajnosti.

Naravno, niko ne zabranjuje kombinovanje kriptografskih i steganografskih metoda. Štoviše, u praksi to rade, ali naš zadatak je razumjeti osnove. Ako pažljivo proučite članak na Wikipediji, otkrit ćete da steganografski algoritmi uključuju tzv. kontejner i poruka. Kontejner je svaka informacija koja pomaže sakriti našu tajnu poruku.

U našem slučaju, kontejner će biti slika u BMP formatu. Prvo, pogledajmo strukturu ove datoteke. Datoteka se može podijeliti na 4 dijela: zaglavlje datoteke, zaglavlje slike, paleta i sama slika. Za naše potrebe, samo trebamo znati šta piše u zaglavlju.

Prva dva bajta zaglavlja su BM potpis, zatim se veličina datoteke u bajtovima ispisuje u dvostrukoj riječi, sljedeća 4 bajta su rezervirana i moraju sadržavati nule, i na kraju, druga dvostruka riječ sadrži pomak od početka datoteku u stvarne bajtove slike. U 24-bitnoj bmp datoteci, svaki piksel je kodiran sa tri BGR bajta.

Sada znamo kako doći do slike, preostaje nam samo da shvatimo kako možemo tamo napisati informacije koje su nam potrebne. Za ovo će nam trebati LSB metoda. Suština metode je sljedeća: zamjenjujemo najmanje bitne bitove u bajtovima odgovornim za kodiranje boja. Recimo ako je sljedeći bajt naše tajne poruke 11001011, a bajtovi na slici su...11101100 01001110 01111100 0101100111..., onda će kodiranje izgledati ovako. Podijelit ćemo bajt tajne poruke na 4 dvobitna dijela: 11, 00, 10, 11 i zamijeniti bitove nižeg reda slike rezultirajućim fragmentima: ...11101111 01001100 01111110 0101100111…. Takva zamjena općenito nije uočljiva ljudskom oku. Štaviše, mnogi stariji izlazni uređaji neće moći čak ni prikazati tako manje promjene.

Jasno je da možete promijeniti ne samo 2 najmanje značajna bita, već bilo koji njihov broj. Postoji sljedeći obrazac: što više bitova promijenimo, više informacija možemo sakriti i to će više smetnji izazvati u originalnoj slici. Na primjer, evo dvije slike:

LSB steganografija
LSB steganografija

Unatoč svim naporima, nisam mogao vidjeti razliku između njih, ali ipak, na drugoj slici, koristeći opisanu metodu, skrivena je pjesma Lewisa Carrolla “Lov na Snark”. Ako ste čitali do sada, vjerovatno ste zainteresirani za učenje o implementaciji. Prilično je jednostavno, ali odmah ću vas upozoriti da se sve radi u Delphiju. Dva su razloga za to: 1. Mislim da je Delphi dobar jezik; 2. Ovaj program je nastao u procesu pripreme kursa o osnovama kompjuterskog vida, a momci kojima predajem ovaj kurs još ne znaju ništa osim Delphija. Za one koji nisu upoznati sa sintaksom, treba objasniti jednu stvar: shl x je pomak po bitu ulijevo za x, shr x je pomak u bitovima udesno za x.

Pretpostavljamo da u kontejner upisujemo tekst pohranjen u nizu i zamjenjujemo donja dva bajta:
Kod snimanja:

za i:=1 do dužine(str) do
    početi
      l1:=bajt(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.Pozicija:=f.Pozicija-1;
      tmp:=((tmp shr 2) shl 2)+l1;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Pozicija:=f.Pozicija-1;
      tmp:=((tmp shr 2) shl 2)+l2;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Pozicija:=f.Pozicija-1;
      tmp:=((tmp shr 2) shl 2)+l3;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Pozicija:=f.Pozicija-1;
      tmp:=((tmp shr 2) shl 2)+l4;
      f.WriteBuffer(tmp,1);
 
    end;

kod za čitanje:

za i:=1 do MsgSize do
    početi
      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;

Pa, za one zaista lijene - vezu do programa i njegovog izvornog koda.

Spasibo.

izvor: www.habr.com

Dodajte komentar