LSB steganografi

Det var en gang jeg skrev min første innlegg på hub. Og det innlegget var dedikert til et veldig interessant problem, nemlig steganografi. Selvfølgelig kan løsningen som er foreslått i det gamle emnet ikke kalles steganografi i ordets sanne betydning. Det er bare et spill med filformater, men et ganske interessant spill likevel.

I dag skal vi prøve å grave litt dypere og se på LSB-algoritmen. Er du interessert er du velkommen under katt. (Under kuttet er trafikk: omtrent en megabyte.)

Først av alt er det nødvendig å lage en kort introduksjon. Alle vet at formålet med kryptografi er å gjøre det umulig å lese hemmelig informasjon. Selvfølgelig har kryptografi sine applikasjoner, men det er en annen tilnærming til databeskyttelse. Vi trenger ikke å kryptere informasjonen, men late som om vi ikke har den. Det er nettopp derfor steganografi ble oppfunnet. Wikipedia forsikrer oss om at "steganografi (fra det greske στεγανοσ - skjult og det greske γραφω - jeg skriver, bokstavelig talt "hemmelig skrift") er vitenskapen om skjult overføring av informasjon ved å holde selve overføringen hemmelig.

Selvfølgelig er det ingen som forbyr å kombinere kryptografiske og steganografiske metoder. Dessuten gjør de dette i praksis, men vår oppgave er å forstå det grunnleggende. Hvis du studerer Wikipedia-artikkelen nøye, vil du finne ut at steganografialgoritmer inkluderer de såkalte. beholder og melding. En beholder er all informasjon som hjelper til med å skjule vår hemmelige melding.

I vårt tilfelle vil beholderen være et bilde i BMP-format. La oss først se på strukturen til denne filen. Filen kan deles inn i 4 deler: filoverskrift, bildehode, palett og selve bildet. For våre formål trenger vi bare å vite hva som er skrevet i overskriften.

De to første bytene i overskriften er BM-signaturen, deretter skrives filstørrelsen i byte i et dobbeltord, de neste 4 bytene er reservert og må inneholde nuller, og til slutt inneholder et annet dobbeltord forskyvningen fra begynnelsen av filen til de faktiske bytene til bildet. I en 24-bits bmp-fil er hver piksel kodet med tre BGR-byte.

Nå vet vi hvordan vi kommer til bildet, det gjenstår å forstå hvordan vi kan skrive informasjonen vi trenger der. Til dette trenger vi LSB-metoden. Essensen av metoden er som følger: vi erstatter de minst signifikante bitene i bytene som er ansvarlige for fargekoding. La oss si at hvis neste byte i vår hemmelige melding er 11001011, og bytene i bildet er...11101100 01001110 01111100 0101100111... så vil kodingen se slik ut. Vi vil dele opp den hemmelige meldingsbyten i 4 to-biters deler: 11, 00, 10, 11, og erstatte lavordensbitene i bildet med de resulterende fragmentene: ...11101111 0100110010 0101100111…. En slik erstatning er generelt ikke merkbar for det menneskelige øyet. Dessuten vil mange eldre utdataenheter ikke engang kunne vise slike mindre endringer.

Det er klart at du kan endre ikke bare de 2 minst signifikante bitene, men et hvilket som helst antall av dem. Det er følgende mønster: jo flere biter vi endrer, jo mer informasjon kan vi skjule, og jo mer interferens vil dette forårsake i det originale bildet. Her er for eksempel to bilder:

LSB steganografi
LSB steganografi

Til tross for min beste innsats, kunne jeg ikke se forskjellen mellom dem, men likevel, i det andre bildet, ved å bruke den beskrevne metoden, er Lewis Carrolls dikt "The Hunting of the Snark" skjult. Hvis du har lest så langt, så er du sannsynligvis interessert i å lære om implementeringen. Det er ganske enkelt, men jeg vil advare deg med en gang om at alt er gjort i Delphi. Det er to grunner til dette: 1. Jeg synes Delphi er et godt språk; 2. Dette programmet ble født i prosessen med å forberede et kurs om grunnleggende datasyn, og gutta som jeg underviser for dette kurset vet ennå ikke noe annet enn Delphi. For de som ikke er kjent med syntaksen, må en ting forklares: shl x er en bitvis forskyvning til venstre med x, shr x er en bitvis forskyvning til høyre med x.

Vi antar at vi skriver tekst lagret i en streng inn i beholderen og erstatter de to nederste bytene:
Opptakskode:

for i:=1 til lengde(str) gjør
    begynne
      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.Posisjon:=f.Posisjon-1;
      tmp:=((tmp shr 2) shl 2)+l1;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Posisjon:=f.Posisjon-1;
      tmp:=((tmp shr 2) shl 2)+l2;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Posisjon:=f.Posisjon-1;
      tmp:=((tmp shr 2) shl 2)+l3;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Posisjon:=f.Posisjon-1;
      tmp:=((tmp shr 2) shl 2)+l4;
      f.WriteBuffer(tmp,1);
 
    ende;

kode å lese:

for i:=1 til MsgSize do
    begynne
      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;

Vel, for de virkelig late - lenke til programmet og dets kildekode.

Takk.

Kilde: www.habr.com

Legg til en kommentar