LSB steganografi

Dikur kam shkruar postin tim tĂ« parĂ« nĂ« HabrĂ«. Ai post ishte i dedikuar njĂ« problemi shumĂ« interesant, konkretisht steganografisĂ«. Sigurisht, zgjidhja e propozuar nĂ« atĂ« temĂ« tĂ« vjetĂ«r nuk mund tĂ« quhet steganografi nĂ« kuptimin e vĂ«rtetĂ« tĂ« fjalĂ«s. ËshtĂ« vetĂ«m njĂ« lojĂ« me formatet e skedarĂ«ve, por, megjithatĂ«, njĂ« lojĂ« mjaft interesante.

Sot do të përpiqemi të thellohemi pak më shumë dhe do të shqyrtojmë algoritmin LSB. Nëse jeni të interesuar, ju lutem, kaloni poshtë. (Poshtë, trafiku: rreth një megabajt.)

SĂ« pari, Ă«shtĂ« e nevojshme tĂ« bĂ«jmĂ« njĂ« hyrje tĂ« vogĂ«l. TĂ« gjithĂ« e dinĂ« se qĂ«llimi i kriptografisĂ« Ă«shtĂ« tĂ« bĂ«jĂ« leximin e informacionit sekret tĂ« pamundur. Natyrisht, kriptografia ka fushat e saj tĂ« aplikimit, por ekziston edhe njĂ« qasje tjetĂ«r pĂ«r mbrojtjen e tĂ« dhĂ«nave. Mund tĂ« mos kriptojmĂ« informacionin, por tĂ« simulojmĂ« se nuk e kemi atĂ«. PikĂ«risht pĂ«r kĂ«tĂ« Ă«shtĂ« menduar steganografia. Wikipedia na siguron se "steganografia (nga greqishtja ÏƒÏ„Î”ÎłÎ±ÎœÎżÏƒ — i fshehur dhe greqishtja ÎłÏÎ±Ï†Ï‰ — shkruaj, dosido 'shkrim sekret') Ă«shtĂ« shkenca e transmetimit tĂ« fshehtĂ« tĂ« informacionit duke mbajtur nĂ« sekret faktin e vetĂ« transmetimit.

Sigurisht, askush nuk e ndalon kombinimin e metodave kriptografike dhe steganografike. Për më tepër, në praktikë kështu bëhet, por detyra jonë është të kuptojmë themeloret. Nëse studiojmë me kujdes artikullin nga Wikipedia, mund të mësojmë se në algoritmet e steganografisë figurojnë kontenieri dhe mesazhi. Kontenieri është çdo informacion që ndihmon në fshehjen e mesazhit tonë sekret.

Në rastin tonë, kontenieri do të jetë një figurë në formatin BMP. Për të filluar, le të shqyrtojmë strukturën e këtij skedari. Skedari mund të ndahet në mënyrë të qëllimshme në 4 pjesë: titulli i skedarit, titulli i figurës, paleta dhe vetë figura. Për qëllimet tona, duhet të dimë vetëm atë që është shkruar në titull.

Dy bajtët e parë të titullit janë nënshkrimi BM, më pas në një fjalë të dyfishtë shkruhet madhësia e skedarit në bajta, pasuar nga 4 bajtë e rezervuar që duhet të përmbajnë zero dhe, në fund, në një fjalë tjetër të dyfishtë shkruhet zhvendosja nga fillimi i skedarit deri te bajtët e figurës. Në një skedar bmp 24-bitësh, çdo piksel kodifikohet me tre bajta BGR.

Tani tani e dimĂ« se si tĂ« arrijmĂ« nĂ« imazh, na mbetet tĂ« kuptojmĂ« si mund tĂ« shkruajmĂ« informacionin qĂ« na nevojitet atje. PĂ«r kĂ«tĂ«, do na ndihmojĂ« metoda LSB. Thelbi i metodĂ«s Ă«shtĂ« si vijon: ne zĂ«vendĂ«sojmĂ« bitĂ«t e fundit nĂ« bajtat qĂ« pĂ«rdoren pĂ«r kodimin e ngjyrave. Supozoni se njĂ« bajt i mesazhit tonĂ« sekret Ă«shtĂ« – 11001011, dhe bajtat nĂ« imazh janĂ« –
11101100 01001110 01111100 0101100111
, atĂ«herĂ« kodimi do tĂ« duket kĂ«shtu. Ne do ta ndajmĂ« bajtin e mesazhit sekret nĂ« 4 pjesĂ« dy-bitĂ«she: 11, 00, 10, 11, dhe do tĂ« zĂ«vendĂ«sojmĂ« bitĂ«t e fundit tĂ« imazhit: 
11101111 01001100 01111110 0101100111
. Kjo zĂ«vendĂ«sim nĂ« shkallĂ« tĂ« pĂ«rgjithshme nuk Ă«shtĂ« e dukshme pĂ«r syrin e njeriut. PĂ«r mĂ« tepĂ«r, shumĂ« nga pajisjet e vjetra tĂ« daljes, madje nuk do tĂ« jenĂ« nĂ« gjendje tĂ« shfaqin ndryshime kaq tĂ« vogla.

E qartë, se mund të ndryshojmë jo vetëm 2 bitët e fundit, por çdo numër të tyre. Këtu ka një rregull: sa më shumë bitë që ndryshojmë, aq më shumë informacion ne mund të fshehim, dhe aq më shumë shqetësime do të shkaktojë kjo në imazhin origjinal. Për shembull, ja dy imazhe:

LSB steganografi
LSB steganografi

MegjithĂ«se e dĂ«shiroj, nuk kam mundur tĂ« shoh diferencĂ«n midis tyre, megjithatĂ« nĂ« imazhin e dytĂ« me metodĂ«n e pĂ«rshkruar Ă«shtĂ« fshehur poema e Lewis Carroll «KĂ«rkimi i Snarkut». NĂ«se keni arritur deri nĂ« kĂ«tĂ« pikĂ«, ka gjasa qĂ« ju intereson edhe implementimi. Ajo Ă«shtĂ« mjaft e thjeshtĂ«, por do tĂ« paralajmĂ«roj menjĂ«herĂ« se Ă«shtĂ« realizuar krejtĂ«sisht nĂ« Delphi. Shkaqet pĂ«r kĂ«tĂ« janĂ« dy: 1. UnĂ« e mendoj Delphi si njĂ« gjuhĂ« tĂ« mirĂ«; 2. Ky program lindi gjatĂ« pĂ«rgatitjes sĂ« njĂ« kursi mbi bazat e vizionit tĂ« makinave, dhe djemtĂ« tĂ« cilĂ«ve unĂ« po e mbaj kĂ«tĂ« kurs, deri tani nuk dinĂ« gjuhĂ« tjetĂ«r pĂ«rveç Delphi. PĂ«r ata qĂ« nuk janĂ« tĂ« njohur me sintaksĂ«n duhet tĂ« sqaroj njĂ« gjĂ« shl x – zhvendosje bit tĂ« majtĂ« pĂ«r x, shr x – zhvendosje bit tĂ« djathtĂ« pĂ«r x.

Le të supozojmë se po regjistrojmë në kontejner një tekst, i ruajtur në një varg dhe zëvendësojmë dy bitët e fundit:
Kodi për regjistrimin:

for i:=1 to length(str) do
    fillo
      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.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);
 
    end;

Kodi për leximin:

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

Dhe pĂ«r ata qĂ« janĂ« plotĂ«sisht lenxhinj – linku pĂ«r programin dhe kodin e tij burimor.

Faleminderit.

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster