LSB steganografia

Kerran kirjoitin omani ensimmäinen viesti hubissa. Ja tuo viesti oli omistettu erittäin mielenkiintoiselle ongelmalle, nimittäin steganografialle. Tietenkään tuossa vanhassa aiheessa ehdotettua ratkaisua ei voida kutsua steganografiaksi sanan varsinaisessa merkityksessä. Se on vain peli tiedostomuodoilla, mutta melko mielenkiintoinen peli siitä huolimatta.

Tänään yritämme kaivaa hieman syvemmälle ja tarkastella LSB-algoritmia. Jos olet kiinnostunut, olet tervetullut kissan alle. (Leikkauksen alla on liikennettä: noin megatavu.)

Ensinnäkin on tarpeen tehdä lyhyt esittely. Kaikki tietävät, että salauksen tarkoitus on tehdä salaisen tiedon lukemisesta mahdotonta. Tietysti kryptografialla on sovelluksensa, mutta tietosuojaan on myös toinen lähestymistapa. Meidän ei tarvitse salata tietoja, vaan teeskennellä, ettei meillä ole niitä. Juuri tästä syystä steganografia keksittiin. Wikipedia vakuuttaa meille, että "steganografia (kreikan kielestä στεγανοσ - piilotettu ja kreikan kielestä γραφω - kirjoitan, kirjaimellisesti "salainen kirjoittaminen") on tiedettä piilotetusta tiedonsiirrosta pitämällä itse lähetysasia salassa.

Kukaan ei tietenkään kiellä kryptografisten ja steganografisten menetelmien yhdistämistä. Lisäksi käytännössä he tekevät tämän, mutta meidän tehtävämme on ymmärtää perusasiat. Jos tutkit huolellisesti Wikipedian artikkelia, huomaat, että steganografia-algoritmit sisältävät ns. kontti ja viesti. Säiliö on mitä tahansa tietoa, joka auttaa piilottamaan salaisen viestimme.

Meidän tapauksessamme säilö on BMP-muodossa oleva kuva. Katsotaanpa ensin tämän tiedoston rakennetta. Tiedosto voidaan jakaa 4 osaan: tiedoston otsikko, kuvan otsikko, paletti ja itse kuva. Meidän tarvitsee vain tietää, mitä otsikossa on kirjoitettu.

Otsikon kaksi ensimmäistä tavua ovat BM-allekirjoitus, sitten tiedoston koko tavuina kirjoitetaan kaksoissanalla, seuraavat 4 tavua on varattu ja niiden tulee sisältää nollia, ja lopuksi toinen kaksoissana sisältää siirtymän tekstin alusta. tiedosto kuvan todellisiin tavuihin. 24-bittisessä bmp-tiedostossa jokainen pikseli on koodattu kolmella BGR-tavulla.

Nyt tiedämme kuinka päästä kuvaan, ei ole muuta kuin ymmärrämme, kuinka voimme kirjoittaa sinne tarvitsemamme tiedon. Tätä varten tarvitsemme LSB-menetelmän. Menetelmän ydin on seuraava: korvaamme vähiten merkitsevät bitit värikoodauksesta vastaavissa tavuissa. Oletetaan, että jos salaisen viestimme seuraava tavu on 11001011 ja kuvan tavut ovat...11101100 01001110 01111100 0101100111..., niin koodaus näyttää tältä. Jaamme salaisen viestin tavun 4 kaksibittiseen osaan: 11, 00, 10, 11 ja korvaamme kuvan matalan kertaluvun bitit tuloksena olevilla fragmenteilla: ...11101111 01001100 01111110 0101100111… Tällainen korvaaminen ei yleensä ole havaittavissa ihmissilmälle. Lisäksi monet vanhemmat tulostuslaitteet eivät edes pysty näyttämään tällaisia ​​pieniä muutoksia.

On selvää, että voit muuttaa ei vain kahta vähiten merkitsevää bittiä, vaan minkä tahansa määrän niitä. On seuraava kaava: mitä enemmän bittejä muutamme, sitä enemmän tietoa voimme piilottaa ja sitä enemmän häiriöitä tämä aiheuttaa alkuperäisessä kuvassa. Tässä on esimerkiksi kaksi kuvaa:

LSB steganografia
LSB steganografia

Parhaista yrityksistäni huolimatta en nähnyt eroa niiden välillä, mutta siitä huolimatta toisessa kuvassa kuvatulla menetelmällä on piilotettu Lewis Carrollin runo "Snarkin metsästys". Jos olet lukenut tähän asti, olet todennäköisesti kiinnostunut oppimaan toteutuksesta. Se on melko yksinkertaista, mutta varoitan heti, että kaikki tehdään Delphissä. Tähän on kaksi syytä: 1. Mielestäni Delphi on hyvä kieli; 2. Tämä ohjelma syntyi tietokonenäön perusteiden kurssia valmisteltaessa, eivätkä kaverit, joille tätä kurssia opetan, vielä tiedä mitään muuta kuin Delphiä. Niille, jotka eivät tunne syntaksia, yksi asia on selitettävä: shl x on bittikohtainen siirto vasemmalle x:llä, shr x on bittikohtainen siirto oikealle x:llä.

Oletetaan, että kirjoitamme säilöön merkkijonoon tallennettua tekstiä ja korvaamme kaksi alinta tavua:
Tallennuskoodi:

for i:=1 to long(str) do
    alkaa
      l1:=tavu(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)+1;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Position:=f.Position-1;
      tmp:=((tmp shr 2) shl 2)+2;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Position:=f.Position-1;
      tmp:=((tmp shr 2) shl 2)+3;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Position:=f.Position-1;
      tmp:=((tmp shr 2) shl 2)+4;
      f.WriteBuffer(tmp,1);
 
    end;

luettava koodi:

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

No, todella laiskoille - linkki ohjelmaan ja sen lähdekoodiin.

Kiitos.

Lähde: will.com

Lisää kommentti