LSB стеганографиясы

Бир жолу мен өзүмдү жазгам хабдагы биринчи билдирүү. Жана ал пост абдан кызыктуу маселеге, тактап айтканда стеганографияга арналган. Албетте, ошол эски темада сунуш кылынган чечимди сөздүн чыныгы маанисинде стеганография деп атоого болбойт. Бул жөн гана файл форматтары бар оюн, бирок ошентсе да абдан кызыктуу оюн.

Бүгүн биз бир аз тереңирээк казып, LSB алгоритмин карап көрүүгө аракет кылабыз. Эгер сизди кызыктырсаңыз, мышыктын астына кош келиңиз. (Кескинин астында трафик: болжол менен мегабайт.)

Биринчиден, кыскача киришүү жасоо зарыл. Криптографиянын максаты жашыруун маалыматты окууга мүмкүн эмес кылуу экенин баары билет. Албетте, криптографиянын өзүнүн тиркемелери бар, бирок маалыматтарды коргоонун дагы бир ыкмасы бар. Биз маалыматты шифрлешибиз керек эмес, бирок бизде жок деп түр көрсөтүүбүз керек. Дал ушул себептен стеганография ойлоп табылган. Википедия бизди “стеганография (грек тилинен στεγανοσ – жашыруун жана грекче γραφω – жазам, түз маанисинде “жашыруун жазуу”) – бул берүү фактысын жашыруун сактоо менен маалыматты жашыруун өткөрүү жөнүндөгү илим деп ишендирди.

Албетте, криптографиялык жана стеганографиялык ыкмаларды айкалыштырууга эч ким тыюу салбайт. Анын үстүнө, иш жүзүндө алар муну кылышат, бирок биздин милдетибиз - негиздерин түшүнүү. Эгерде сиз Википедиядагы макаланы кылдат изилдеп чыксаңыз, анда стеганография алгоритмдеринде аталган алгоритмдер бар экенин билесиз. контейнер жана билдирүү. Контейнер биздин жашыруун кабарыбызды жашырууга жардам берген ар кандай маалымат.

Биздин учурда, контейнер BMP форматындагы сүрөт болот. Биринчиден, бул файлдын структурасын карап көрөлү. Файлды 4 бөлүккө бөлүүгө болот: файлдын аталышы, сүрөттүн аталышы, палитра жана сүрөттүн өзү. Биздин максаттар үчүн, биз бир гана темада эмне жазылганын билишибиз керек.

Баштын биринчи эки байты BM кол тамгасы, андан кийин байттагы файлдын өлчөмү кош сөз менен жазылат, кийинки 4 байт сакталган жана нөлдөрдү камтышы керек, жана акырында, дагы бир кош сөздүн башындагы офсетти камтыйт. сүрөттүн чыныгы байттарына файл. 24 биттик bmp файлында ар бир пиксел үч BGR байт менен коддолгон.

Эми биз сүрөткө кантип жетүүнү билебиз, калганы бизге керектүү маалыматты кантип жазууга болорун түшүнүү. Бул үчүн бизге LSB ыкмасы керек болот. Методдун маңызы төмөнкүдөй: биз түстөрдү коддоо үчүн жооптуу байттарда эң аз маанилүү биттерди алмаштырабыз. Айталы, эгер биздин жашыруун билдирүүбүздүн кийинки байты 11001011 болсо, ал эми сүрөттөгү байттар...11101100 01001110 01111100 0101100111... болсо, коддоо ушундай болот. Жашыруун билдирүү байтын 4 эки биттик бөлүккө бөлөбүз: 11, 00, 10, 11 жана сүрөттөлүштүн төмөнкү тартиптеги биттерин пайда болгон фрагменттерге алмаштырабыз: ...11101111 01001100 01111110 0101100111... Мындай алмаштыруу жалпысынан адамдын көзүнө байкалбайт. Мындан тышкары, көптөгөн эски чыгаруу түзмөктөрү мындай майда өзгөрүүлөрдү көрсөтө албайт.

Сиз 2 эң аз маанилүү битти гана эмес, алардын каалаган санын өзгөртө аласыз. Төмөнкү схема бар: биз канчалык көп бит өзгөртсөк, ошончолук көп маалыматты жашыра алабыз жана бул баштапкы сүрөттөлүшкө ошончолук көп кийлигишүүгө алып келет. Мисалы, бул жерде эки сүрөт бар:

LSB стеганографиясы
LSB стеганографиясы

Канча аракет кылсам да, алардын ортосундагы айырманы көрө алган жокмун, бирок ошого карабастан, экинчи сүрөттө сүрөттөлгөн ыкманы колдонуу менен Льюис Кэрроллдун "Снарктын аңчылыгы" поэмасы катылган. Эгер сиз буга чейин окуган болсоңуз, анда сиз ишке ашыруу жөнүндө билүүгө кызыкдар болушуңуз мүмкүн. Бул абдан жөнөкөй, бирок мен сизге дароо эскертем, баары Delphiде жасалат. Мунун эки себеби бар: 1. Менимче, Delphi жакшы тил; 2. Бул программа компьютердик көрүүнүн негиздери боюнча курс даярдоо процессинде пайда болгон жана мен бул курсту окутуп жаткан балдар азырынча Delphiден башканы билишпейт. Синтаксис менен тааныш болбогондор үчүн бир нерсени түшүндүрүп берүү керек: shl x - бит боюнча солго х, shr x - бит боюнча оңго х.

Биз сапта сакталган текстти контейнерге жазып, төмөнкү эки байтты алмаштырып жатабыз деп ойлойбуз:
Жаздыруу коду:

for i:=1 to length(str) до
    баштоо
      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);
 
    жок;

окуу үчүн код:

i:=1 үчүн MsgSize үчүн
    баштоо
      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);
    жок;

Ооба, чындап эле жалкоолор үчүн - программага жана анын баштапкы кодуна шилтеме.

рахмат.

Source: www.habr.com

Комментарий кошуу