Dikur, shkrova postin tim të parë në Ai post ishte i dedikuar për një problem shumë interesante, konkretisht steganografinë. Natyrisht, zgjidhja e propozuar në atë temë të vjetër nuk mund të quhet steganografi në kuptimin e vërtetë të fjalës. Kjo është vetëm një lojë me formatet e skedarëve, por, megjithatë, është 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 dërgoni në artikullin e mëposhtëm. (Nën artikull, 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Ă« qĂ« tĂ« bĂ«jĂ« tĂ« pamundur leximin e informacionit sekret. Natyrisht, kriptografia ka fushat e saj tĂ« pĂ«rdorimit, por ka edhe njĂ« qasje tjetĂ«r pĂ«r tĂ« mbrojtur tĂ« dhĂ«nat. Mund tĂ« mos e kodojmĂ« informacionin, por tĂ« bĂ«jmĂ« si tĂ« mos kemi atĂ«. Pikerisht pĂ«r kĂ«tĂ« Ă«shtĂ« shpikur steganografia. Wikipedia na siguron se, "steganografia (nga greqishtja ÏÏÎ”ÎłÎ±ÎœÎżÏ - i fshehtĂ« dhe greqishtja ÎłÏαÏÏ - shkruaj, nĂ« kuptimin e vĂ«rtetĂ« 'shkrim i fshehtĂ«') - Ă«shtĂ« shkenca e transferimit tĂ« fshehtĂ« tĂ« informacionit duke ruajtur nĂ« fshehtĂ«si vetĂ« faktin e transferimit."
Sigurisht, askush nuk e ndalon bashkimin e metodave kriptografike dhe steganografike. Për më tepër, në praktikë, kjo zbatohet, por detyra jonë është të kuptojmë bazat. Nëse e shqyrtojmë me kujdes artikullin nga Wikipedia, mund të mësojmë se në algoritmet e steganografisë figurojnë një kontenier dhe një mesazh. Kontenieri është çdo informacion që ndihmon në fshehjen e mesazhit tonë sekret.
Në rastin tonë, kontenieri do të jetë një imazh në format BMP. Fillimisht, le të shqyrtojmë strukturën e këtij skedari. Skedari mund të ndahet në mënyrë kushtazore në 4 pjesë: kryefaqja e skedarit, kryefaqja e imazhit, paleta dhe vetë imazhi. Për qëllimet tona, duhet të dimë vetëm atë që është shkruar në kryefaqe.
Dy bajtët e parë të kryefaqes janë nënshkrimi BM, pasuar nga një fjalë e dyfishtë që përmban madhësinë e skedarit në bajta, katër bajtët e ardhshëm janë të rezervuar dhe duhet të përmbajnë zero, dhe përfundimisht, në një fjalë tjetër dyfish, është e shënuar offseti nga fillimi i skedarit deri te vetë bajtët e imazhit. Në një skedar bmp 24-bit, çdo piksel kodifikohet me tre bajta BGR.
Tani ne e njohur, si tĂ« arrijmĂ« te imazhi, tani na mbetet tĂ« kuptojmĂ« se si mund ta regjistrojmĂ« informacionin tonĂ« tĂ« nevojshĂ«m atje. PĂ«r kĂ«tĂ«, na nevojitet metoda LSB. Esenca e metodĂ«s Ă«shtĂ« si nĂ« vijim: ne zĂ«vendĂ«sojmĂ« bitĂ«t mĂ« tĂ« vegjĂ«l nĂ« byte-et qĂ« pĂ«rgjigjen pĂ«r kodimin e ngjyrĂ«s. Supozoni se byte-i i radhĂ«s i mesazhit tonĂ« tĂ« fshehur Ă«shtĂ« 11001011, dhe byte-et nĂ« imazh janĂ«âŠ11101100 01001110 01111100 0101100111âŠ, atĂ«herĂ« kodimi do tĂ« duket kĂ«shtu. Ne do ta ndajmĂ« byte-in e mesazhit tĂ« fshehtĂ« nĂ« 4 pjesĂ« dy-bitĂ«she: 11, 00, 10, 11, dhe do tĂ« zĂ«vendĂ«sojmĂ« bitĂ«t mĂ« tĂ« vegjĂ«l tĂ« imazhit: âŠ11101111 01001100 01111110 0101100111âŠ. Kjo zĂ«vendĂ«sim nĂ« pĂ«rgjithĂ«si nuk Ă«shtĂ« e dukshme pĂ«r syrin e njeriut. PĂ«r mĂ« tepĂ«r, shumĂ« pajisje tĂ« vjetra tĂ« nxjerrjes, madje as nuk do tĂ« jenĂ« nĂ« gjendje tĂ« shfaqin kĂ«to ndryshime tĂ« vogla.
E qartë se mund të ndryshojmë jo vetëm 2 bitët më të vogël, por gjithashtu çdo numër të mundshëm të tyre. Këtu ka një ligjshmëri të tillë: sa më shumë bitë të ndryshojmë, aq më shumë informacion mund të fshehim, dhe aq më shumë ndërprerje do të shkaktojë kjo në imazhin origjinal. Për shembull, këtu janë dy imazhe:


Me gjithĂ« dĂ«shirĂ«n time nuk arrita tĂ« shoh dallimin midis tyre, megjithatĂ« nĂ« imazhin e dytĂ« me metodĂ«n e pĂ«rshkruar Ă«shtĂ« fshehur poezia e Lewis Carroll-it âHunting of the Snarkâ. NĂ«se e keni lexuar deri kĂ«tu, sigurisht jeni tĂ« interesuar tĂ« dini edhe pĂ«r realizimin. Ajo Ă«shtĂ« mjaft e thjeshtĂ«, por menjĂ«herĂ« paralajmĂ«roj qĂ« gjithçka Ă«shtĂ« bĂ«rĂ« nĂ« Delphi. Shkaku pĂ«r kĂ«tĂ« janĂ« dy: 1. Mendoj se Delphi Ă«shtĂ« njĂ« gjuhĂ« e mirĂ«; 2. Ky program lindi gjatĂ« pĂ«rgatitjes sĂ« njĂ« kursi mbi parimet e vizionit machine, dhe djemtĂ« tĂ« cilĂ«ve po ua jap kĂ«tĂ« kurs, deri tani nuk dinĂ« asgjĂ« tjetĂ«r veç Delphi. PĂ«r ata qĂ« nuk janĂ« tĂ« njohur me sintaksĂ«n, duhet tĂ« sqaroj njĂ« gjĂ« shl x â ndĂ«rrim bitĂ«sh nĂ« tĂ« majtĂ« pĂ«r x, shr x â ndĂ«rrim bitĂ«sh nĂ« tĂ« djathtĂ« pĂ«r x.
Le të supozojmë se po shkruajmë në një kontenier tekstin që ruhet në një varg dhe zëvendësojmë dy bajtët e fundit:
Kodi për shk Writing:
for i:=1 to length(str) do
    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.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 të lexuar:
for i:=1 to MsgSize do
    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);
    end;
Dhe pĂ«r ata qĂ« janĂ« krejtĂ«sisht lenkĂ« â .
Faleminderit.
Burimi: habr.com
