LSB steqanoqrafiyası

Bir vaxtlar özümü yazmışdım hub-da ilk yazı. Və həmin yazı çox maraqlı bir problemə, yəni steqanoqrafiyaya həsr olunmuşdu. Təbii ki, o köhnə mövzuda təklif olunan həll yolu sözün əsl mənasında steqanoqrafiya adlandırmaq olmaz. Bu, sadəcə fayl formatları olan bir oyundur, lakin buna baxmayaraq, olduqca maraqlı bir oyundur.

Bu gün biz bir az daha dərinə getməyə və LSB alqoritminə baxmağa çalışacağıq. Əgər maraqlanırsınızsa, pişik altında xoş gəlmisiniz. (Kəsimin altında trafik var: təxminən bir meqabayt.)

Əvvəlcə qısa bir giriş etmək lazımdır. Hər kəs bilir ki, kriptoqrafiyanın məqsədi məxfi məlumatları oxumağı qeyri-mümkün etməkdir. Əlbəttə ki, kriptoqrafiyanın öz tətbiqləri var, lakin məlumatların qorunmasına başqa yanaşma da var. Məlumatı şifrələmək məcburiyyətində deyilik, amma guya bizdə yoxdur. Steqanoqrafiya məhz buna görə icad edilmişdir. Vikipediya bizi əmin edir ki, “steqanoqrafiya (yunanca στεγανοσ - gizli və yunan γραφω - yazıram, sözün əsl mənasında “gizli yazı”) ötürülmə faktını gizli saxlayaraq məlumatın gizli ötürülməsi elmidir.

Əlbəttə ki, heç kim kriptoqrafik və steqaqrafik metodların birləşməsini qadağan etmir. Üstəlik, praktikada bunu edirlər, amma bizim vəzifəmiz əsasları başa düşməkdir. Vikipediya məqaləsini diqqətlə öyrənsəniz, steqanoqrafiya alqoritmlərinə sözdə olanların daxil olduğunu öyrənəcəksiniz. konteyner və mesaj. Konteyner gizli mesajımızı gizlətməyə kömək edən hər hansı bir məlumatdır.

Bizim vəziyyətimizdə konteyner BMP formatında bir şəkil olacaq. Əvvəlcə bu faylın strukturuna nəzər salaq. Faylı 4 hissəyə bölmək olar: fayl başlığı, şəkil başlığı, palitra və şəklin özü. Məqsədlərimiz üçün yalnız başlıqda nə yazıldığını bilməliyik.

Başlığın ilk iki baytı BM imzasıdır, sonra baytdakı fayl ölçüsü qoşa sözlə yazılır, sonrakı 4 bayt qorunur və sıfırları ehtiva etməlidir və nəhayət, başqa bir qoşa sözdə mətnin əvvəlindən ofset yazılır. faylı şəklin faktiki baytlarına köçürün. 24 bitlik bmp faylında hər piksel üç BGR baytı ilə kodlanır.

İndi biz təsvirə necə çatacağımızı bilirik, geriyə bizə lazım olan məlumatları orada necə yaza biləcəyimizi anlamaq qalır. Bunun üçün LSB metoduna ehtiyacımız olacaq. Metodun mahiyyəti belədir: biz rəng kodlaşdırmasına cavabdeh olan baytlarda ən az əhəmiyyətli bitləri əvəz edirik. Tutaq ki, gizli mesajımızın növbəti baytı 11001011, şəkildəki baytlar isə...11101100 01001110 01111100 0101100111..., onda kodlaşdırma belə görünəcək. Gizli mesaj baytını 4 iki bitlik hissəyə böləcəyik: 11, 00, 10, 11 və təsvirin aşağı dərəcəli bitlərini nəticədə yaranan fraqmentlərlə əvəz edəcəyik: ...11101111 01001100 01111110 0101100111... Belə bir əvəz ümumiyyətlə insan gözü üçün nəzərə çarpmır. Üstəlik, bir çox köhnə çıxış cihazları belə kiçik dəyişiklikləri göstərə bilməyəcək.

Aydındır ki, yalnız 2 ən az əhəmiyyətli biti deyil, onlardan istənilən sayda dəyişə bilərsiniz. Aşağıdakı nümunə var: biz nə qədər çox bit dəyişdirsək, bir o qədər çox məlumat gizlədə bilərik və bu, orijinal görüntüdə bir o qədər çox müdaxiləyə səbəb olar. Məsələn, burada iki şəkil var:

LSB steqanoqrafiyası
LSB steqanoqrafiyası

Bütün səylərimə baxmayaraq, aralarındakı fərqi görə bilmədim, amma buna baxmayaraq, ikinci şəkildə təsvir olunan üsuldan istifadə edərək, Lyuis Kerrollun "Snarkın ovu" şeiri gizlidir. Əgər siz bura qədər oxumusunuzsa, yəqin ki, tətbiqi öyrənməklə maraqlanırsınız. Bu olduqca sadədir, amma dərhal sizə xəbərdar edəcəyəm ki, hər şey Delphi-də edilir. Bunun iki səbəbi var: 1. Məncə Delphi yaxşı dildir; 2. Bu proqram kompüter görmənin əsasları üzrə kursun hazırlanması prosesində yaranıb və bu kursu öyrətdiyim uşaqlar hələ Delphidən başqa heç nə bilmirlər. Sintaksislə tanış olmayanlar üçün bir şeyi izah etmək lazımdır: shl x - bit istiqamətində sola x-ə, shr x - x-ə biti sağa sürüşdürmədir.

Güman edirik ki, sətirdə saxlanılan mətni konteynerə yazırıq və aşağı iki baytı əvəz edirik:
Qeyd kodu:

for i:=1 to length(str) etmək
    başlamaq
      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.Mövqe:=f.Mövqe-1;
      tmp:=((tmp shr 2) shl 2)+l1;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Mövqe:=f.Mövqe-1;
      tmp:=((tmp shr 2) shl 2)+l2;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Mövqe:=f.Mövqe-1;
      tmp:=((tmp shr 2) shl 2)+l3;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Mövqe:=f.Mövqe-1;
      tmp:=((tmp shr 2) shl 2)+l4;
      f.WriteBuffer(tmp,1);
 
    son;

oxumaq üçün kod:

i:=1 üçün MsgSize etmək
    başlamaq
      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);
    son;

Yaxşı, həqiqətən tənbəl olanlar üçün - proqrama və onun mənbə koduna keçid.

Təşəkkür edirik.

Mənbə: www.habr.com

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