LSB steganography

Carekê min xweya xwe nivîsand yekem posta li ser hub. Û ew post ji pirsgirêkek pir balkêş re, ango steganography, hate veqetandin. Helbet çareseriya ku di wê mijara kevin de tê pêşniyarkirin bi wateya rast nayê gotin steganografiya. Ew tenê lîstikek bi formatên pelan e, lê dîsa jî lîstikek balkêş e.

Îro em ê hewl bidin ku hinekî kûr bikolin û li algorîtmaya LSB binerin. Ger bala we dikişîne, hûn di binê pisîkê de bi xêr hatin. (Di bin qutbûnê de seyrûsefer heye: bi qasî megabyte.)

Beriya her tiştî, pêwîst e ku meriv danasînek kurt bike. Her kes dizane ku mebesta krîptografî ew e ku meriv nekaribe agahdariya veşartî bixwîne. Bê guman, krîptografî serîlêdanên wê hene, lê nêzîkatiyek din a parastina daneyê heye. Ne hewce ye ku em agahiyê şîfre bikin, lê îdia dikin ku em ne xwediyê wê ne. Bi rastî ji ber vê yekê steganography hate îcad kirin. Wikipedia ji me re piştrast dike ku "steganografiya (ji Yewnanî στεγανοσ - veşartî û Yewnanî γραφω - ez dinivîsim, bi rastî "nivîsandina veşartî") zanista veguheztina veşartî ya agahdariyê ye bi veşartina rastiya veguhestinê.

Bê guman, tu kes hevgirtina rêbazên krîptografî û steganografî qedexe nake. Wekî din, di pratîkê de ew vê yekê dikin, lê peywira me famkirina bingehîn e. Ger hûn bi baldarî gotara Wikipedia-yê bixwînin, hûn ê fêr bibin ku algorîtmayên steganografiyê yên ku jê re tê gotin hene. konteynir û peyam. Konteynir her agahdarî ye ku dibe alîkar ku peyama meya veşartî veşêre.

Di rewşa me de, konteynir dê di formata BMP de wêneyek be. Pêşî, em li avahiya vê pelê binêrin. Pelê dikare li 4 beşan were dabeş kirin: sernavê pelê, sernavê wêneyê, palet û wêne bixwe. Ji bo mebestên me, em tenê hewce ne ku zanibin di serî de çi hatî nivîsandin.

Du baytên pêşîn ên sernivîsê îmzaya BM ne, paşê mezinahiya pelê bi bîtan bi peyvek ducar tê nivîsandin, 4 baytên din têne veqetandin û divê sifir hebin, û di dawiyê de, peyva ducarî ya din jî ji destpêka peyvê veqetandinê vedihewîne. pelê li baytên rastîn ên wêneyê. Di pelek bmp ya 24-bit de, her pixel bi sê baytên BGR têne kod kirin.

Naha em dizanin ka meriv çawa xwe bigihîne wêneyê, ya ku dimîne ev e ku em fam bikin ka em çawa dikarin agahdariya ku em hewce ne li wir binivîsin. Ji bo vê em ê hewceyê rêbaza LSB bikin. Esasê rêbazê wiha ye: em bitên herî hindik girîng di baytên ku ji kodkirina rengan berpirsiyar in de diguhezînin. Ka em bibêjin ger byta din a peyama meya veşartî 11001011 be, û baytên di wêneyê de...11101100 01001110 01111100 0101100111..., wê hingê kodkirin dê bi vî rengî xuya bike. Em ê baytê peyama veşartî bikin 4 beşên du-bit: 11, 00, 10, 11, û bitsên nîzîkî yên wêneyê bi perçeyên encam re biguhezînin: ...11101111 01001100 01111110 0101100111…. Veguheztinek wusa bi gelemperî ji çavê mirovan re nayê dîtin. Digel vê yekê, gelek amûrên derketinê yên kevin dê nikaribin guheztinên weha piçûk jî nîşan bidin.

Eşkere ye ku hûn dikarin ne tenê 2 bitên herî kêm girîng, lê her hejmarek ji wan biguhezînin. Nimûneya jêrîn heye: em çiqas bêtir bit biguhezînin, ew qas bêtir agahdarî em dikarin veşêrin, û ew ê di wêneya orîjînal de bibe sedema bêtir destwerdanê. Ji bo nimûne, li vir du wêne hene:

LSB steganography
LSB steganography

Tevî hewildanên min ên herî baş, min nekarî ferqa di navbera wan de bibînim, lê dîsa jî, di wêneya duyemîn de, bi karanîna rêbaza diyarkirî, helbesta Lewis Carroll "Nêçîra Snark" veşartî ye. Ger we heya nuha xwendibe, wê hingê hûn belkî eleqedar in ku di derheqê pêkanînê de fêr bibin. Ew pir hêsan e, lê ez ê di cih de we hişyar bikim ku her tişt li Delphi tê kirin. Du sedemên vê hene: 1. Li gorî min Delphî zimanekî baş e; 2. Ev bername di pêvajoya amadekirina qursek li ser bingehên dîtina kompîturê de ji dayik bû, û xortên ku ez vê qursê fêrî wan dikim hîn ji bilî Delphi tiştek din nizanin. Ji bo kesên ku bi hevoksaziyê nizanin, pêdivî ye ku tiştek were ravekirin: shl x bi x veguhestinek ber bi çepê ve, shr x bi x veguhestinek ber bi rastê ve ye.

Em texmîn dikin ku em nivîsa ku di rêzikan de di konteynerê de hatî hilanîn dinivîsin û du baytên jêrîn diguhezînin:
Koda tomarkirinê:

ji bo i:=1 heta dirêj(str) bikin
    dest pê bikin
      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);
 
    dawî;

koda xwendinê:

ji bo ez:=1 MsgSize bikim
    dest pê bikin
      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);
    dawî;

Welê, ji bo yên bi rastî tembel - girêdana bernameyê û koda çavkaniya wê.

Sipî

Source: www.habr.com

Add a comment