Disusun oleh :
Nama : Wahyu Ramadhan
NIM : 1457301017
Kelas : 4.2 / Teknik Informatika
Pembimbing : Muhammad Rizka, S.S.T, M.Kom
Nilai :
Keterangan :
ii
DAFTAR ISI
LEMBAR JUDUL
LEMBAR PENGESAHAN .................................................................................... ii
DAFTAR ISI .......................................................................................................... iii
1.1 TUJUAN PRAKTIKUM ............................................................................. 1
1.2 DASAR TEORI ........................................................................................... 1
1.2.1 Pengertian Kriptografi .......................................................................... 1
1.2.2 Tujuan Kriptografi ................................................................................ 1
1.2.3 Steganografi .......................................................................................... 2
1.2.4 Least Significant Bit (LSB) .................................................................. 4
1.3 ALAT DAN BAHAN PRAKTIKUM ......................................................... 5
1.4 LANGKAH PRAKTIKUM ......................................................................... 5
1.5 HASIL PRAKTIKUM ............................................................................... 19
1.6 ANALISA PEMBAHASAN...................................................................... 22
1.7 ANALISA PROGRAM ............................................................................. 24
1.8 KESIMPULAN .......................................................................................... 27
DAFTAR PUSTAKA ........................................................................................... 28
iii
LAPORAN PRAKTIKUM FINAL
IMAGE STEGANOGRAPHY DENGAN METODE LSB (LEAST
SIGNIFICANT BIT)
1
3. Non-repudiation (nirpenyangkalan), yang memberikan cara untuk
membuktikan bahwa suatu dokumen dating dari setiap seseorang apabila ia
mencoba menyangkal memiliki dokumen tersebut.
2
1.2.3 Steganografi
Steganografi adalah suatu teknik untuk menyembunyikan informasi yang
bersifat pribadi dengan sesuatu yang hasilnya akan tampak seperti informasi
normal lainnya. Media yang digunakan umumnya merupakan suatu media yang
berbeda dengan media pembawa informasi rahasia, dimana disinilah fungsi dari
teknik steganografi yaitu sebagai teknik penyamaran menggunakan media lain
yang berbeda sehingga informasi rahasia dalam media awal tidak terlihat secara
jelas.
Steganografi biasanya sering disalahartikan dengan kriptografi karenanya
keduanya sama-sama bertujuan untuk melindungi informasi yang berharga.
Perbedaan yang mendasar antara keduanya yaitu steganografi berhubungan
dengan informasi tersembunyi sehingga tampak seperti tidak ada informasi
tersembunyi sama sekali. Jika seseorang mengamati obyek yang menyimpan
informasi tersembunyi tersebut, maka dia tidak akan menyangka bahwa terdapat
pesan rahasia dalam obyek tersebut, dan karenanya dia tidak akan berusaha
memecahkan informasi dari obyek tersebut.
Kata steganografi berasal dari bahasa Yunani, yaitu dari kata Stegos
(covered/tersembunyi) dan Graptos (writing/tulisan). Steganografi di dunia
modern biasanya mengacu pada informasi atau suatu arsip yang telah
disembunyikan ke dalam suatu arsip citra digital, audio, atau video. Teknik
Steganografi ini telah banyak digunakan dalam strategi peperangan dan
pengiriman sandi rahasia sejak jaman dahulu kala. Dalam perang Dunia II, teknik
steganografi umum digunakan oleh tentara Jerman dalam mengirimkan pesan
rahasia dari atau menuju Jerman, (Morkel, dkk, 2005).
3
Semakin pentingnya nilai dari sebuah informasi, maka semakin
berkembang pula metode-metode yang dapat digunakan untuk melakukan
penyisipan informasi yang didukung pula dengan semakin berkembangnya media
elektronik. Berbagai macam media elektronik kini telah dapat digunakan untuk
melakukan berbagai fungsi steganografi dengan berbagai macam tujuan dan
fungsi yang diharapkan oleh penggunanya. Sebagai fungsi yang umum,
steganografi digunakan untuk memberikan cap khusus dalam sebuah karya yang
dibuat dalam format media elektronik sebagai identifikasi, (Johnson, dkk, 1998).
Dua teknik lain yang sangat erat kaitannya dengan steganografi adalah
watermarking dan fingerprinting. Kedua teknik ini berfokus pada perlindungan
hak cipta dengan menyisipkan informasi hak cipta pada media lain dan
memberikan ijin kepada pihak ketiga untuk mengetahui keberadaan informasi
yang disisipkan tersebut. Hal ini berbeda dengan steganografi yang menjaga
informasi yang disisipkan pada media lain agar tidak terlihat oleh pihak ketiga.
Jika ada pihak ketiga yang ingin menghack isi informasi tersembunyi tersebut,
maka tujuan mereka adalah berbeda. Jika pada watermarking dan fingerprinting,
maka mereka berusaha menghilangkan informasi yang disisipkan, sedangkan jika
pada steganografi, maka mereka berusaha sebatas mendeteksi keberadaan
informasi tersembunyi, (Morkel , 2005).
4
1.2.4 Least Significant Bit (LSB)
Metode LSB ini digunakan dalam teknik steganographydikarenakan
tergolong mudah dalam penerapannya. Dasar dari metode ini adalah bilangan
berbasiskan biner atau dengan kata lain angka 0 dan angka 1. Karena data
digital merupakan susunan antara angka 0 dan satu maka proses
penerapannya menjadi mudah. Lebih lanjut lagi, metode ini berhubungan
erat dengan ukuran 1 bit dan ukuran 1 byte. 1bytedata dapat dikatakan terdiri
dari 8 bit data. Dimana bit pada posisi paling kanan lah yang disebut dengan bit
pada posisi LSB (Least Significant Bit).Teknik steganography dengan
menggunakan metode LSB adalah teknik dimana kita mengganti bit pada posisi
LSB pada data dengan bit yang dimiliki oleh data yang akan disembunyikan.
Karena bit yang diganti hanyalah bit yang paling akhir, maka meskipun data
telah berubah, kita tetap tidak akan bisa mengenalinya, karena media stego yang
dihasilkan hampir sama persis dengan media sebelum disisipi oleh data yang ingin
disembunyikan.
dari data diatas akan disisipkan suatu pesan rahasia yang berupa data biner
dengan nilai bit (01001000) maka data atau media penampung akan menjadi Dari:
5
dengan nilai paling kanan maka media yang dihasilkan hamper sama persis
dengan media aslinya
2. Pilih file, lalu klik new project atau bisa menekan langsung Ctrl + Shift + N di
keyboard
6
Gambar 1.5 New Project
7
Gambar 1.7 New Java Application
8
6. Di dalam imagesteganography (java source package), terdapat class yang
bernama ImageSteganography.java yang merupakan import dari
MainApp.java.
9
image = add_text(image, message);
return (setImage(image, new File(fileOut), "png"));
10
Kemudian, pada StegoImage.java adalah source yang paling utama dimana
proses penyandian, penyisipan, proses encoding decoding pesan dilakukan di
class ini. Terdapat juga fungsi-fungsi extends dari Encode.java dan
Decode.java. Selain itu juga terdapat proses dari metode Least Significant Bit.
StegoImage.java
package imagesteganography.util;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.awt.image.WritableRaster;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JOptionPane;
11
"File tidak dapat di simpan!", "Error",
JOptionPane.ERROR_MESSAGE);
return false;
}
}
public BufferedImage add_text(BufferedImage image, String
text) {
byte img[] = get_byte_data(image);
byte msg[] = text.getBytes();
byte len[] = bit_conversion(msg.length);
try {
encode_text(img, len, 0);
encode_text(img, msg, 32);
} catch (Exception e) {
JOptionPane.showMessageDialog(null,
"File tidak dapat disisipi pesan!",
"Error", JOptionPane.ERROR_MESSAGE);
}
return image;
}
public BufferedImage user_space(BufferedImage image) {
BufferedImage new_img = new
BufferedImage(image.getWidth(), image.getHeight(),
BufferedImage.TYPE_3BYTE_BGR);
Graphics2D graphics = new_img.createGraphics();
graphics.drawRenderedImage(image, null);
graphics.dispose();
return new_img;
}
public byte[] get_byte_data(BufferedImage image) {
WritableRaster raster = image.getRaster();
DataBufferByte buffer = (DataBufferByte)
raster.getDataBuffer();
return buffer.getData();
}
public byte[] bit_conversion(int i) {
byte byte3 = (byte) ((i & 0xFF000000) >>> 24);
byte byte2 = (byte) ((i & 0x00FF0000) >>> 16);
byte byte1 = (byte) ((i & 0x0000FF00) >>> 8);
12
byte byte0 = (byte) ((i & 0x000000FF));
return (new byte[]{byte3, byte2, byte1, byte0});
}
public byte[] encode_text(byte[] image, byte[] addition,
int offset) {
if (addition.length + offset > image.length) {
throw new IllegalArgumentException("File tidak
cukup di sisipi pesan!");
}
for (int i = 0; i < addition.length; ++i) {
int add = addition[i];
for (int bit = 7; bit >= 0; --bit, ++offset) {
int b = (add >>> bit) & 1;
image[offset] = (byte) ((image[offset] & 0xFE)
| b);
}
}
return image;
}
public byte[] decode_text(byte[] image) {
int length = 0;
int offset = 32;
for (int i = 0; i < 32; ++i) {
length = (length << 1) | (image[i] & 1);
}
byte[] result = new byte[length];
for (int b = 0; b < result.length; ++b) {
for (int i = 0; i < 8; ++i, ++offset) {
result[b] = (byte) ((result[b] << 1) |
(image[offset] & 1));
}
}
return result;
}
}
13
8. Di dalam imagesteganography.view (java source package), terdapat interface
dari project ImageSteganography (GUI Interface) bernama MainApp.java.
Terdapat dua jendela tab pane yaitu Encoder dan Decoder.
Tab Encoder
TabPanned
JButton
JButton
JButton
14
if (mimeType.equals("image/png")) {
txtInputPath.setText(chooser.getSelectedFile().getParent
());
txtInputName.setText(chooser.getSelectedFile().getName()
);
fileIn = chooser.getSelectedFile();
} else {
JOptionPane.showMessageDialog(rootPane, "File Must Image
and Type PNG");
}
} else {
JOptionPane.showMessageDialog(rootPane,
"File Must Image and Type PNG");
}
}
}
File Input Name : adalah keterangan nama gambar yang telah diinput.
File Output Name : berfungsi untuk menyimpan hasil gambar yang
nantinya telah di sisipi pesan pada proses encoding. Menggunakan
swing control Button dan swing windows File Chooser. Berikut
perintah program dari button choose:
private void
btnChooseOutputActionPerformed(java.awt.event.ActionEven
t evt) {
chooser = new JFileChooser();
chooser.setDialogTitle("Choose File Image");
chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ON
LY);
int choose = chooser.showOpenDialog(this);
if (choose == JFileChooser.APPROVE_OPTION) {
String out =
chooser.getSelectedFile().toString();
txtOutputPath.setText(out);
}
}
15
File Output Name : berfungsi untuk memberi nama output gambar hasil
dari proses encoding (steganography). Menggunakan swung controls
TextField.
Hidden Message : Berfungsi untuk menginput pesan yang akan disisipi
didalam gambar yang telah diinput. Menggunakan swin controls
TextArea.
Tombol Encode : berfungsi untuk mengaktifkan proses encoding
(steganography) setelah menginput gambar dan memberi pesan yang
disisipi pada gambar. Berikut perintah program Encode :
private void
btnEncodeActionPerformed(java.awt.event.ActionEvent evt)
{
String fileOut = txtOutputPath.getText() +
txtOutputName.getText() + ".png";
String message = txtMessage.getText();
if (fileIn != null && fileIn.isFile()) {
if (txtOutputPath.getText().equals("") ||
txtOutputName.getText().equals("")) {
JOptionPane.showMessageDialog(rootPane,
"Please Fill Data");
} else {
if (!message.equals("")) {
Encode enc = new Encode();
boolean success =
enc.encode(fileIn.getAbsolutePath(), fileOut, message);
if (success) {
JOptionPane.showMessageDialog(rootPane, "Success");
ProcessBuilder p = new
ProcessBuilder("explorer.exe", "/select," + fileOut);
try {
p.start();
fileIn = null;
txtInputPath.setText("");
txtOutputPath.setText("");
txtInputName.setText("");
txtOutputName.setText("");
16
txtMessage.setText("");
} catch (IOException ex) {
Logger.getLogger(MainApp.class.getName()).log(Level.SEVE
RE, null, ex);
}
} else {
JOptionPane.showMessageDialog(rootPane, "Error");
}
} else {
JOptionPane.showMessageDialog(rootPane, "Masukan pesan
rahasia");
}
}
} else {
JOptionPane.showMessageDialog(rootPane,
"Pilih Choose A File!!!");
}
}
17
Keterangan :
File Input Path : berfungsi untuk menginput gambar yang telah di
disisipi pesan pada proses encoding (steganography) sebelumnya.
Menggunakan swing control Button dan swing windows File Chooser.
Berikut perintah program dari button choose:
private void
chooseDecoderActionPerformed(java.awt.event.ActionEvent
evt) {
chooser = new JFileChooser();
chooser.setDialogTitle("Choose Stego Image");
int choose = chooser.showOpenDialog(this);
if (choose == JFileChooser.APPROVE_OPTION) {
FileNameMap fileName =
URLConnection.getFileNameMap();
String mimeType =
fileName.getContentTypeFor(chooser.getSelectedFile().get
Path());
if (mimeType != null) {
if (mimeType.equals("image/png")) {
txtDecoderPath.setText(chooser.getSelectedFile().getPare
nt());
txtDecoderName.setText(chooser.getSelectedFile().getName
());
fileStego =
chooser.getSelectedFile();
} else {
18
File Input Name : adalah keterangan nama dari gambar yang di input.
Hidden Messages : berfungsi untuk menampilkan pesan yang disisipi di
gambar lalu dimunculkan di kotak TextArea.
Button Decoder : berfungsi untuk mengaktifkan proses Decoding
(steganography) setelah menginput gambar yang disisipi pesan yang
nantinya dimunculkan kembali pesan tersebut. Berikut perintah
program Decode :
private void
btnDecoderActionPerformed(java.awt.event.ActionEvent
evt) {
// TODO add your handling code here:
txtDecoderMessage.setText("");
if (fileStego != null && fileStego.isFile()) {
String file = fileStego.getAbsolutePath();
Decode dcd = new Decode();
txtDecoderMessage.setText(dcd.decode(file));
} else {
JOptionPane.showMessageDialog(rootPane,
"Please Choose A File");
}
}
19
1.5 HASIL PRAKTIKUM
a. Berikut adalah tampilan GUI dari project ImageSteganography dengan
metode LSB (Least Significant Bit). Berikut proses Encoder.
b. Setelah menekan tombol Encoder, maka akan muncul jendela pop up sukses.
Jika tidak dinputkan gambar beserta pesan yang disisipi, maka akan muncul
jendela seperti berikut
20
c. Kemudian pada tab Decoder, dimana informasi pesan yang disisipi pada
gambar ingin diketahui apa isi pesan tersebut.
Keterangan : file gambar yang telah di encode tadi kemudian akan di decode
untuk melihat isi pesan yang disisipi. Hasilnya isi pesan tersebut berhasil
dipecahkankan dan benar seperti yang telah diinput sebelumnya pada proses
Encode.
d. Jika gambar yang di decode tidak berisikan pesan yang disisipi, maka sistem
akan muncul jendela pop up seperti dibawah ini :
21
1.6 ANALISA PEMBAHASAN
a. Berikut adalah gambar yang diinput dan disisipi pesan rahasia didalamnya.
d. Sesuai dengan namanya, LSB artinya bit yang tidak significant / tidak
mempunyai pengaruh yang besar, maka metode ini mengganti nilai bit ke-
8 gambar Lena untuk menyisipkan data. Kalau dipetakan dari kata
“secret” kira-kira seperti ini (bandingkan dengan table binary
sebelumnya) :
22
Media
Keterangan : biner diatas adalah biner dari gambar lena.png yang telah
diraster dan nantinya akan disisi pesan.
0 1 1 1 0 0 1 1
0 1 1 0 0 1 0 1
0 1 1 0 0 0 1 1
0 1 1 1 0 0 1 0
0 1 1 0 0 0 1 1
0 1 1 1 0 1 0 0
23
1.7 ANALISA PROGRAM
a. Get Image
b. Set Image
public boolean setImage(BufferedImage image, File file, String ext) {
try {
file.delete();
ImageIO.write(image, ext, file);
return true;
} catch (IOException e) {
JOptionPane.showMessageDialog(null,
"File tidak dapat di simpan!", "Error", JOptionPane.ERROR_MESSAGE);
return false;
}
}
Program diatas berfungsi untuk menyimpan gambar yang nantinya disisipi
pesan setelah proses encode. Terdapat perintah ImageIO.write(image,
ext, file) yang mana image di tulis (gambar disimpan) setelah di
encoding.
c. Raster Image
public byte[] get_byte_data(BufferedImage image) {
WritableRaster raster = image.getRaster();
DataBufferByte buffer = (DataBufferByte) raster.getDataBuffer();
return buffer.getData();
}
24
Program diatas berfungsi untuk mengubah gambar menjadi data raster dalam
bentuk angka biner dengan perintah WritableRaster raster =
image.getRaster()
d. User Space
public BufferedImage user_space(BufferedImage image) {
BufferedImage new_img = new BufferedImage(image.getWidth(),
image.getHeight(), BufferedImage.TYPE_3BYTE_BGR);
Graphics2D graphics = new_img.createGraphics();
graphics.drawRenderedImage(image, null);
graphics.dispose();
return new_img;
}
Program diatas berfungsi untuk mengambil pesan yang telah dirubah menjadi
angka di gambar. Pesan rahasia yang diambil berdasakan nilai biner dari
gambar yang telah di raster serta tinggi dan lebar gambar seperti pada perintah
BufferedImage new_img = new
BufferedImage(image.getWidth(), image.getHeight(),
BufferedImage.TYPE_3BYTE_BGR. Juga pada class Decode.java
terdapat juga perintah decode =
decode_text(get_byte_data(image)) yang artinya pesan diambil
dari nilai biner gambar yang telah disisipi pesan rahasia pada bit ke 8 sebelah
kanan.
e. Bit Conversion
public byte[] bit_conversion(int i) {
byte byte3 = (byte) ((i & 0xFF000000) >>> 24);
byte byte2 = (byte) ((i & 0x00FF0000) >>> 16);
byte byte1 = (byte) ((i & 0x0000FF00) >>> 8);
byte byte0 = (byte) ((i & 0x000000FF));
return (new byte[]{byte3, byte2, byte1, byte0});
}
Program di atas berfungsi untuk mengkoversikan byte ke bit. Terdapat
beberapa pilihan konversi yaitu ada 24 bit, 16 bit, 8 bit
25
f. Add Text
public BufferedImage add_text(BufferedImage image, String text) {
byte img[] = get_byte_data(image);
byte msg[] = text.getBytes();
byte len[] = bit_conversion(msg.length);
try {
encode_text(img, len, 0);
encode_text(img, msg, 32);
} catch (Exception e) {
JOptionPane.showMessageDialog(null,
"File tidak dapat disisipi pesan!", "Error", JOptionPane.ERROR_MESSAGE);
}
return image;
}
Program diatas berfungsi untuk menambahkan teks atau pesan rahasia yang
disisipi ke dalam gambar. Terdapat perintah byte img[] =
get_byte_data(image) untuk mengambil byte (data raster/biner) dari
gambar. Kemudian terdapat perintah byte msg[]=text.getBytes()
untuk mengambil byte dari pesan/teks yang ingin sisipi yang diubah menjadi
nilai biner nantinya dengan perintah byte len[]=
bit_conversion(msg.length). Kemudian teks tersebut di encode
menggunakan perintah encode_text(img,len,0) dan
encode_text(img,msg,32)
g. Encode Text
public byte[] encode_text(byte[] image, byte[] addition, int offset) {
if (addition.length + offset > image.length) {
throw new IllegalArgumentException("File tidak cukup di sisipi pesan!");
}
for (int i = 0; i < addition.length; ++i) {
int add = addition[i];
for (int bit = 7; bit >= 0; --bit, ++offset) {
int b = (add >>> bit) & 1;
image[offset] = (byte) ((image[offset] & 0xFE) | b);
}
}
return image;
}
Perintah diatas merupakan perintah utama untuk melakukan proses encoding
dengan LSB. Terdapat perintah public byte[]
encode_text(byte[] image, byte[] addition, int
26
offset) yang berfungsi melakukan encode teks terhadap byte gambar, dan
penambahan bit baru di gambar dari bit teks. Lalu proses penyisipan biner
(byte) gambar hingga nantinya berada di sebelah kanan pada bit ke 8
menggunakan perintah for (int bit=7; bit>=0; --bit,
++offset).
h. Decoder Text
public byte[] decode_text(byte[] image) {
int length = 0;
int offset = 32;
for (int i = 0; i < 32; ++i) {
length = (length << 1) | (image[i] & 1);
}
byte[] result = new byte[length];
for (int b = 0; b < result.length; ++b) {
for (int i = 0; i < 8; ++i, ++offset) {
result[b] = (byte) ((result[b] << 1) | (image[offset] & 1));
}
}
return result;
}
}
Perintah diatas berfungsi untuk mengambil bit yang telah di encode kemudian
disatukan kembali (berdasarkan 8 bit) dan melihat isi pesan berdasarkan nilai
biner dari pesan tadi dengan perintah for (int i = 0; i < 8; ++i,
++offset).
27
1.8 KESIMPULAN
Steganography adalah cara yang menarik dan efektif dalam
menyembunyikan pesan rahasia dan telah digunakan selama berabad-abad.
Metode-metode untuk “memperlihatkan” pesan yang disembunyikan (disebut
steganalysis) sudah cukup banyak, tetapi yang sulit adalah menyadari
digunakannya steganography itu dan kunci yang diperlukan untuk ”membuka”
pesan yang ada.
Metode steganografi LSB bekerja dengan cara mengganti bit terakhir atau
bit paling tidak berharga dengan bit text pesan rahasia,
28
DAFTAR PUSTAKA
29