LSB ստեգանոգրաֆիա

Ժամանակին ես գրել եմ իմ առաջին գրառումը hub-ում. Եվ այդ գրառումը նվիրված էր մի շատ հետաքրքիր խնդրի՝ ստեգանոգրաֆիայի։ Իհարկե, այդ հին թեմայում առաջարկվող լուծումը բառիս բուն իմաստով ստեգանոգրաֆիա անվանել չի կարելի։ Սա պարզապես ֆայլի ձևաչափերով խաղ է, բայց, այնուամենայնիվ, բավականին հետաքրքիր խաղ է:

Այսօր մենք կփորձենք մի փոքր ավելի խորանալ և նայել LSB ալգորիթմին: Եթե ​​դուք հետաքրքրված եք, դուք ողջունում եք կատվի տակ: (Կտրվածքի տակ տրաֆիկ է. մոտ մեկ մեգաբայթ):

Նախ անհրաժեշտ է կարճ ներածություն անել. Բոլորը գիտեն, որ գաղտնագրության նպատակը գաղտնի տեղեկատվության ընթերցումն անհնարին դարձնելն է։ Իհարկե, կրիպտոգրաֆիան ունի իր կիրառությունները, սակայն տվյալների պաշտպանության այլ մոտեցում կա։ Մենք չպետք է գաղտնագրենք տեղեկատվությունը, այլ ձևացնենք, որ այն չունենք: Հենց դրա համար էլ հորինվել է ստեգանոգրաֆիան։ Վիքիպեդիան մեզ վստահեցնում է, որ «ստեգանոգրաֆիան (հունարենից στεγανοσ - թաքնված և հունարեն γραφω - գրում եմ, բառացիորեն «գաղտնի գրել») գիտություն է տեղեկատվության թաքնված փոխանցման մասին՝ գաղտնի պահելով փոխանցման բուն փաստը։

Իհարկե, ոչ ոք չի արգելում համատեղել կրիպտոգրաֆիկ և ստեգանոգրաֆիկ մեթոդները։ Ընդ որում, գործնականում դա անում են, բայց մեր խնդիրն է հիմնականը հասկանալը։ Եթե ​​ուշադիր ուսումնասիրեք Վիքիպեդիայի հոդվածը, ապա կպարզեք, որ ստեգանոգրաֆիայի ալգորիթմները ներառում են այսպես կոչված. կոնտեյներ և հաղորդագրություն: Կոնտեյներ ցանկացած տեղեկատվություն է, որն օգնում է թաքցնել մեր գաղտնի հաղորդագրությունը:

Մեր դեպքում, բեռնարկղը կլինի պատկեր BMP ձևաչափով: Նախ, եկեք նայենք այս ֆայլի կառուցվածքին: Ֆայլը կարելի է բաժանել 4 մասի՝ ֆայլի վերնագիր, պատկերի վերնագիր, ներկապնակ և հենց պատկերը։ Մեր նպատակների համար մենք միայն պետք է իմանանք, թե ինչ է գրված վերնագրում։

Վերնագրի առաջին երկու բայթերը BM ստորագրությունն են, այնուհետև ֆայլի չափը բայթերով գրվում է կրկնակի բառով, հաջորդ 4 բայթերը պահվում են և պետք է պարունակեն զրոներ, և վերջապես, մեկ այլ կրկնակի բառ պարունակում է օֆսեթը սկզբից: ֆայլը պատկերի իրական բայթերին: 24-բիթանոց bmp ֆայլում յուրաքանչյուր պիքսել կոդավորված է երեք BGR բայթով:

Այժմ մենք գիտենք, թե ինչպես հասնել պատկերին, մնում է միայն հասկանալ, թե ինչպես կարող ենք այնտեղ գրել մեզ անհրաժեշտ տեղեկատվությունը: Դրա համար մեզ անհրաժեշտ կլինի LSB մեթոդը: Մեթոդի էությունը հետևյալն է. մենք փոխարինում ենք ամենաքիչ կարևոր բիթերը գունային կոդավորման համար պատասխանատու բայթերում։ Ենթադրենք, եթե մեր գաղտնի հաղորդագրության հաջորդ բայթը լինի 11001011, իսկ պատկերի բայթերը՝...11101100 01001110 01111100 0101100111..., ապա կոդավորումը կունենա այսպիսի տեսք. Գաղտնի հաղորդագրության բայթը կբաժանենք 4 երկբիթանոց մասերի՝ 11, 00, 10, 11, և պատկերի ցածր կարգի բիթերը կփոխարինենք ստացված հատվածներով՝ ...111011:11 01001100 01111110 0101100111…. Նման փոխարինումը, ընդհանուր առմամբ, նկատելի չէ մարդու աչքի համար: Ավելին, շատ ավելի հին ելքային սարքեր նույնիսկ չեն կարողանա ցուցադրել նման աննշան փոփոխություններ:

Հասկանալի է, որ դուք կարող եք փոխել ոչ միայն 2 ամենաքիչ նշանակալից բիթերը, այլ դրանց ցանկացած թիվը: Գոյություն ունի հետևյալ օրինաչափությունը. որքան շատ բիթ փոխենք, այնքան ավելի շատ տեղեկատվություն կարող ենք թաքցնել, և այնքան ավելի շատ միջամտություն կառաջացնի սկզբնական պատկերում: Օրինակ, ահա երկու պատկեր.

LSB ստեգանոգրաֆիա
LSB ստեգանոգրաֆիա

Չնայած իմ լավագույն ջանքերին, ես չկարողացա տեսնել նրանց միջև տարբերությունը, բայց, այնուամենայնիվ, երկրորդ պատկերում, նկարագրված մեթոդով, թաքնված է Լյուիս Քերոլի «Snark-ի որսը» բանաստեղծությունը: Եթե ​​դուք կարդացել եք այսքանը, ապա հավանաբար ձեզ հետաքրքրում է իրականացման մասին իմանալը: Դա բավականին պարզ է, բայց ես ձեզ անմիջապես կզգուշացնեմ, որ ամեն ինչ արված է Դելֆիում: Դրա համար երկու պատճառ կա. 1. Կարծում եմ, Delphi-ն լավ լեզու է. 2. Այս ծրագիրը ծնվել է համակարգչային տեսողության հիմունքների դասընթաց պատրաստելու գործընթացում, իսկ տղաները, ում ես դասավանդում եմ այս դասընթացը, Դելֆիից բացի դեռ ոչինչ չգիտեն։ Նրանց համար, ովքեր ծանոթ չեն շարահյուսությանը, պետք է բացատրել մի բան. shl x-ը x-ով դեպի ձախ մի փոքր տեղաշարժ է, shr x-ը x-ով դեպի աջ:

Մենք ենթադրում ենք, որ մենք գրում ենք տողի մեջ պահված տեքստը կոնտեյների մեջ և փոխարինում ենք ստորին երկու բայթերը.
Ձայնագրման կոդը.

i:=1-ից մինչև երկարություն(str) անել
    սկսել
      l1:=բայթ(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

Добавить комментарий