Steganografi LSB

Suatu ketika saya menulis milik saya posting pertama di hub. Dan postingan tersebut didedikasikan untuk masalah yang sangat menarik yaitu steganografi. Tentu saja, solusi yang diusulkan dalam topik lama tersebut tidak dapat disebut steganografi dalam arti sebenarnya. Ini hanyalah sebuah game dengan format file, namun tetap merupakan game yang cukup menarik.

Hari ini kita akan mencoba menggali lebih dalam dan melihat algoritma LSB. Jika Anda tertarik, silakan di bawah kucing. (Di bawah potongan adalah lalu lintas: sekitar satu megabyte.)

Pertama-tama, perlu dilakukan perkenalan singkat. Semua orang tahu bahwa tujuan kriptografi adalah untuk membuat informasi rahasia tidak dapat dibaca. Tentu saja, kriptografi mempunyai penerapannya, tetapi ada pendekatan lain untuk perlindungan data. Kita tidak perlu mengenkripsi informasinya, tetapi berpura-pura bahwa kita tidak memilikinya. Inilah sebabnya mengapa steganografi diciptakan. Wikipedia meyakinkan kita bahwa “steganografi (dari bahasa Yunani στεγανοσ - tersembunyi dan bahasa Yunani γραφω - saya menulis, secara harfiah berarti "tulisan rahasia") adalah ilmu tentang transmisi informasi yang tersembunyi dengan menjaga fakta transmisi tetap rahasia.

Tentu saja tidak ada yang melarang menggabungkan metode kriptografi dan steganografi. Apalagi dalam praktiknya mereka melakukan hal ini, tetapi tugas kita adalah memahami dasar-dasarnya. Jika Anda mempelajari artikel Wikipedia dengan cermat, Anda akan menemukan bahwa algoritma steganografi mencakup apa yang disebut. wadah dan pesan. Wadah adalah informasi apa pun yang membantu menyembunyikan pesan rahasia kita.

Dalam kasus kami, wadahnya akan berupa gambar dalam format BMP. Pertama, mari kita lihat struktur file ini. File dapat dibagi menjadi 4 bagian: header file, header gambar, palet, dan gambar itu sendiri. Untuk tujuan kita, kita hanya perlu mengetahui apa yang tertulis di header.

Dua byte pertama dari header adalah tanda tangan BM, kemudian ukuran file dalam byte ditulis dalam kata ganda, 4 byte berikutnya dicadangkan dan harus berisi nol, dan terakhir, kata ganda lainnya berisi offset dari awal file ke byte sebenarnya dari gambar. Dalam file bmp 24-bit, setiap piksel dikodekan dengan tiga byte BGR.

Sekarang kita tahu cara mendapatkan gambar tersebut, yang tersisa hanyalah memahami bagaimana kita dapat menulis informasi yang kita butuhkan di sana. Untuk ini kita memerlukan metode LSB. Inti dari metode ini adalah sebagai berikut: kami mengganti bit paling tidak signifikan dalam byte yang bertanggung jawab untuk pengkodean warna. Katakanlah jika byte berikutnya dari pesan rahasia kita adalah 11001011, dan byte pada gambar adalah...11101100 01001110 01111100 0101100111..., maka pengkodeannya akan terlihat seperti ini. Kami akan membagi byte pesan rahasia menjadi 4 bagian dua-bit: 11, 00, 10, 11, dan mengganti bit-bit gambar tingkat rendah dengan fragmen yang dihasilkan: ...11101111 01001100 01111110 0101100111…. Penggantian seperti itu umumnya tidak terlihat oleh mata manusia. Selain itu, banyak perangkat keluaran lama bahkan tidak dapat menampilkan perubahan kecil seperti itu.

Jelas bahwa Anda tidak hanya dapat mengubah 2 bit paling tidak signifikan, tetapi sejumlah bit tersebut. Ada pola berikut: semakin banyak bit yang kita ubah, semakin banyak informasi yang dapat kita sembunyikan, dan semakin banyak interferensi yang ditimbulkan pada gambar aslinya. Misalnya, berikut dua gambar:

Steganografi LSB
Steganografi LSB

Terlepas dari upaya terbaik saya, saya tidak dapat melihat perbedaan di antara keduanya, namun demikian, pada gambar kedua, dengan menggunakan metode yang dijelaskan, puisi Lewis Carroll "The Hunting of the Snark" disembunyikan. Jika Anda sudah membaca sejauh ini, Anda mungkin tertarik mempelajari implementasinya. Ini cukup sederhana, tetapi saya akan segera memperingatkan Anda bahwa semuanya dilakukan di Delphi. Ada dua alasan untuk hal ini: 1. Menurut saya Delphi adalah bahasa yang baik; 2. Program ini lahir dalam proses persiapan kursus dasar-dasar visi komputer, dan orang-orang yang saya ajar kursus ini belum mengetahui apa pun selain Delphi. Bagi yang belum familiar dengan sintaksnya, ada satu hal yang perlu dijelaskan: shl x adalah pergeseran bitwise ke kiri sebesar x, shr x adalah pergeseran bitwise ke kanan sebesar x.

Kami berasumsi bahwa kami sedang menulis teks yang disimpan dalam string ke dalam wadah dan mengganti dua byte terbawah:
Kode rekaman:

untuk i:=1 hingga panjang(str) lakukan
    mulai
      l1:=byte(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.Posisi:=f.Posisi-1;
      tmp:=((tmp shr 2) shl 2)+l1;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Posisi:=f.Posisi-1;
      tmp:=((tmp shr 2) shl 2)+l2;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Posisi:=f.Posisi-1;
      tmp:=((tmp shr 2) shl 2)+l3;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Posisi:=f.Posisi-1;
      tmp:=((tmp shr 2) shl 2)+l4;
      f.WriteBuffer(tmp,1);
 
    akhir;

kode untuk dibaca:

untuk i:=1 hingga MsgSize lakukan
    mulai
      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+arang(l1+l2+l3+l4);
    akhir;

Nah, bagi mereka yang sangat malas - tautan ke program dan kode sumbernya.

Terima kasih.

Sumber: www.habr.com

Tambah komentar