Steganografi LSB

Suatu ketika dahulu saya menulis saya jawatan pertama di hub. Dan jawatan itu didedikasikan untuk masalah yang sangat menarik, iaitu steganografi. Sudah tentu, penyelesaian yang dicadangkan dalam topik lama itu tidak boleh dipanggil steganografi dalam erti kata sebenar. Ia hanya permainan dengan format fail, tetapi permainan yang cukup menarik.

Hari ini kita akan cuba menggali lebih mendalam dan melihat algoritma LSB. Jika anda berminat, anda dialu-alukan di bawah kucing. (Di bawah potongan adalah trafik: kira-kira satu megabait.)

Pertama sekali, adalah perlu untuk membuat pengenalan ringkas. Semua orang tahu bahawa tujuan kriptografi adalah untuk menjadikannya mustahil untuk membaca maklumat rahsia. Sudah tentu, kriptografi mempunyai aplikasinya, tetapi terdapat pendekatan lain untuk perlindungan data. Kami tidak perlu menyulitkan maklumat, tetapi berpura-pura bahawa kami tidak memilikinya. Inilah sebab mengapa steganografi dicipta. Wikipedia memberi jaminan kepada kita bahawa "steganografi (dari bahasa Yunani στεγανοσ - tersembunyi dan bahasa Yunani γραφω - saya menulis, secara harfiah "penulisan rahsia") ialah sains penghantaran maklumat tersembunyi dengan merahsiakan fakta penghantaran.

Sudah tentu, tiada siapa yang melarang menggabungkan kaedah kriptografi dan steganografi. Lebih-lebih lagi, dalam amalan mereka melakukan ini, tetapi tugas kita adalah untuk memahami asas-asasnya. Jika anda mengkaji dengan teliti artikel Wikipedia, anda akan mengetahui bahawa algoritma steganografi termasuk apa yang dipanggil. bekas dan mesej. Bekas ialah sebarang maklumat yang membantu menyembunyikan mesej rahsia kami.

Dalam kes kami, bekas itu akan menjadi imej dalam format BMP. Mula-mula, mari kita lihat struktur fail ini. Fail boleh dibahagikan kepada 4 bahagian: pengepala fail, pengepala imej, palet dan imej itu sendiri. Untuk tujuan kita, kita hanya perlu tahu apa yang tertulis dalam header.

Dua bait pertama pengepala ialah tandatangan BM, kemudian saiz fail dalam bait ditulis dalam kata ganda, 4 bait seterusnya dikhaskan dan mesti mengandungi sifar, dan akhirnya, kata ganda lain mengandungi offset dari permulaan fail ke bait sebenar imej. Dalam fail bmp 24-bit, setiap piksel dikodkan dengan tiga bait BGR.

Sekarang kita tahu bagaimana untuk mendapatkan imej, yang tinggal hanyalah memahami bagaimana kita boleh menulis maklumat yang kita perlukan di sana. Untuk ini kita memerlukan kaedah LSB. Intipati kaedah adalah seperti berikut: kami menggantikan bit paling tidak ketara dalam bait yang bertanggungjawab untuk pengekodan warna. Katakan jika bait seterusnya mesej rahsia kami ialah 11001011, dan bait dalam imej ialah...11101100 01001110 01111100 0101100111..., maka pengekodan akan kelihatan seperti ini. Kami akan membahagikan bait mesej rahsia kepada 4 bahagian dua bit: 11, 00, 10, 11, dan menggantikan bit tertib rendah imej dengan serpihan yang terhasil: ...11101111 01001100 01111110 0101100111…. Penggantian sedemikian pada umumnya tidak dapat dilihat oleh mata manusia. Selain itu, banyak peranti keluaran yang lebih lama tidak akan dapat memaparkan perubahan kecil tersebut.

Adalah jelas bahawa anda boleh menukar bukan sahaja 2 bit yang paling tidak ketara, tetapi sebarang bilangan daripadanya. Terdapat corak berikut: lebih banyak bit yang kita ubah, lebih banyak maklumat yang boleh kita sembunyikan, dan lebih banyak gangguan ini akan menyebabkan dalam imej asal. Sebagai contoh, berikut adalah dua imej:

Steganografi LSB
Steganografi LSB

Walaupun usaha terbaik saya, saya tidak dapat melihat perbezaan di antara mereka, tetapi bagaimanapun, dalam imej kedua, menggunakan kaedah yang diterangkan, puisi Lewis Carroll "The Hunting of the Snark" tersembunyi. Jika anda telah membaca sejauh ini, maka anda mungkin berminat untuk mengetahui tentang pelaksanaannya. Ia agak mudah, tetapi saya akan memberi amaran kepada anda dengan segera bahawa segala-galanya dilakukan di Delphi. Terdapat dua sebab untuk ini: 1. Saya rasa Delphi adalah bahasa yang baik; 2. Program ini dilahirkan dalam proses penyediaan kursus mengenai asas penglihatan komputer, dan lelaki yang saya ajar kursus ini belum tahu apa-apa selain Delphi. Bagi mereka yang tidak biasa dengan sintaks, satu perkara perlu dijelaskan: shl x ialah anjakan bit ke kiri dengan x, shr x ialah anjakan bit ke kanan dengan x.

Kami menganggap bahawa kami menulis teks yang disimpan dalam rentetan ke dalam bekas dan menggantikan dua bait yang lebih rendah:
Kod rakaman:

for i:=1 to length(str) do
    memulakan
      l1:=bait(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.Kedudukan:=f.Kedudukan-1;
      tmp:=((tmp shr 2) shl 2)+l1;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Kedudukan:=f.Kedudukan-1;
      tmp:=((tmp shr 2) shl 2)+l2;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Kedudukan:=f.Kedudukan-1;
      tmp:=((tmp shr 2) shl 2)+l3;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Kedudukan:=f.Kedudukan-1;
      tmp:=((tmp shr 2) shl 2)+l4;
      f.WriteBuffer(tmp,1);
 
    akhir;

kod untuk dibaca:

for i:=1 to MsgSize do
    memulakan
      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);
    akhir;

Nah, untuk mereka yang benar-benar malas - pautan ke program dan kod sumbernya.

Terima kasih.

Sumber: www.habr.com

Tambah komen