Menyembunyikan Data Dalam Gambar

May 22, 2007

FROM : http://daunsalam.net/

Ada banyak cara untuk menyembunyikan data. Misalnya dengan menyandikan dengan kode tertentu. Atau menggunakan teori kriptografi, atau berbagai cara lainnya. Salah satu cara, adalah dengan menyembunyikan data dalam sebuah file gambar. Ketika dilihat dengan cara biasa, file gambar ini akan menampilkan gambar seperti apa adanya. Namun bila diambil data yang disembunyikan dalam file ini, maka kita dapatkan data tertentu yang ada dalam file tersebut. Untuk informasi selanjutnya, bisa dicari di internet dengan memakai kata kunci steganography.

Dalam artikel ini, akan diuraikan salah satu cara untuk menyembunyikan data dalam file gambar. Kemudian ditampilkan sebuah contoh kode program dengan Php yang bisa menyembunyikan data dalam file gambar PNG. Dan sebuah file gambar PNG yang telah berisi data yang disembunyikan di dalamnya.

Cara yang digunakan untuk menyembunyikan data dalam file gambar adalah sebagai berikut :

  • Data disembunyikan dalam tiap piksel gambar
  • Satu piksel gambar menampung satu bit data yang disembunyikan
  • Bit yang digunakan untuk menyembunyikan data adalah bit terkecil dari sebuah piksel (LSB : Least Significant Bit)

Misalnya kita akan menyembunyikan huruf A dengan kode Biner 01000001. Karena huruf A terdiri dari 8 bit, maka kita membutuhkan 8 piksel untuk menyembunyikan satu huruf A ini. Lihat ilustrasi berikut ini. Misalkan data satu piksel menggunakan 8 bit.

                            Data gambar
                             setelah
             Data asli       diisi huruf A
------------------------------------------
piksel 1 :   01011010        01011010
piksel 2 :   01011011        01011011
piksel 3 :   01011011        01011010
piksel 4 :   01011010        01011010
piksel 5 :   01011011        01011010
piksel 6 :   01011011        01011010
piksel 7 :   01011011        01011010
piksel 8 :   01011010        01011011
------------------------------------------

Lihat bit terkecil pada data gambar yang sudah diisi huruf A. Bit terkecil ini berisi kode huruf A yaitu 01000001. Perubahan pada bit terkecil (LSB : Least Significant Bit) tidak akan menimbulkan perubahan signifikan pada gambar, sehingga gambar tetap tampil dengan baik. Namun sekarang, gambar tersebut sudah dimuati oleh data lain.

Dengan asumsi bahwa satu data yang akan disembunyikan terdiri dari 8 bit, maka dengan cara ini, untuk menyembunyikan 100 karakter/data diperlukan gambar sebanyak 8 x 100 = 800 piksel. Sebuah gambar dengan ukuran 20×40 piksel akan bisa menyembunyikan data tersebut.

Untuk mendapatkan kembali data yang telah disembunyikan dalam gambar, maka caranya adalah dengan mengambil bit terkecil dari setiap piksel, kemudian didecode kembali untuk mendapatkan data yang sebenarnya.

Berikut ini sebuah contoh kode program dalam PHP untuk menyembunyikan data ke dalam file gambar PNG. Satu karakter/data menggunakan 5 bit. Karena program ini melakukan proses terhadap gambar, diperlukan library GD yang mendukung PNG.

<?php

$kalimat = 'isi dengan kalimat yang akan disembunyikan';

// fungsi untuk mengubah huruf ke dalam kode bilangan
// karena satu karakter hanya 5 bit, maka maksimal hanya
// bisa 32 jenis karakter
// karakter '|' nanti didecode menjadi baris baru

function huruf2kode($huruf) {
  $kode = 0x1D;
  switch ($huruf) {
    case '~' : $kode = 0x00; break;
    case 'a' : $kode = 0x01; break;
    case 'b' : $kode = 0x02; break;
    case 'c' : $kode = 0x03; break;
    case 'd' : $kode = 0x04; break;
    case 'e' : $kode = 0x05; break;
    case 'f' : $kode = 0x06; break;
    case 'g' : $kode = 0x07; break;
    case 'h' : $kode = 0x08; break;
    case 'i' : $kode = 0x09; break;
    case 'j' : $kode = 0x0A; break;
    case 'k' : $kode = 0x0B; break;
    case 'l' : $kode = 0x0C; break;
    case 'm' : $kode = 0x0D; break;
    case 'n' : $kode = 0x0E; break;
    case 'o' : $kode = 0x0F; break;
    case 'p' : $kode = 0x10; break;
    case 'q' : $kode = 0x11; break;
    case 'r' : $kode = 0x12; break;
    case 's' : $kode = 0x13; break;
    case 't' : $kode = 0x14; break;
    case 'u' : $kode = 0x15; break;
    case 'v' : $kode = 0x16; break;
    case 'w' : $kode = 0x17; break;
    case 'x' : $kode = 0x18; break;
    case 'y' : $kode = 0x19; break;
    case 'z' : $kode = 0x1A; break;
    case ' ' : $kode = 0x1B; break;
    case ',' : $kode = 0x1C; break;
    case '.' : $kode = 0x1D; break;
    case '"' : $kode = 0x1E; break;
    case '|' : $kode = 0x1F;
  }
  return $kode;
}

// bagian untuk menjadikan kalimat ke dalam kode biner
// dalam bentuk array

$panjangkalimat = strlen($kalimat);
$totaldata = $panjangkalimat * 5;
for ($i = 0; $i < $panjangkalimat; $i++) {
  $karakter = substr($kalimat,$i,1);
  $kode = huruf2kode($karakter);
  $j = $i * 5;
  $data[$j]   = ($kode >> 4) & 0x01;
  $data[$j+1] = ($kode >> 3) & 0x01;
  $data[$j+2] = ($kode >> 2) & 0x01;
  $data[$j+3] = ($kode >> 1) & 0x01;
  $data[$j+4] = $kode        & 0x01;
}

$namafile1 = "tux1.png"; // file gambar asli
$namafile2 = "tux2.png"; // file gambar hasil
$img = imagecreatefrompng($namafile1);
$lebar = imagesx($img);
$tinggi = imagesy($img);
$imhasil = imagecreatetruecolor($lebar,$tinggi);

// proses membuat data gambar baru yang memuat
// data yang akan disembunyikan
// data gambar asli diambil setiap piksel
// kemudian bit terkecil piksel tersebut diganti
// dengan bit data yang akan disembunyikan, kemudian
// data piksel baru dimasukkan ke gambar baru

$j = 0;
for ($y = 0; $y < $tinggi; $y++) {
  for ($x = 0; $x < $lebar; $x++) {
    $warna = imagecolorat($img,$x,$y);
    if ($j < $totaldata) {
      if (($warna % 2) == 1) { $warna = $warna - 1; }
      $warna = $warna | $data[$j];
      $j = $j + 1;
    }
    imagesetpixel($imhasil,$x,$y,$warna);
  }
}

imagepng($imhasil,$namafile2);

?>

Berikut ini adalah gambar asli dan gambar hasil yang telah berisi data yang disembunyikan. Gambar tersebut menggunakan program seperti kode di atas. Jika ingin mengetahui apa data yang ada dalam gambar hasil, maka perlu dibuat sebuah program yang bisa mengambil data yang tersembunyi tersebut, yang bersesuaian dengan contoh kode program di atas.

tux1.png tux2.png


In this Class we meet for united…

May 21, 2007

Sahabat…, banyak sudah suka dan duka telah kita lalui bersama, ternyata…
cerita itu baru awal dari kehidupan. jalan panjang telah membentang di hadapan.
Ternyata hidup tak semudah yang kita bayangkan ya, tetapi juga tidak sesulit yang kita pikirkan.

Emas dan Berlian bertebaran di dunia ini…,
tergantung kepada apa yang tergayot ??? (apa coba?)

Finally, selamat datang di rumah inf40B. “Please Feel Like your Own House….”


Siapa dan dimana (Bag 1)

May 13, 2007

NO

Nama

Company

Position

Concern

Website/Address

1. Ade Hadi Pranata PT.NUSA RIZKI PERSADA Soft Developer Open Source ,.NET Jakarta, Kebayoran Baru / Jaksel
2. Amir Mochtar Jati Piranti Solusindo, PT .NET Developer .NET (C#) Framework Jakarta, http://www.jatis.com
3. Muhammad Haikal Kementrian Lingkungan Hidup Soft Developer Open Source  
4. Eska Apri Pujianto Dinas Kependudukan Cirebon Net Administrator Microtix, Cirebon
5. Muhammad Kamal PT.Galenium Pharmasia {dot}Net Developer .NET Framework Jakarta, www.galenium.com
6. Afif Amarullah D4 PIGB – Bandung D4 Student   Bandung
           
TO Be Continued…
           

Follow

Get every new post delivered to your Inbox.