LSB steganografija

Jednom davno napisao sam svoje prva objava na hubu. A taj post je bio posvećen jednom vrlo zanimljivom problemu, odnosno steganografiji. Naravno, rješenje predloženo u toj staroj temi ne može se nazvati steganografijom u pravom smislu te riječi. To je samo igra s formatima datoteka, ali svejedno prilično zanimljiva igra.

Danas ćemo pokušati kopati malo dublje i pogledati LSB algoritam. Ako ste zainteresirani, dobrodošli ste pod kat. (Ispod rez je promet: oko megabajta.)

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

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

U našem slučaju, spremnik će biti slika u BMP formatu. Prvo, pogledajmo strukturu ove datoteke. Datoteka se može podijeliti u 4 dijela: zaglavlje datoteke, zaglavlje slike, paleta i sama slika. Za naše potrebe, samo trebamo znati što je napisano 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, još jedna dvostruka riječ sadrži pomak od početka datoteku na stvarne bajtove slike. U 24-bitnoj bmp datoteci svaki piksel je kodiran s tri BGR bajta.

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

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

LSB steganografija
LSB steganografija

Unatoč svom trudu, nisam mogao vidjeti razliku među njima, ali ipak, na drugoj slici, koristeći opisanu metodu, skrivena je pjesma Lewisa Carrolla "The Hunting of the Snark". Ako ste do sada pročitali, onda vas vjerojatno zanima više o implementaciji. Vrlo je jednostavno, ali odmah vas upozoravam 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 tečaja o osnovama računalnog vida, a dečki kojima predajem ovaj tečaj još ne znaju ništa osim Delphija. Za one koji nisu upoznati sa sintaksom, potrebno je objasniti jednu stvar: shl x je bitni pomak ulijevo za x, shr x je bitni pomak udesno za x.

Pretpostavljamo da pišemo tekst pohranjen u nizu u spremnik i zamjenjujemo donja dva bajta:
Kod snimanja:

za i:=1 do length(str) do
    krene
      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.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
    krene
      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 stvarno lijene - veza na program i njegov izvorni kod.

Hvala Vam.

Izvor: www.habr.com

Dodajte komentar