Steganografia LSB

Njëherë e një kohë kam shkruar timen postimi i parë në hub. Dhe ai postim iu kushtua një problemi shumë interesant, pikërisht steganografisë. Natyrisht, zgjidhja e propozuar në atë temë të vjetër nuk mund të quhet steganografi në kuptimin e vërtetë të fjalës. Është thjesht një lojë me formate skedarësh, por megjithatë një lojë mjaft interesante.

Sot do të përpiqemi të gërmojmë pak më thellë dhe të shikojmë algoritmin LSB. Nëse jeni të interesuar, jeni të mirëpritur nën cat. (Nën prerje është trafiku: rreth një megabajt.)

Para së gjithash, është e nevojshme të bëjmë një hyrje të shkurtër. Të gjithë e dinë se qëllimi i kriptografisë është të bëjë të pamundur leximin e informacionit sekret. Sigurisht, kriptografia ka aplikimet e saj, por ka një qasje tjetër për mbrojtjen e të dhënave. Ne nuk duhet ta kodojmë informacionin, por pretendojmë se nuk e kemi atë. Pikërisht për këtë u shpik steganografia. Wikipedia na siguron se "steganografia (nga greqishtja στεγανοσ - e fshehur dhe greqishtja γραφω - shkruaj, fjalë për fjalë "shkrim sekret") është shkenca e transmetimit të fshehtë të informacionit duke mbajtur të fshehtë vetë faktin e transmetimit.

Sigurisht, askush nuk e ndalon kombinimin e metodave kriptografike dhe steganografike. Për më tepër, në praktikë ata e bëjnë këtë, por detyra jonë është të kuptojmë bazat. Nëse studioni me kujdes artikullin e Wikipedia, do të zbuloni se algoritmet e steganografisë përfshijnë të ashtuquajturat. kontejner dhe mesazh. Një kontejner është çdo informacion që ndihmon në fshehjen e mesazhit tonë sekret.

Në rastin tonë, kontejneri do të jetë një imazh në formatin BMP. Së pari, le të shohim strukturën e këtij skedari. Skedari mund të ndahet në 4 pjesë: titulli i skedarit, titulli i imazhit, paleta dhe vetë imazhi. Për qëllimet tona, ne vetëm duhet të dimë se çfarë është shkruar në kokë.

Dy bajtët e parë të kokës janë nënshkrimi BM, më pas madhësia e skedarit në bajt shkruhet me një fjalë të dyfishtë, 4 bajtët e ardhshëm janë të rezervuar dhe duhet të përmbajnë zero, dhe së fundi, një fjalë tjetër e dyfishtë përmban kompensimin nga fillimi i skedar në bajtet aktuale të imazhit. Në një skedar bmp 24-bit, çdo piksel është i koduar me tre bajt BGR.

Tani ne e dimë se si të arrijmë te imazhi, gjithçka që mbetet është të kuptojmë se si mund të shkruajmë informacionin që na nevojitet atje. Për këtë do të na duhet metoda LSB. Thelbi i metodës është si më poshtë: ne zëvendësojmë bitet më pak të rëndësishme në bajtet përgjegjëse për kodimin e ngjyrave. Le të themi nëse byti tjetër i mesazhit tonë sekret është 11001011, dhe bajtët 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ë me dy bit: 11, 00, 10, 11 dhe do të zëvendësojmë pjesët e rendit të ulët të imazhit me fragmentet që rezultojnë: ...11101111 01001100 01111110 0101100111…. Një zëvendësim i tillë në përgjithësi nuk është i dukshëm për syrin e njeriut. Për më tepër, shumë pajisje dalëse më të vjetra as nuk do të jenë në gjendje të shfaqin ndryshime të tilla të vogla.

Është e qartë se ju mund të ndryshoni jo vetëm 2 pjesët më pak të rëndësishme, por çdo numër prej tyre. Ekziston modeli i mëposhtëm: sa më shumë pjesë të ndryshojmë, aq më shumë informacion mund të fshehim dhe aq më shumë ndërhyrje do të shkaktojë kjo në imazhin origjinal. Për shembull, këtu janë dy imazhe:

Steganografia LSB
Steganografia LSB

Megjithë përpjekjet e mia më të mira, nuk munda të shihja ndryshimin midis tyre, por megjithatë, në imazhin e dytë, duke përdorur metodën e përshkruar, fshihet poezia e Lewis Carroll "Gjuetia e Snark". Nëse keni lexuar deri këtu, atëherë me siguri jeni të interesuar të mësoni rreth zbatimit. Është mjaft e thjeshtë, por unë do t'ju paralajmëroj menjëherë se gjithçka është bërë në Delphi. Ka dy arsye për këtë: 1. Mendoj se Delphi është një gjuhë e mirë; 2. Ky program ka lindur në procesin e përgatitjes së një kursi mbi bazat e vizionit kompjuterik, dhe djemtë të cilëve unë po i mësoj këtë kurs nuk dinë ende asgjë tjetër përveç Delphi. Për ata që nuk janë të njohur me sintaksën, një gjë duhet shpjeguar: shl x është një zhvendosje bit majtas me x, shr x është një zhvendosje bit në të djathtë me x.

Supozojmë se po shkruajmë tekstin e ruajtur në një varg në kontejner dhe po zëvendësojmë dy bajtët e poshtëm:
Kodi i regjistrimit:

për i:=1 në gjatësi(str) do
    filloj
      l1:=byte(str[i])shr6;
      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.Pozicioni:=f.Pozicioni-1;
      tmp:=((tmp shr 2) shl 2)+l1;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Pozicioni:=f.Pozicioni-1;
      tmp:=((tmp shr 2) shl 2)+l2;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Pozicioni:=f.Pozicioni-1;
      tmp:=((tmp shr 2) shl 2)+l3;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Pozicioni:=f.Pozicioni-1;
      tmp:=((tmp shr 2) shl 2)+l4;
      f.WriteBuffer(tmp,1);
 
    fund;

kodi për të lexuar:

për i:=1 në MsgSize do
    filloj
      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);
    fund;

Epo, për ata me të vërtetë dembelët - lidhje me programin dhe kodin burimor të tij.

Falemnderit.

Burimi: www.habr.com

Shto një koment