LSB steganografia

Wakati fulani niliandika yangu chapisho la kwanza kwenye kitovu. Na chapisho hilo lilijitolea kwa shida ya kupendeza sana, ambayo ni steganografia. Bila shaka, suluhisho lililopendekezwa katika mada hiyo ya zamani haliwezi kuitwa steganografia kwa maana ya kweli ya neno hilo. Ni mchezo tu wenye umbizo la faili, lakini mchezo mzuri wa kuvutia hata hivyo.

Leo tutajaribu kuchimba kidogo zaidi na kuangalia algorithm ya LSB. Ikiwa una nia, unakaribishwa chini ya paka. (Chini ya kata ni trafiki: kuhusu megabyte.)

Kwanza kabisa, ni muhimu kufanya utangulizi mfupi. Kila mtu anajua kwamba madhumuni ya cryptography ni kufanya kuwa vigumu kusoma habari siri. Kwa kweli, cryptography ina matumizi yake, lakini kuna njia nyingine ya ulinzi wa data. Si lazima tusimbe habari kwa njia fiche, lakini tujifanye kuwa hatuna. Hii ndiyo sababu hasa steganografia ilivumbuliwa. Wikipedia inatuhakikishia kwamba "steganografia (kutoka kwa Kigiriki στΡγανοσ - iliyofichwa na Kigiriki γραφω - ninaandika, kihalisi "maandishi ya siri") ni sayansi ya uwasilishaji uliofichwa wa habari kwa kuweka ukweli wa uwasilishaji siri.

Bila shaka, hakuna mtu anayekataza kuchanganya mbinu za cryptographic na steganographic. Aidha, katika mazoezi wanafanya hivyo, lakini kazi yetu ni kuelewa mambo ya msingi. Ikiwa utasoma kwa uangalifu nakala ya Wikipedia, utagundua kuwa algorithms ya steganografia ni pamoja na ile inayojulikana. chombo na ujumbe. Chombo ni taarifa yoyote ambayo husaidia kuficha ujumbe wetu wa siri.

Kwa upande wetu, chombo kitakuwa picha katika muundo wa BMP. Kwanza, hebu tuangalie muundo wa faili hii. Faili inaweza kugawanywa katika sehemu 4: kichwa cha faili, kichwa cha picha, palette na picha yenyewe. Kwa madhumuni yetu, tunahitaji tu kujua kile kilichoandikwa kwenye kichwa.

Biti mbili za kwanza za kichwa ni saini ya BM, kisha saizi ya faili katika ka imeandikwa kwa neno mara mbili, ka 4 zifuatazo zimehifadhiwa na lazima ziwe na zero, na mwishowe, neno lingine mara mbili lina kukabiliana tangu mwanzo wa faili kwa baiti halisi za picha. Katika faili ya 24-bit bmp, kila pikseli imesimbwa kwa baiti tatu za BGR.

Sasa tunajua jinsi ya kufikia picha, kilichobaki ni kuelewa jinsi tunaweza kuandika habari tunayohitaji huko. Kwa hili tutahitaji njia ya LSB. Kiini cha njia ni kama ifuatavyo: tunabadilisha bits muhimu zaidi katika byte zinazohusika na usimbaji wa rangi. Hebu tuseme ikiwa byte inayofuata ya ujumbe wetu wa siri ni 11001011, na byte kwenye picha ni ...11101100 01001110 01111100 0101100111 ..., basi encoding itaonekana kama hii. Tutagawanya ujumbe wa siri katika sehemu 4 za biti-mbili: 11, 00, 10, 11, na kuchukua nafasi ya vipande vya mpangilio wa chini vya picha na vipande vinavyotokana: ...11101111 01001100 01111110 0101100111…. Uingizwaji kama huo kwa ujumla hauonekani kwa jicho la mwanadamu. Zaidi ya hayo, vifaa vingi vya zamani vya kutoa havitaweza hata kuonyesha mabadiliko madogo kama haya.

Ni wazi kuwa unaweza kubadilisha sio tu sehemu 2 muhimu, lakini idadi yoyote yao. Kuna muundo ufuatao: kadiri biti zaidi tunavyobadilisha, habari zaidi tunaweza kuficha, na mwingiliano zaidi ambao hii itasababisha kwenye picha asili. Kwa mfano, hapa kuna picha mbili:

LSB steganografia
LSB steganografia

Licha ya jitihada zangu nzuri, sikuweza kuona tofauti kati yao, lakini hata hivyo, katika picha ya pili, kwa kutumia njia iliyoelezwa, shairi la Lewis Carroll "Uwindaji wa Snark" limefichwa. Ikiwa umesoma hadi sasa, basi labda una nia ya kujifunza kuhusu utekelezaji. Ni rahisi sana, lakini nitakuonya mara moja kwamba kila kitu kinafanywa huko Delphi. Kuna sababu mbili za hii: 1. Nadhani Delphi ni lugha nzuri; 2. Mpango huu ulizaliwa katika mchakato wa kuandaa kozi juu ya misingi ya maono ya kompyuta, na wavulana ambao ninawafundisha kozi hii bado hawajui chochote isipokuwa Delphi. Kwa wale ambao hawajui sintaksia, jambo moja linahitaji kuelezewa: shl x ni mabadiliko ya kidogo kuelekea kushoto kwa x, shr x ni mabadiliko ya kidogo kwenda kulia kwa x.

Tunadhania kuwa tunaandika maandishi yaliyohifadhiwa kwenye kamba kwenye chombo na kuchukua nafasi ya baiti mbili za chini:
Msimbo wa kurekodi:

kwa i:=1 kwa urefu(str) kufanya
    kuanza
      l1:=baiti(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.Nafasi:=f.Nafasi-1;
      tmp:=((tmp shr 2) shl 2)+l1;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Nafasi:=f.Nafasi-1;
      tmp:=((tmp shr 2) shl 2)+l2;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Nafasi:=f.Nafasi-1;
      tmp:=((tmp shr 2) shl 2)+l3;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Nafasi:=f.Nafasi-1;
      tmp:=((tmp shr 2) shl 2)+l4;
      f.WriteBuffer(tmp,1);
 
    mwisho;

kanuni ya kusoma:

kwa i:=1 kwa MsgSize kufanya
    kuanza
      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);
    mwisho;

Kweli, kwa wavivu kweli - kiunga cha programu na nambari yake ya chanzo.

Asante.

Chanzo: mapenzi.com

Kuongeza maoni