Wednesday, December 28, 2011

Pengertian Dan Contoh Steganography

Pengertian Steganography
Steganography adalah seni dan ilmu menulis pesan tersembunyi atau menyembunyikan pesan dengan suatu cara sehingga selain si pengirim dan si penerima, tidak ada seorangpun yang mengetahui atau menyadari bahwa ada suatu pesan rahasia. Sebaliknya, kriptografi menyamarkan arti dari suatu pesan, tapi tidak menyembunyikan bahwa ada suatu pesan. Kata "steganografi" berasal dari Bahasa Yunani steganos, yang artinya “tersembunyi atau terselubung”, dan graphein, “menulis”. Jadi steganography dan kriptografi berbeda.

Kini, istilah steganografi termasuk penyembunyian data digital dalam berkas-berkas (file) komputer. Contohnya, si pengirim mulai dengan berkas gambar biasa, lalu mengatur warna setiap pixel ke-100 untuk menyesuaikan suatu huruf dalam alphabet (perubahannya begitu halus sehingga tidak ada seorangpun yang menyadarinya jika ia tidak benar-benar memperhatikannya).

Tujuan Steganography
Tujuan dari steganografi adalah merahasiakan atau menyembunyikan keberadaan dari sebuah pesan tersembunyi atau sebuah informasi. Dalam prakteknya, kebanyakan pesan disembunyikan dengan membuat perubahan tipis terhadap data digital lain yang isinya tidak akan menarik perhatian dari penyerang potensial, sebagai contoh sebuah gambar yang terlihat tidak berbahaya. Perubahan ini bergantung pada kunci (sama pada kriptografi) dan pesan untuk disembunyikan. Orang yang menerima gambar kemudian dapat menyimpulkan informasi terselubung dengan cara mengganti kunci yang benar ke dalam algoritma yang digunakan.

Format yang biasa digunakan adalah :

1.Format image : bitmap (bmp), gif, pcx, jpeg, dll.
2.Format audio : wav, voc, mp3, dll.
3.Format lain : teks file, html, pdf, dll.

Dan sekarang saya akan menjelaskan Program Steganography yang dibuat menggunakan Borland Delphi 7. Berikut adalah contoh programnya :


Source Code nya :
Proses dimulai dengan menulis seluruh pesan ke pixel pertama. Kita harus mengetahui nilai pixelnya terlebih dahulu sebelum menyembunyikan pesan.

messageLength = (Int32)messageStream.Length;


//do some length conflict checking here

//...

String colorValue = messageLength.ToString("x");
colorValue = UnTrimColorString(colorValue, 6);
int red = Int16.Parse(colorValue.Substring(0,2), NumberStyles.HexNumber);
int green = Int16.Parse(colorValue.Substring(2,2), NumberStyles.HexNumber);
int blue = Int16.Parse(colorValue.Substring(4,2), NumberStyles.HexNumber);
pixelColor = Color.FromArgb(red, green, blue);
bitmap.SetPixel(0,0, pixelColor);

Kemudian membaca byte dari aliran kunci untuk menghitung posisi berikutnya :

//start with second pixel

Point pixelPosition = new Point(1,0);
//Loop over the message

for(int messageIndex=0; messageIndex<="" p="">
//repeat the key, if it is shorter than the message

if(keyStream.Position == keyStream.Length){
keyStream.Seek(0, SeekOrigin.Begin);
}

//Get the next pixel-count from the key, use "1" if it's 0

currentKeyByte = (byte)keyStream.ReadByte();
currentStepWidth = (currentKeyByte==0) ? (byte)1 : currentKeyByte;

//jump to reverse-read position and read from the end of the stream

keyPosition = keyStream.Position;
keyStream.Seek(keyPosition, SeekOrigin.End);
currentReverseKeyByte = (byte)keyStream.ReadByte();
//jump back to normal read position

keyStream.Seek(keyPosition, SeekOrigin.Begin);

//Perform line breaks, if current step is wider than the image

while(currentStepWidth > bitmapWidth){
currentStepWidth -= bitmapWidth;
pixelPosition.Y++;
}

//Move X-position

if((bitmapWidth - pixelPosition.X) < currentStepWidth){
pixelPosition.X = currentStepWidth - (bitmapWidth - pixelPosition.X);
pixelPosition.Y++;
}else{

pixelPosition.X += currentStepWidth;
}

Sekarang, hasil dari pixel digabungkan dengan pesan-byte menjadi satu komponen warna (atau semua komponen, jika format warnanya grayscale :

//Get color of the "clean" pixel

pixelColor = bitmap.GetPixel(pixelPosition.X, pixelPosition.Y);

//To add a bit of confusion, xor the byte with

//a byte read from the keyStream

int currentByte = messageStream.ReadByte() ^ currentReverseKeyByte;

if(useGrayscale){
pixelColor = Color.FromArgb(currentByte, currentByte, currentByte);
}else{
//Change one component of the color to the message-byte

SetColorComponent(ref pixelColor, currentColorComponent, currentByte);
//Rotate color components

currentColorComponent =
(currentColorComponent==2) ? 0 : (currentColorComponent+1);
}
} //end of for - proceed to next byte

Jika metode ini berjalan dalam mode ekstraksi, ia membaca pesan panjang dan komponen warna, bukan pengaturannya. Berikut adalah cara untuk mendapatkan panjang dari pixel pertama :

pixelColor = bitmap.GetPixel(0,0);
//UnTrimColorString fill the String with '0'-chars

//to match the specified length

String colorString = UnTrimColorString(pixelColor.R.ToString("x"), 2)
+ UnTrimColorString(pixelColor.G.ToString("x"), 2)
+ UnTrimColorString(pixelColor.B.ToString("x"), 2);

messageLength = Int32.Parse(colorString, NumberStyles.HexNumber);
messageStream = new MemoryStream(messageLength);

Koordinat pixel dihitung dengan cara yang sama seperti dijelaskan di atas. Kemudian byte tersembunyi diekstrak dari nilai warna:

//Get color of the modified pixel

pixelColor = bitmap.GetPixel(pixelPosition.X, pixelPosition.Y);
//Extract the hidden message-byte from the color

byte foundByte = (byte)(currentReverseKeyByte ^
GetColorComponent(pixelColor, currentColorComponent));
messageStream.WriteByte(foundByte);
//Rotate color components

currentColorComponent =
(currentColorComponent==2) ? 0 : (currentColorComponent+1);
} //end of for - proceed to next byte

Demikian postingan saya kali ini mengenai Steganography.