LSB steganogrāfija

Reiz es rakstÄ«ju savu pirmais ieraksts centrā. Un Å”is ieraksts bija veltÄ«ts ļoti interesantai problēmai, proti, steganogrāfijai. Protams, tajā vecajā tēmā piedāvāto risinājumu nevar saukt par steganogrāfiju Ŕī vārda tieÅ”ajā nozÄ«mē. Tā ir tikai spēle ar failu formātiem, taču diezgan interesanta spēle.

Š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:

LSB steganogrāfija
LSB steganogrāfija

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 - saite uz programmu un tās avota kodu.

Paldies.

Avots: www.habr.com

Pievieno komentāru