Kamis, 26 Maret 2009

Steganography (2): The Secret Revealed

Now, for the secret behind the little girl's smile. :-)


Gambar gadis kecil tersenyum pada posting sebelumnya, seperti bisa ditebak dari judul posting-nya, menyimpan rahasia yang ditanam dengan metode steganografi. Skema penyimpanan yang saya lakukan sangat sederhana dan klasik, yaitu dengan mengubah nilai bit tertentu dari setiap byte pada gambar asal. Posisi bit dipilih sedemikian rupa sehingga perubahan nilainya tidak berpengaruh banyak pada citra sebagaimana dipersepsikan oleh orang yang melihatnya. Cara paling sederhana tentunya dengan memodifikasi nilai bit terakhir (LSB - least significant byte).

Operasi pada citra saya lakukan dengan script Python, dengan menggunakan library PIL (Python Imaging Library). PIL dapat diunduh dari http://www.pythonware.com/products/pil/
Baik gambar maupun format merupakan citra berekstensi .png. Setiap titik pada gambar diwakili oleh sebuah tripel (semacam array dengan karakteristik tertentu, masing-masing tripel memiliki tiga nilai) yang terdiri dari tiga nilai byte. Dalam hal ini, saya memilih untuk memodifikasi LSB dari byte yang berada di tengah. Pesan yang ditanam berupa citra dengan muatan teks berwarna hitam dengan latar belakang putih. Penyandian dilakukan dengan mewakili setiap titik berwarna hitam dengan nilai bit '0' dan setiap titik berwarna putih dengan nilai bit '1'.

Citra asli dari gadis kecil tersenyum adalah sebagai berikut:
(Citra adalah karya dari thejbird - http://www.flickr.com/photos/jbird/37395571)





Saya menggunakan script Python sebagai berikut untuk memasukkan pesan ke dalam citra awal:

import PIL
import Image

img = Image.open("innocent_thejbird.png")
img_pix = img.load()

msg = Image.open("kebon_bibit.png")
msg_pix = msg.load()

for i in range(img.size[0]):
for j in range(img.size[1]):
secret = 0 if (((msg_pix[i, j][0]+msg_pix[i, j][1]+msg_pix[i, j][2])/3) < 10) else 1
red    = img_pix[i, j][0]
green  = (img_pix[i, j][1] & 254) if (secret == 0) else (img_pix[i, j][1] | 1)
blue   = img_pix[i, j][2]
img.putpixel((i, j), (red, green, blue))
img.save("super_secret.png")


Hasil dari operasi di atas, sebagaimana ditampilkan pada posting sebelumnya (Steganography (1)), adalah sebagai berikut:





(No, really, this is not the same picture as the one above. :-) )


Untuk mengekstrak kembali pesan dari citra gadis kecil yang telah termodifikasi, saya menggunakan script sebagai berikut (dalam hal ini dijalankan melalui konsol interaktif Python):


>>> steg = Image.open("super_secret.png")
>>> steg_pix = steg.load()
>>> for i in range(steg.size[0]):
for j in range(steg.size[1]):
reveal = 255 * (steg_pix[i, j][1] & 1)
steg.putpixel((i, j), (reveal, reveal, reveal))

>>> steg.save("secret_revealed.png")


Dan hasilnya adalah....




Karena ini merupakan tugas kuliah (II5166 Keamanan Informasi Lanjut, diajarkan oleh Pak Budi Rahardjo), ya, pesan di atas tidak memiliki arti lain, hanya 'KEBON BIBIT' saja. The secret that the little girl hides *indeed* is as innocent as her smile. :-)

Citra asli dari pesan yang ditanam adalah sebagai berikut:





Sebagai catatan, skema steganografi dengan modifikasi LSB ini sangat rentan terhadap kompresi. Awalnya saya menyimpan citra hasil pengolahan dalam format .jpg, namun ternyata
ekstraksi pesan terhadap citra yang mengandung pesan gagal dilakukan; ekstraksi tidak menghasilkan pola 'KEBON BIBIT', melainkan hanya pola acak (seperti semut-semut di televisi yang sudah habis siarannya :-D). Ini menunjukkan bahwa penyimpanan citra mengalami suatu proses (kemungkinan kompresi), yang mengubah nilai-nilai LSB yang sudah dimodifikasi (I spent a good half-day trying to figure out what was wrong!). Kemudian saya mencoba menggunakan format .png, suatu format yang bersifat lossless, dan pesan berhasil disimpan diekstrak dengan memuaskan. :-)

As a closing note, thanks is due to Ian Malpass. This assignment was inspired by his work:


Ian wrote his code in Perl, which I adapted to Python.

Tidak ada komentar:

Posting Komentar