LSB steganography

Eartiids skreau ik myn earste post op hub. En dy post wie wijd oan in hiel nijsgjirrich probleem, nammentlik steganography. Fansels kin de oplossing foarsteld yn dat âlde ûnderwerp net steganografy neamd wurde yn 'e wiere sin fan it wurd. It is gewoan in spultsje mei bestânsformaten, mar dochs in aardich ynteressant spultsje.

Hjoed sille wy besykje in bytsje djipper te graven en nei it LSB-algoritme te sjen. As jo ​​ynteressearre binne, binne jo wolkom ûnder kat. (Under de besuniging is ferkear: sawat in megabyte.)

Alderearst is it nedich om in koarte ynlieding te meitsjen. Elkenien wit dat it doel fan kryptografy is om it ûnmooglik te meitsjen om geheime ynformaasje te lêzen. Fansels hat kryptografy har applikaasjes, mar d'r is in oare oanpak foar gegevensbeskerming. Wy hoege de ynformaasje net te fersiferjen, mar dogge as dat wy it net hawwe. Dit is krekt wêrom steganography waard útfûn. Wikipedia garandearret ús dat "steganografy (fan it Grykske στεγανοσ - ferburgen en it Grykske γραφω - ik skriuw, letterlik "geheim skriuwen") de wittenskip is fan 'e ferburgen oerdracht fan ynformaasje troch it feit fan oerdracht geheim te hâlden.

Fansels ferbiedt gjinien it kombinearjen fan kryptografyske en steganografyske metoaden. Boppedat dogge se dit yn 'e praktyk, mar ús taak is om de basis te begripen. As jo ​​sekuer bestudearje de Wikipedia artikel, Jo sille fine út dat steganography algoritmen befetsje de saneamde. kontener en berjocht. In kontener is elke ynformaasje dy't ús geheime berjocht helpt te ferbergjen.

Yn ús gefal sil de kontener in ôfbylding wêze yn BMP-formaat. Litte wy earst nei de struktuer fan dit bestân sjen. It bestân kin wurde ferdield yn 4 dielen: triemkop, ôfbyldingkop, palet en de ôfbylding sels. Foar ús doelen hoege wy allinich te witten wat yn 'e koptekst skreaun is.

De earste twa bytes fan 'e koptekst binne de BM-hântekening, dan wurdt de triemgrutte yn bytes skreaun yn in dûbel wurd, de folgjende 4 bytes binne reservearre en moatte nullen befetsje, en as lêste befettet in oar dûbel wurd de offset fan it begjin fan 'e bestân nei de eigentlike bytes fan 'e ôfbylding. Yn in 24-bit bmp-bestân wurdt elke piksel kodearre mei trije BGR-bytes.

No witte wy hoe't wy nei it byld komme, alles wat oerbliuwt is te begripen hoe't wy de ynformaasje kinne skriuwe dy't wy dêr nedich binne. Dêrfoar sille wy de LSB-metoade nedich hawwe. De essinsje fan 'e metoade is as folget: wy ferfange de minst signifikante bits yn' e bytes ferantwurdlik foar kleurkodearring. Litte wy sizze as de folgjende byte fan ús geheime berjocht 11001011 is, en de bytes yn 'e ôfbylding binne ... 11101100 01001110 01111100 0101100111 ..., dan sil de kodearring der sa útsjen. Wy sille de geheime berjochtbyte splitse yn 4 twa-bit dielen: 11, 00, 10, 11, en ferfange de leechsteande bits fan 'e ôfbylding mei de resultearjende fragminten: ...11101111 01001100 01111110 0101100111…. Sa'n ferfanging is oer it algemien net te merken foar it minsklik each. Boppedat sille in protte âldere útfierapparaten sokke lytse feroarings net iens kinne werjaan.

It is dúdlik dat jo net allinich de 2 minste signifikante bits kinne feroarje, mar elk oantal fan har. D'r is it folgjende patroan: hoe mear bits wy feroarje, hoe mear ynformaasje wy kinne ferbergje, en hoe mear ynterferinsje dit sil feroarsaakje yn 'e orizjinele ôfbylding. Hjir binne bygelyks twa ôfbyldings:

LSB steganography
LSB steganography

Nettsjinsteande myn bêste ynspanningen koe ik it ferskil tusken har net sjen, mar dochs, yn 'e twadde ôfbylding, mei de beskreaune metoade, is Lewis Carroll's gedicht "The Hunting of the Snark" ferburgen. As jo ​​​​sa fier hawwe lêzen, dan binne jo wierskynlik ynteressearre yn te learen oer de ymplemintaasje. It is frij simpel, mar ik sil jo daliks warskôgje dat alles dien wurdt yn Delphi. Dêr binne twa redenen foar: 1. Ik tink dat Delphi in goede taal is; 2. Dit programma is berne yn it proses fan it tarieden fan in kursus oer de basis fan kompjûterfisy, en de jonges oan wa't ik dizze kursus learje, witte noch neat oars as Delphi. Foar dyjingen dy't net bekend binne mei de syntaksis, moat ien ding útlein wurde: shl x is in bitwize ferskowing nei lofts troch x, shr x is in bitwize ferskowing nei rjochts troch x.

Wy geane derfan út dat wy tekst skriuwe opslein yn in tekenrige yn 'e kontener en ferfange de ûnderste twa bytes:
Opname koade:

foar i:=1 oant lingte (str) do
    begjinne
      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.Posysje:=f.Posysje-1;
      tmp:=((tmp shr 2) shl 2)+l1;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Posysje:=f.Posysje-1;
      tmp:=((tmp shr 2) shl 2)+l2;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Posysje:=f.Posysje-1;
      tmp:=((tmp shr 2) shl 2)+l3;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Posysje:=f.Posysje-1;
      tmp:=((tmp shr 2) shl 2)+l4;
      f.WriteBuffer(tmp,1);
 
    ein;

koade om te lêzen:

foar i:=1 to MsgSize do
    begjinne
      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);
    ein;

No, foar de echt luie - keppeling nei it programma en syn boarnekoade.

Спасибо.

Boarne: www.habr.com

Add a comment