LSB steganografiyasi

Bir vaqtlar men o'zimni yozganman hubdagi birinchi post. Va bu post juda qiziqarli muammoga, ya'ni steganografiyaga bag'ishlangan edi. Albatta, eski mavzuda taklif qilingan yechimni so'zning haqiqiy ma'nosida steganografiya deb atash mumkin emas. Bu shunchaki fayl formatlari bo'lgan o'yin, ammo shunga qaramay juda qiziqarli o'yin.

Bugun biz biroz chuqurroq qazishga harakat qilamiz va LSB algoritmini ko'rib chiqamiz. Agar siz qiziqsangiz, mushuk ostida xush kelibsiz. (Kesish ostida trafik bor: taxminan bir megabayt.)

Avvalo, qisqacha muqaddima qilish kerak. Kriptografiyaning maqsadi maxfiy ma'lumotlarni o'qishni imkonsiz qilish ekanligini hamma biladi. Albatta, kriptografiya o'z ilovalariga ega, ammo ma'lumotlarni himoya qilishning boshqa yondashuvi mavjud. Biz ma'lumotni shifrlashimiz shart emas, lekin bizda yo'q deb o'ylaymiz. Aynan shuning uchun steganografiya ixtiro qilingan. Vikipediya bizni ishontiradi: “Steganografiya (yunoncha stéganos – yashirin va yunoncha gaphʼn – yozaman, so‘zma-so‘z “maxfiy yozish”) – ma’lumotni uzatish faktini sir tutgan holda yashirin tarzda uzatish haqidagi fan.

Albatta, hech kim kriptografik va steganografik usullarni birlashtirishni taqiqlamaydi. Bundan tashqari, amalda ular buni qilishadi, ammo bizning vazifamiz asoslarni tushunishdir. Agar siz Vikipediya maqolasini sinchkovlik bilan o'rgansangiz, steganografiya algoritmlari deb ataladigan narsalarni o'z ichiga olishini bilib olasiz. konteyner va xabar. Konteyner - bu bizning maxfiy xabarimizni yashirishga yordam beradigan har qanday ma'lumot.

Bizning holatda, konteyner BMP formatidagi rasm bo'ladi. Birinchidan, ushbu faylning tuzilishini ko'rib chiqaylik. Faylni 4 qismga bo'lish mumkin: fayl sarlavhasi, rasm sarlavhasi, palitra va rasmning o'zi. Bizning maqsadlarimiz uchun biz faqat sarlavhada nima yozilganligini bilishimiz kerak.

Sarlavhaning dastlabki ikki bayti BM imzosi bo'lib, keyin baytlardagi fayl hajmi qo'sh so'z bilan yoziladi, keyingi 4 bayt zaxiralangan va noldan iborat bo'lishi kerak va nihoyat, yana bir qo'sh so'z boshidan ofsetni o'z ichiga oladi. faylni tasvirning haqiqiy baytiga aylantiring. 24 bitli bmp faylida har bir piksel uchta BGR bayt bilan kodlangan.

Endi biz tasvirga qanday borishni bilamiz, qolgan narsa u erda kerakli ma'lumotlarni qanday yozishimiz mumkinligini tushunishdir. Buning uchun bizga LSB usuli kerak bo'ladi. Usulning mohiyati quyidagicha: biz ranglarni kodlash uchun mas'ul baytlardagi eng kam ahamiyatli bitlarni almashtiramiz. Aytaylik, agar maxfiy xabarimizning keyingi bayti 11001011, tasvirdagi baytlar esa...11101100 01001110 01111100 0101100111... bo‘lsa, kodlash shunday bo‘ladi. Biz maxfiy xabar baytini 4 ta ikki bitli qismga ajratamiz: 11, 00, 10, 11 va tasvirning past tartibli bitlarini hosil bo'lgan fragmentlar bilan almashtiramiz: ...11101111 01001100 01111110 0101100111…. Bunday almashtirish, odatda, inson ko'ziga sezilmaydi. Bundan tashqari, ko'pgina eski chiqish qurilmalari bunday kichik o'zgarishlarni ham ko'rsata olmaydi.

Siz nafaqat 2 ta ahamiyatsiz bitni, balki ularning istalgan sonini o'zgartirishingiz mumkinligi aniq. Quyidagi naqsh mavjud: biz qanchalik ko'p bitni o'zgartirsak, shunchalik ko'p ma'lumotni yashira olamiz va bu asl tasvirga shunchalik ko'p shovqin keltiradi. Masalan, bu erda ikkita rasm mavjud:

LSB steganografiyasi
LSB steganografiyasi

Qancha urinishmasin, men ularning orasidagi farqni ko'ra olmadim, lekin shunga qaramay, ikkinchi rasmda tasvirlangan usuldan foydalangan holda Lyuis Kerrollning "Snark ovi" she'ri yashiringan. Agar siz shu paytgacha o'qigan bo'lsangiz, ehtimol siz amalga oshirish haqida bilishga qiziqasiz. Bu juda oddiy, lekin men sizni darhol hamma narsa Delphida amalga oshirilganligi haqida ogohlantiraman. Buning ikkita sababi bor: 1. Menimcha, Delphi yaxshi til; 2. Bu dastur kompyuter ko'rish asoslari bo'yicha kurs tayyorlash jarayonida tug'ilgan va men ushbu kursni o'rgatayotgan yigitlar hali Delphidan boshqa narsani bilishmaydi. Sintaksis bilan tanish bo'lmaganlar uchun bir narsani tushuntirish kerak: shl x - bit bo'yicha chapga x ga siljish, shr x - x ga o'ngga siljish.

Biz satrda saqlangan matnni konteynerga yozamiz va pastki ikki baytni almashtiramiz deb taxmin qilamiz:
Yozuv kodi:

for i:=1 to length(str) do
    boshlang
      l1:=bayt(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);
 
    tugatish;

o'qish uchun kod:

i:=1 uchun MsgSize qilish
    boshlang
      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);
    tugatish;

Haqiqatan ham dangasalar uchun - dastur va uning manba kodiga havola.

Rahmat.

Manba: www.habr.com

a Izoh qo'shish