LSB steganografie

Eens op 'n tyd het ek my eerste plasing op hub. En daardie pos was opgedra aan 'n baie interessante probleem, naamlik steganografie. Natuurlik kan die oplossing wat in daardie ou onderwerp voorgestel word nie steganografie in die ware sin van die woord genoem word nie. Dit is net 'n speletjie met lêerformate, maar 'n redelik interessante speletjie nietemin.

Vandag sal ons probeer om 'n bietjie dieper te delf en na die LSB-algoritme te kyk. As jy belangstel, is jy welkom onder kat. (Onder die snit is verkeer: ongeveer 'n megagreep.)

Eerstens is dit nodig om 'n kort inleiding te maak. Almal weet dat die doel van kriptografie is om dit onmoontlik te maak om geheime inligting te lees. Natuurlik het kriptografie sy toepassings, maar daar is 'n ander benadering tot databeskerming. Ons hoef nie die inligting te enkripteer nie, maar maak asof ons dit nie het nie. Dit is presies hoekom steganografie uitgevind is. Wikipedia verseker ons dat "steganografie (van die Grieks στεγανοσ - verborge en die Griekse γραφω - ek skryf, letterlik "geheime skrif") die wetenskap is van die verborge oordrag van inligting deur die feit van oordrag geheim te hou.

Natuurlik verbied niemand om kriptografiese en steganografiese metodes te kombineer nie. Boonop doen hulle dit in die praktyk, maar ons taak is om die basiese beginsels te verstaan. As jy die Wikipedia-artikel noukeurig bestudeer, sal jy uitvind dat steganografie-algoritmes die sg. houer en boodskap. 'n Houer is enige inligting wat help om ons geheime boodskap weg te steek.

In ons geval sal die houer 'n prent in BMP-formaat wees. Kom ons kyk eers na die struktuur van hierdie lêer. Die lêer kan in 4 dele verdeel word: lêerkop, beeldopskrif, palet en die beeld self. Vir ons doeleindes hoef ons net te weet wat in die kopskrif geskryf is.

Die eerste twee grepe van die kopskrif is die BM-handtekening, dan word die lêergrootte in grepe in 'n dubbelwoord geskryf, die volgende 4 grepe is gereserveer en moet nulle bevat, en laastens, 'n ander dubbelwoord bevat die offset vanaf die begin van die lêer na die werklike grepe van die prent. In 'n 24-bis bmp-lêer word elke pixel met drie BGR-grepe geënkodeer.

Nou weet ons hoe om by die beeld uit te kom, al wat oorbly is om te verstaan ​​hoe ons die inligting wat ons nodig het daar kan skryf. Hiervoor sal ons die LSB-metode nodig hê. Die kern van die metode is soos volg: ons vervang die minste beduidende bisse in die grepe wat verantwoordelik is vir kleurkodering. Kom ons sê as die volgende greep van ons geheime boodskap 11001011 is, en die grepe in die beeld is...11101100 01001110 01111100 0101100111..., dan sal die enkodering so lyk. Ons sal die geheime boodskapgreep in 4 twee-bis dele verdeel: 11, 00, 10, 11, en die lae-orde stukkies van die prent vervang met die gevolglike fragmente: ...11101111 01001100 01111110 0101100111…. So 'n vervanging is oor die algemeen nie opmerklik vir die menslike oog nie. Boonop sal baie ouer uitvoertoestelle nie eers sulke geringe veranderinge kan vertoon nie.

Dit is duidelik dat jy nie net die 2 minste betekenisvolle stukkies kan verander nie, maar enige aantal daarvan. Daar is die volgende patroon: hoe meer stukkies ons verander, hoe meer inligting kan ons wegsteek, en hoe meer inmenging sal dit in die oorspronklike prent veroorsaak. Hier is byvoorbeeld twee beelde:

LSB steganografie
LSB steganografie

Ten spyte van my beste pogings kon ek nie die verskil tussen hulle sien nie, maar nietemin, in die tweede beeld, met behulp van die beskryfde metode, is Lewis Carroll se gedig "The Hunting of the Snark" versteek. As jy tot dusver gelees het, stel jy waarskynlik belang om oor die implementering te leer. Dit is redelik eenvoudig, maar ek sal jou dadelik waarsku dat alles in Delphi gedoen word. Daar is twee redes hiervoor: 1. Ek dink Delphi is 'n goeie taal; 2. Hierdie program is gebore in die proses om 'n kursus oor die basiese beginsels van rekenaarvisie voor te berei, en die ouens vir wie ek hierdie kursus aanbied, weet nog niks anders as Delphi nie. Vir diegene wat nie vertroud is met die sintaksis nie, moet een ding verduidelik word: shl x is 'n bietjiesgewyse skuif na links met x, shr x is 'n bietjiesgewyse skuif na regs deur x.

Ons neem aan dat ons teks wat in 'n string gestoor is in die houer skryf en die onderste twee grepe vervang:
Opname kode:

vir i:=1 tot lengte(str) doen
    begin
      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.Posisie:=f.Posisie-1;
      tmp:=((tmp shr 2) shl 2)+l1;
      f.SkryfBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Posisie:=f.Posisie-1;
      tmp:=((tmp shr 2) shl 2)+l2;
      f.SkryfBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Posisie:=f.Posisie-1;
      tmp:=((tmp shr 2) shl 2)+l3;
      f.SkryfBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Posisie:=f.Posisie-1;
      tmp:=((tmp shr 2) shl 2)+l4;
      f.SkryfBuffer(tmp,1);
 
    einde;

kode om te lees:

vir i:=1 na MsgSize doen
    begin
      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);
    einde;

Wel, vir die regtig lui mense - skakel na die program en sy bronkode.

Dankie.

Bron: will.com

Voeg 'n opmerking