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

Iegādājieties uzticamu mitināšanu vietnēm ar DDoS aizsardzību, VPS VDS serveriem 🔥 Iegādājieties uzticamu tīmekļa vietņu mitināšanu ar DDoS aizsardzību, VPS VDS serveriem | ProHoster