Back to IF4020 Kriptografi

Implementasi LSB pada Citra dan Audio

Questions/Cues

  • Bagaimana program MATLAB menyimpan panjang pesan di dalam citra?
  • Bagaimana program Python menandai akhir pesan tanpa panjang eksplisit?
  • Operasi bit apa yang dipakai untuk mengganti dan membaca LSB?
  • Bagaimana struktur file WAV memungkinkan LSB pada audio?
  • Mengapa stego-image harus disimpan dalam format lossless?

Reference Points

  • IF4020 Kriptografi — Steganografi Bagian 1 (Slides 60-95)

Alat Steganografi

Slide menunjukkan beberapa alat daring dan aplikasi untuk mencoba LSB: edchart image steganography, planetcalc, StegOnline, incoherency image-steganography, dan Steghide (freeware). Slide juga mengingatkan Stegosploit (2015): kode jahat disembunyikan dalam gambar sehingga “just look at the image and you are hacked” (Steganalisis).

Program MATLAB (Citra RGB)

Rancangan dengan header panjang pesan 30 bit:

Penyisipan (LSB_sisip.m)

  1. Baca citra cover total_byte = tinggi * lebar * 3.
  2. Baca pesan = panjang karakter; nL = dec2bin(L, 30).
  3. Ubah tiap karakter menjadi 8 bit; gabung: [30 bit ] + [bit pesan] bit.
  4. Jika total_byte: citra tak mencukupi.
  5. Untuk tiap pixel (baris, kolom) dan tiap kanal : bitset(coverImage(row,col,i), 1, biner(idx)) (bit ke-1 = LSB).
  6. Simpan sebagai BMP.

Ekstraksi (LSB_ekstrak.m)

  1. Ambil LSB dari 30 byte pertama (10 pixel 3 kanal) rekonstruksi dengan .
  2. Baca bit LSB berurutan.
  3. Buang 30 bit pertama, kelompokkan 8 bit, ubah menjadi karakter (bin2dec, char).

Contoh: pesan “Mari kita jaga negara kesatuan Republik Indonesia tercinta. Oke?” disisipkan ke peppers.bmp output.bmp, lalu diekstraksi kembali utuh.

Program Python (Citra, numpy + PIL)

Perbedaan rancangan: tidak ada header panjang, melainkan delimiter ##### di akhir pesan.

pesan = pesan + "#####"
pesan_biner = ''.join([format(ord(i), "08b") for i in pesan])
# sisip: kosongkan LSB lalu isi dengan bit pesan
larik_pixel[p][q] = (larik_pixel[p][q] & 254) | int(pesan_biner[index])
# ekstrak: ambil LSB
bit_pesan += str(larik_pixel[p][q] & 1)
  • & 254 (11111110) mengosongkan LSB; | bit menuliskan bit pesan.
  • & 1 mengambil LSB.
  • Ekstraksi membaca per 8 bit menjadi karakter sampai ##### ditemukan; bila tidak ada, program melapor “Tidak ada pesan tersembunyi”.
  • Output harus PNG (lossless), bukan JPG.

Catatan: pengecekan kapasitas pada slide membandingkan panjang bit pesan dengan jumlah pixel (total_pixel), padahal kapasitas sebenarnya total_pixel * 3 byte; jadi pengecekannya konservatif.

Steganografi pada Audio WAV

File WAV (PCM tak terkompresi) terdiri atas header (format, channel, sample rate, bits per sample) dan data sampel mentah. Contoh umum: PCM, 2 channel (stereo), 44100 Hz, 16 bit. Program memakai modul wave:

  • baca seluruh frame sebagai bytearray;
  • sisipkan bit pesan (+ delimiter #####) pada LSB tiap byte frame frames[i] = (frames[i] & 254) | bit;
  • tulis file WAV baru dengan parameter header yang sama (setparams(audio.getparams()));
  • ekstraksi: ambil LSB semua byte, kelompokkan 8 bit, hentikan di #####.

Perubahan pada amplitudo sampel 16 bit tidak terdengar, sejalan dengan prinsip LSB pada citra.

flowchart TD
    S["Mulai embedding"] --> A["pesan + delimiter '#####'"]
    A --> B["ubah ke string biner (8 bit/karakter)"]
    B --> C{"bit pesan ≤<br/>kapasitas cover?"}
    C -->|tidak| X["ERROR: cover tidak cukup"]
    C -->|ya| D["untuk tiap byte cover:<br/>(byte AND 254) OR bit"]
    D --> E["simpan stego (PNG/WAV)"]

Latihan dari Slide

  1. Kembangkan program sehingga dapat menyembunyikan file sembarang ke dalam gambar.
  2. Hal yang sama untuk audio.
  3. Buat program hybrid: enkripsi dengan cipher (mis. Vigenère, lihat Vigenère Cipher dan Kriptanalisis Kasiski), lalu sembunyikan cipherteks pada gambar atau audio.

Summary

Implementasi LSB mengubah teks menjadi bit, lalu mengganti LSB tiap byte cover: (byte & 254) | bit untuk menyisipkan dan byte & 1 untuk mengekstraksi. Program MATLAB menyimpan panjang pesan 30 bit sebagai header di awal citra, sedangkan program Python memakai delimiter ##### sebagai penanda akhir. Citra stego harus disimpan lossless (BMP/PNG). Pada audio WAV (PCM) prinsipnya sama: LSB byte-byte frame diganti, header WAV dipertahankan. Cover harus cukup besar untuk bit pesan beserta header/delimiter, dan latihan lanjut adalah menyembunyikan file sembarang atau menggabungkan dengan enkripsi.