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

Нэгэн удаа би өөрийнхөө бичсэн hub дээрх анхны нийтлэл. Мөн энэ бичлэгийг стеганографи гэх маш сонирхолтой асуудалд зориулав. Мэдээжийн хэрэг, тэр хуучин сэдвээр санал болгож буй шийдлийг жинхэнэ утгаараа стеганографи гэж нэрлэж болохгүй. Энэ бол зүгээр л файлын форматтай тоглоом боловч нэлээд сонирхолтой тоглоом юм.

Өнөөдөр бид бага зэрэг гүн ухаж, 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. Миний бодлоор Дельфи бол сайн хэл; 2. Энэ программ нь компьютерийн харааны анхан шатны хичээл бэлтгэх явцад төрсөн бөгөөд миний энэ хичээлийг зааж байгаа залуус одоо болтол Delphi-ээс өөр зүйл мэдэхгүй байна. Синтаксийг сайн мэдэхгүй хүмүүст нэг зүйлийг тайлбарлах хэрэгтэй: shl x нь зүүн тийш х, shr x нь х-ээр баруун тийш шилжих хөдөлгөөн юм.

Бид мөрөнд хадгалагдсан текстийг саванд бичиж, доод хоёр байтыг сольж байна гэж бид үзэж байна:
Бичлэгийн код:

for i:=1 to length(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.Албан тушаал:=f.Албан тушаал-1;
      tmp:=((tmp shr 2) shl 2)+l1;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Албан тушаал:=f.Албан тушаал-1;
      tmp:=((tmp shr 2) shl 2)+l2;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Албан тушаал:=f.Албан тушаал-1;
      tmp:=((tmp shr 2) shl 2)+l3;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Албан тушаал:=f.Албан тушаал-1;
      tmp:=((tmp shr 2) shl 2)+l4;
      f.WriteBuffer(tmp,1);
 
    төгсгөл;

унших код:

for i:=1 to 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);
    төгсгөл;

За, үнэхээр залхуу хүмүүсийн хувьд - програм болон түүний эх кодын холбоос.

Баярлалаа.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх