LSB steganografi

Engang skrev jeg min første indlæg på hub. Og det indlæg var dedikeret til et meget interessant problem, nemlig steganografi. Selvfølgelig kan løsningen foreslået i det gamle emne ikke kaldes steganografi i ordets sande betydning. Det er bare et spil med filformater, men et ret interessant spil ikke desto mindre.

I dag vil vi prøve at grave lidt dybere og se på LSB-algoritmen. Er du interesseret, er du velkommen under kat. (Under klippet er trafik: omkring en megabyte.)

Først og fremmest er det nødvendigt at lave en kort introduktion. Alle ved, at formålet med kryptografi er at gøre det umuligt at læse hemmelige oplysninger. Selvfølgelig har kryptografi sine applikationer, men der er en anden tilgang til databeskyttelse. Vi skal ikke kryptere oplysningerne, men lade som om, vi ikke har dem. Det er netop derfor steganografi blev opfundet. Wikipedia forsikrer os om, at "steganografi (fra det græske στεγανοσ - skjult og det græske γραφω - jeg skriver, bogstaveligt talt "hemmelig skrift") er videnskaben om den skjulte transmission af information ved at holde selve transmissionen hemmelig.

Selvfølgelig er der ingen, der forbyder at kombinere kryptografiske og steganografiske metoder. Desuden gør de i praksis dette, men vores opgave er at forstå det grundlæggende. Hvis du nøje studerer Wikipedia-artiklen, vil du finde ud af, at steganografi-algoritmer omfatter de såkaldte. container og besked. En container er enhver information, der hjælper med at skjule vores hemmelige besked.

I vores tilfælde vil beholderen være et billede i BMP-format. Lad os først se på strukturen af ​​denne fil. Filen kan opdeles i 4 dele: filhoved, billedhoved, palet og selve billedet. Til vores formål behøver vi kun at vide, hvad der står i overskriften.

De første to bytes i overskriften er BM-signaturen, derefter skrives filstørrelsen i bytes i et dobbeltord, de næste 4 bytes er reserverede og skal indeholde nuller, og til sidst indeholder et andet dobbeltord forskydningen fra begyndelsen af fil til de faktiske bytes af billedet. I en 24-bit bmp-fil er hver pixel kodet med tre BGR-bytes.

Nu ved vi, hvordan vi kommer til billedet, det eneste, der er tilbage, er at forstå, hvordan vi kan skrive den information, vi har brug for der. Til dette skal vi bruge LSB-metoden. Essensen af ​​metoden er som følger: vi erstatter de mindst signifikante bits i de bytes, der er ansvarlige for farvekodning. Lad os sige, at hvis den næste byte i vores hemmelige besked er 11001011, og bytene i billedet er...11101100 01001110 01111100 0101100111... så vil kodningen se sådan ud. Vi opdeler den hemmelige meddelelsesbyte i 4 to-bit dele: 11, 00, 10, 11, og erstatter de laveste bits af billedet med de resulterende fragmenter: ...11101111 01001100 01111110 0101100111…. En sådan erstatning er generelt ikke mærkbar for det menneskelige øje. Desuden vil mange ældre outputenheder ikke engang være i stand til at vise sådanne mindre ændringer.

Det er klart, at du ikke kun kan ændre de 2 mindst signifikante bits, men et hvilket som helst antal af dem. Der er følgende mønster: Jo flere bits vi ændrer, jo mere information kan vi skjule, og jo mere interferens vil dette forårsage i det originale billede. Her er for eksempel to billeder:

LSB steganografi
LSB steganografi

Trods min bedste indsats kunne jeg ikke se forskellen mellem dem, men ikke desto mindre er Lewis Carrolls digt "The Hunting of the Snark" skjult på det andet billede, ved hjælp af den beskrevne metode. Hvis du har læst så langt, så er du sikkert interesseret i at lære om implementeringen. Det er ret simpelt, men jeg vil med det samme advare dig om, at alt foregår i Delphi. Der er to grunde til dette: 1. Jeg synes, Delphi er et godt sprog; 2. Dette program blev født i færd med at forberede et kursus om det grundlæggende i computersyn, og de fyre, som jeg underviser i dette kursus, ved endnu ikke andet end Delphi. For dem, der ikke er bekendt med syntaksen, skal en ting forklares: shl x er et bitvist skift til venstre med x, shr x er et bitvist skift til højre med x.

Vi antager, at vi skriver tekst gemt i en streng ind i beholderen og erstatter de to nederste bytes:
Optagelseskode:

for i:=1 til længde(str) gør
    begynde
      1:=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.Position:=f.Position-1;
      tmp:=((tmp shr 2) shl 2)+l1;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Position:=f.Position-1;
      tmp:=((tmp shr 2) shl 2)+l2;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Position:=f.Position-1;
      tmp:=((tmp shr 2) shl 2)+l3;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Position:=f.Position-1;
      tmp:=((tmp shr 2) shl 2)+l4;
      f.WriteBuffer(tmp,1);
 
    ende;

kode til at læse:

for i:=1 til MsgSize do
    begynde
      f.ReadBuffer(tmp,1);
      1:=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+2+3+4);
    ende;

Nå, til de virkelig dovne - link til programmet og dets kildekode.

Tak.

Kilde: www.habr.com

Tilføj en kommentar