steganografia LSB

Am scris odată ca niciodată primul post pe hub. Și acea postare a fost dedicată unei probleme foarte interesante, și anume steganografia. Desigur, soluția propusă în acea veche temă nu poate fi numită steganografie în adevăratul sens al cuvântului. Este doar un joc cu formate de fișiere, dar totuși un joc destul de interesant.

Astăzi vom încerca să săpăm puțin mai adânc și să ne uităm la algoritmul LSB. Dacă sunteți interesat, sunteți binevenit sub cat. (Sub tăietură este trafic: aproximativ un megaoctet.)

În primul rând, este necesar să facem o scurtă introducere. Toată lumea știe că scopul criptografiei este de a face imposibilă citirea informațiilor secrete. Desigur, criptografia are aplicațiile sale, dar există o altă abordare a protecției datelor. Nu trebuie să criptăm informațiile, dar să pretindem că nu le avem. Tocmai de aceea a fost inventată steganografia. Wikipedia ne asigură că „steganografia (din grecescul στεγανοσ - ascuns și grecescul γραφω - scriu, literalmente „scriere secretă”) este știința transmiterii ascunse a informațiilor prin păstrarea secretă a faptului transmiterii.

Desigur, nimeni nu interzice combinarea metodelor criptografice și steganografice. Mai mult, în practică ei fac acest lucru, dar sarcina noastră este să înțelegem elementele de bază. Dacă studiați cu atenție articolul Wikipedia, veți afla că algoritmii de steganografie includ așa-numitul. container și mesaj. Un container este orice informație care ajută la ascunderea mesajului nostru secret.

În cazul nostru, containerul va fi o imagine în format BMP. Mai întâi, să ne uităm la structura acestui fișier. Fișierul poate fi împărțit în 4 părți: antet fișier, antet imagine, paletă și imaginea în sine. Pentru scopurile noastre, trebuie să știm doar ce este scris în antet.

Primii doi octeți ai antetului sunt semnătura BM, apoi dimensiunea fișierului în octeți este scrisă într-un cuvânt dublu, următorii 4 octeți sunt rezervați și trebuie să conțină zerouri, iar în final, un alt cuvânt dublu conține offset-ul de la începutul fișier la octeții efectivi ai imaginii. Într-un fișier bmp de 24 de biți, fiecare pixel este codificat cu trei octeți BGR.

Acum știm cum să ajungem la imagine, tot ce rămâne este să înțelegem cum putem scrie acolo informațiile de care avem nevoie. Pentru aceasta vom avea nevoie de metoda LSB. Esența metodei este următoarea: înlocuim biții mai puțin semnificativi din octeții responsabili pentru codificarea culorilor. Să presupunem că dacă următorul octet al mesajului nostru secret este 11001011, iar octeții din imagine sunt...11101100 01001110 01111100 0101100111..., atunci codarea va arăta așa. Vom împărți octetul mesajului secret în 4 părți de doi biți: 11, 00, 10, 11 și vom înlocui biții de ordin inferior ai imaginii cu fragmentele rezultate: ...11101111 01001100 01111110 0101100111…. O astfel de înlocuire nu este, în general, vizibilă pentru ochiul uman. Mai mult, multe dispozitive de ieșire mai vechi nici măcar nu vor putea afișa astfel de modificări minore.

Este clar că puteți schimba nu numai cei 2 biți mai puțin semnificativi, ci orice număr dintre ei. Există următorul model: cu cât schimbăm mai mulți biți, cu atât putem ascunde mai multe informații și cu atât mai multe interferențe vor cauza în imaginea originală. De exemplu, iată două imagini:

steganografia LSB
steganografia LSB

În ciuda eforturilor mele, nu am putut vedea diferența dintre ele, dar cu toate acestea, în a doua imagine, folosind metoda descrisă, poezia lui Lewis Carroll „Vânătoarea Snarkului” este ascunsă. Dacă ați citit până aici, atunci probabil că sunteți interesat să aflați despre implementare. Este destul de simplu, dar vă avertizez imediat că totul se face în Delphi. Există două motive pentru aceasta: 1. Cred că Delphi este un limbaj bun; 2. Acest program s-a născut în procesul de pregătire a unui curs despre bazele vederii computerizate, iar băieții cărora le predau acest curs nu știu încă altceva decât Delphi. Pentru cei care nu sunt familiarizați cu sintaxa, un lucru trebuie explicat: shl x este o deplasare pe biți la stânga cu x, shr x este o deplasare pe biți la dreapta cu x.

Presupunem că scriem text stocat într-un șir în container și înlocuim cei doi octeți inferiori:
Cod de înregistrare:

pentru i:=1 to length(str) do
    începe
      l1:=byte(str[i])shr6;
      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.Poziție:=f.Poziție-1;
      tmp:=((tmp shr 2) shl 2)+l1;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Poziție:=f.Poziție-1;
      tmp:=((tmp shr 2) shl 2)+l2;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Poziție:=f.Poziție-1;
      tmp:=((tmp shr 2) shl 2)+l3;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Poziție:=f.Poziție-1;
      tmp:=((tmp shr 2) shl 2)+l4;
      f.WriteBuffer(tmp,1);
 
    sfârși;

cod de citit:

pentru i:=1 la MsgSize do
    începe
      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);
    sfârși;

Ei bine, pentru cei cu adevărat leneși - link către program și codul sursă al acestuia.

Mulțumesc.

Sursa: www.habr.com

Adauga un comentariu