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.
NB : dari sebuah sumber.
Tidak ada komentar:
Posting Komentar