Reiz es rakstīju savu
Å odien mÄs mÄÄ£inÄsim iedziļinÄties nedaudz dziļÄk un apskatÄ«t LSB algoritmu. Ja ir interese, laipni aicinÄti zem kaÄ·a. (Zem izgriezuma ir satiksme: apmÄram megabaits.)
PirmkÄrt, ir nepiecieÅ”ams veikt Ä«su ievadu. Ikviens zina, ka kriptogrÄfijas mÄrÄ·is ir padarÄ«t neiespÄjamu slepenas informÄcijas nolasÄ«Å”anu. Protams, kriptogrÄfijai ir savi pielietojumi, taÄu ir arÄ« cita pieeja datu aizsardzÄ«bai. Mums nav jÄÅ”ifrÄ informÄcija, bet jÄizliekas, ka mums tÄs nav. TieÅ”i tÄpÄc tika izgudrota steganogrÄfija. Wikipedia mums apliecina, ka āsteganogrÄfija (no grieÄ·u ĻĻĪµĪ³Ī±Ī½ĪæĻ ā slÄpta un grieÄ·u Ī³ĻĪ±ĻĻ ā es rakstu, burtiski āslepenÄ rakstÄ«Å”anaā) ir zinÄtne par slÄptu informÄcijas pÄrraidi, paturot noslÄpumÄ paÅ”u pÄrraides faktu.
Protams, neviens neaizliedz apvienot kriptogrÄfijas un steganogrÄfiskÄs metodes. TurklÄt praksÄ viÅi to dara, bet mÅ«su uzdevums ir saprast pamatus. Ja rÅ«pÄ«gi izpÄtÄ«sit VikipÄdijas rakstu, uzzinÄsiet, ka steganogrÄfijas algoritmi ietver t.s. konteiners un ziÅojums. Konteiners ir jebkura informÄcija, kas palÄ«dz slÄpt mÅ«su slepeno ziÅojumu.
MÅ«su gadÄ«jumÄ konteiners bÅ«s attÄls BMP formÄtÄ. Vispirms apskatÄ«sim Ŕī faila struktÅ«ru. Failu var iedalÄ«t 4 daļÄs: faila galvene, attÄla galvene, palete un pats attÄls. MÅ«su vajadzÄ«bÄm mums ir jÄzina tikai tas, kas ir rakstÄ«ts galvenÄ.
Galvenes pirmie divi baiti ir BM paraksts, pÄc tam faila lielums baitos tiek ierakstÄ«ts dubultvÄrdÄ, nÄkamie 4 baiti ir rezervÄti, un tiem jÄbÅ«t nullÄm, un visbeidzot, vÄl viens dubultvÄrds satur nobÄ«di no faila sÄkuma. failu lÄ«dz faktiskajiem attÄla baitiem. 24 bitu bmp failÄ katrs pikselis ir kodÄts ar trim BGR baitiem.
Tagad mÄs zinÄm, kÄ tikt pie attÄla, atliek saprast, kÄ mÄs varam tur ierakstÄ«t nepiecieÅ”amo informÄciju. Å im nolÅ«kam mums bÅ«s nepiecieÅ”ama LSB metode. Metodes bÅ«tÄ«ba ir Å”Äda: mÄs aizstÄjam vismazÄk nozÄ«mÄ«gus bitus baitos, kas ir atbildÄ«gi par krÄsu kodÄÅ”anu. PieÅemsim, ja mÅ«su slepenÄ ziÅojuma nÄkamais baits ir 11001011 un attÄlÄ redzamie baiti ir...11101100 01001110 01111100 0101100111..., tad kodÄjums izskatÄ«sies Å”Ädi. MÄs sadalÄ«sim slepenÄ ziÅojuma baitu 4 divu bitu daļÄs: 11, 00, 10, 11 un aizstÄsim attÄla zemÄs kÄrtas bitus ar iegÅ«tajiem fragmentiem: ...11101111 01001100 01111110 0101100111ā¦ Å Äda nomaiÅa parasti nav pamanÄma cilvÄka acij. TurklÄt daudzas vecÄkas izvadierÄ«ces pat nespÄs parÄdÄ«t Å”Ädas nelielas izmaiÅas.
Ir skaidrs, ka jÅ«s varat mainÄ«t ne tikai 2 mazÄk nozÄ«mÄ«gos bitus, bet jebkuru skaitu no tiem. PastÄv Å”Äda shÄma: jo vairÄk bitu mÄs mainÄm, jo āāvairÄk informÄcijas varam paslÄpt, un jo vairÄk tas radÄ«s traucÄjumus sÄkotnÄjÄ attÄlÄ. PiemÄram, Å”eit ir divi attÄli:
Neskatoties uz maniem pÅ«liÅiem, es nespÄju saskatÄ«t atŔķirÄ«bu starp tÄm, bet tomÄr otrajÄ attÄlÄ, izmantojot aprakstÄ«to metodi, ir paslÄpts LÅ«isa Kerola dzejolis āSnarka medÄ«basā. Ja esat izlasÄ«jis tik tÄlu, tad, iespÄjams, vÄlaties uzzinÄt par ievieÅ”anu. Tas ir diezgan vienkÄrÅ”i, bet es jÅ«s uzreiz brÄ«dinÄÅ”u, ka viss tiek darÄ«ts Delfos. Tam ir divi iemesli: 1. ManuprÄt, Delphi ir laba valoda; 2. Å Ä« programma ir dzimusi datora redzes pamatu kursa sagatavoÅ”anas procesÄ, un puiÅ”i, kuriem es pasniedzu Å”o kursu, vÄl neko citu kÄ Delfus nezina. Tiem, kas nav pazÄ«stami ar sintaksi, ir jÄpaskaidro viena lieta: shl x ir bitu novirze pa kreisi ar x, shr x ir bitu novirze pa labi ar x.
MÄs pieÅemam, ka mÄs ierakstÄm tekstu, kas saglabÄts virknÄ konteinerÄ, un aizstÄjam divus apakÅ”Äjos baitus:
Ieraksta kods:
i:=1 līdz garums(str) darīt
sÄkt
l1:=baits(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);
beigÄs;
kods lasīŔanai:
i:=1 līdz MsgSize darīt
sÄkt
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);
beigÄs;
Nu, tieÅ”Äm slinkajiem -
Paldies.
Avots: www.habr.com