Steganography Dengan Metode EOF
| May 18, 2012 | Posted by Joko Rivai under Delphi, Referensi, Sample Apps, Tips & Tricks |
4 tahun lalu, saya menulis tentang steganografi dengan metode LSB (Least Siginifcant Bit), yaitu teknik manipulasi bit-bit terakhir piksel warna pada gambar (bitmap) untuk menyembunyikan data. Yang jadi soal, bila data yang akan disisipkan ukurannya besar, sehingga gambar asli tidak dapat menampungnya. Karena soal inilah, dan banyaknya pertanyaan serta pencarian di google, saya akan menulis tentang metode steganografi yang lain: Metode EOF (End Of File).
Steganografi dengan metode EOF (End Of File) memiliki beberapa kelebihan:
- Ukuran data yang disembunyikan tidak terbatas
- Proses baca-tulis lebih sederhana
- Dapat diproteksi pasword yang panjangnya tidak terbatas
- Data bebas dimanipulasi tanpa mengganggu kualitas gambar (file) asli.
Yang perlu diperhatikan adalah bagaimana datanya dienkripsi, karena apabila tidak, seseorang akan dengan mudah membuka file pembawa (selanjutnya akan kita sebut media) dan membaca data kita.
Sekilas Stgeanografi dengan Metode EOF
Steganografi dengan metode EOF banyak dipakai terutama dalam pembuatan instalasi (setup) dan SFX (Self Extractor). Setup maupun SFX (yang biasanya terdapat sebagai fitur archiver semacam WinZIP, WinRar dan 7Zip) menggunakan metode ini dengan meletakkan data di akhir sebuah file EXE. Bila file EXE tadi dijalankan, dia akan membaca data di akhir dirinya dan meng-copy-nya ke folder yang ditentukan.
Steganografi yang akan kita buat tidak jauh beda, hanya saja pada contoh di bawah nanti kita tidak akan membuat file EXE yang membaca data pada dirinya sendiri, melainkan hanya membawa data saja. Baca-tulis data akan dilakukan oleh aplikasi sendiri yang akan kita lihat di bawah nanti.
Struktur File Stgeanografi dengan Metode EOF
Dengan metode EOF, secara umum media steganografi (file yang akan disisipi data) memiliki struktur seperti ini:
Setiap blok pada sebuah file dapat kita baca dengan menggunakan dua parameter, posisi awal dan panjang blok tersebut. Dengan struktur di atas, kita dapat membaca posisi [DATA HEADER] yang isinya meliputi:
- Posisi awal [DATA] pada file
- Panjang [DATA] pada file
Bagaimana menentukan posisi dan panjang [DATA HEADER] itu sendiri? Kita dapat memakai looping yang mencari penanda (FLAG) sebagai penentu posisi awal [DATA HEADER] pada file media, mulai dari awal file. Namun cara ini akan menjadi tidak efisien dan menjadi lambat apabila file media [FILE ASLI] berukuran sangat besar (misalnya 100MB).
Karenanya, penanda [DATA HEADER] atau FLAG akan kita letakkan di awal atau akhir file, di mana tidak ada looping yang digunakan untuk mencarinya. Pada beberapa file seperti EXE dan ZIP, penempatan FLAG di awal [FILE ASLI] tidak akan menjadi masalah, namun untuk jenis file lain semisal JPG, BMP dan DOC, penempatan FLAG di awal file akan merusak [FILE ASLI] karena mengganggu isi [FILE ASLI] dan merusak CRC file tersebut. Kita akan menempatkannya di akhir file sehingga tidak membawa bencana meskipun kita mengunakan berbagai jenis file. Ini juga sesuai dengan konsep EOF pada steganografi ini.
Dengan struktur yang baru, kini kita lihat implementasi masing-masing blok pada Delphi. Blok pertama yaitu [FILE ASLI] yang akan menjadi media steganografi tidak akan kita bahas.
Untuk blok kedua, yaitu [DATA HEADER] terdiri dari password, posisi awal blok [DATA] dan panjang blok [DATA].
Type TDataHeader = record Password: String[30]; PosisiAwalData, PanjangData: DWORD; MetodeEnkripsi: Char; end;
Kode di atas adalah deklarasi record untuk mencatat password, posisi awal blok [DATA] dan panjang blok [DATA]. Password maksimal 30 karakter (ANSI) dan dapat diubah sesuai kebutuhan sampai panjang maksimal 255 karakter. Untuk yang lebih panjang, sebaiknya pertimbangkan untuk menempatkan password dalam blok tersendiri. PosisiAwalData dan PanjangData bertipe DWORD untuk menampung angka sampai 4GB. Dengan demikian, kita dapat menggunakan metode ini pada [FILE ASLI] dengan ukuran sampai 4GB. Untuk ukuran yang lebih besar, dapat dipertimbangkan pengunaan tipe data Int64 (Delphi 6 ke atas) untuk ukuran sampai (2^64)-1 karakter Ansi. Field MetodeEnkripsi dapat digunakan untuk mencatat metode yang digunakan dalam enkripsi dan dekripsi, baik untuk enkripsi Password maupun blok [DATA]. Saat ini, field ini belum kita gunakan.
Selanjutnya adalah blok [DATA]. Blok ini hanya berisi data yang disisipkan sehingga tidak ada pencatatan khusus.
Blok terakhir adalah [FLAG], yang mencatat posisi [DATA HEADER] dan sebuah penanda untuk menentukan apakah file ini sudah berisi data steganografi atau belum.
TEOFFlag = record PosisiDataHeader, PanjangDataHeader, FLAG: DWORD; end;
Validasi file apakah sudah berisi data steganografi atau belum akan kita lakukan dengan membandingkan field FLAG di atas dengan sebuah angka yang kita tentukan sebelum menulis data ke EOF dari [FILE ASLI]. Untuk menjaga konsistensi, kita akan membuat sebuah konstanta untuk angka ini:
const STEGANO_FLAG: DWORD = $AB996791;
Angka heksadesimal di atas ($AB996791) tidak harus begitu. Anda bebas menggunakan angka lainnya.
[important]Pada tulisan ini, kita batasi pada steganografi dengan menyisip sebuah file ke EOF file yang lain. Bila Anda ingin menyisipkan teks, Anda dapat menggunakan sebuah TMemo dan meyimpan isinya ke file dengan Memo1.Lines.SaveToFile(‘NamaFile’); dan menyisipkannya ke file target.[/important]
Menulis Data Dan Header
Sebelum menulis data, pertama kita harus memeriksa apakah file yang akan ditulisi ([FILE ASLI]) sudah berisi data steganografi apa belum. Bila belum, barulah kita tulisi dan bila sudah, kita akan menampilkan informasi bahwa file itu sudah berisi data.
Kita perlu sebuah fungsi untuk memudahkan pemeriksaan ini:
const STEGANO_FLAG: DWORD = $AB996791;
Kemudian buatlah sebuah form baru dengan desain seperti berikut:
Saatnya koding
Tombol Proses! untuk penulisan data:
procedure TForm1.Button3Click(Sender: TObject);
var
EF: TEOFFlag;
DH: TDataHeader;
FS_Target,
FS_Data: TFileStream;
begin
//periksa apakah file target ada:
if not FileExists(Edit1.Text) then
begin
MessageBox(Handle,'Maaf. File target tidak valid.', 'Informasi', MB_ICONHAND);
Edit1.SetFocus;
Edit1.SelectAll;
exit;
end;
//periksa apakah file sumber data ada:
if not FileExists(Edit2.Text) then
begin
MessageBox(Handle,'Maaf. File data tidak valid.', 'Informasi', MB_ICONHAND);
Edit2.SetFocus;
Edit2.SelectAll;
exit;
end;
//periksa apakah password sudah benar:
if Edit3.Text <> Edit4.Text then
begin
MessageBox(Handle,'Maaf. Password tidak cocok!', 'Informasi', MB_ICONHAND);
Edit3.SetFocus;
Edit3.SelectAll;
exit;
end;
//periksa apakah file target sudah berisi data stego:
EF := FileSudahBerisiData(Edit1.Text);
if EF.FLAG = STEGANO_FLAG then
begin
MessageBox(Handle,'Maaf. File target sudah berisi data.', 'Informasi', MB_ICONHAND);
exit;
end;
//belum ada? Ambil data dari file data dan tulisi ke file target:
FS_Target := TFileStream.Create(Edit1.Text, fmOpenReadWrite);
FS_Data := TFileStream.Create(Edit2.Text, fmOpenRead);
try
FillChar(DH, sizeof(TDataHeader), 0);
FillChar(EF, sizeof(TEOFFlag), 0);
//isi Data Header:
DH.Password := Edit3.Text;
DH.PosisiAwalData := FS_Target.Size + Sizeof(TDataHeader);
DH.PanjangData := FS_Data.Size;
DH.MetodeEnkripsi := 'N' {Tidak menggunakan enkripsi};
//isi flag :
EF.PosisiDataHeader := FS_Target.Size;
EF.PanjangDataHeader:= Sizeof(TDataHeader);
EF.FLAG := STEGANO_FLAG;
FS_Target.Position := FS_Target.Size {Tempatkan pointer file target ke posisi EOF};
FS_Data.Position := 0 {Tempatkan pointer file data ke posisi BOF};
//tulis data header:
try
FS_Target.Write(DH, Sizeof(TDataHeader));
//copy data:
FS_Target.CopyFrom(FS_Data, FS_Data.Size);
//tulis flag:
FS_Target.Write(EF, sizeof(TEOFFlag));
MessageBox(Handle,'Sukses! Steganografi berhasil.', 'Error', MB_ICONINFORMATION);
except
on e : Exception do
MessageBox(Handle,PChar('Gagal. Terjadi error:#13'+e.Message), 'Error', MB_ICONHAND);
end;
finally
//tutup file dan bebaskan memori:
FS_Target.Free;
FS_Data.Free;
end;
end;
Tombol Proses! untuk pembacaan data:
procedure TForm1.Button5Click(Sender: TObject);
var
EF: TEOFFlag;
DH: TDataHeader;
FS_Stego,
FS_Data: TFileStream;
begin
//periksa apakah file Stego ada:
if not FileExists(Edit5.Text) then
begin
MessageBox(Handle,'Maaf. File Stego tidak valid.', 'Informasi', MB_ICONHAND);
Edit5.SetFocus;
Edit5.SelectAll;
exit;
end;
//periksa apakah file untuk menyimpan data valid:
if not DirectoryExists(ExtractFileDir(Edit7.Text)) then
begin
MessageBox(Handle,'Maaf. File untuk menyimpan data tidak valid.', 'Informasi', MB_ICONHAND);
Edit7.SetFocus;
Edit7.SelectAll;
exit;
end;
//periksa apakah file target sudah berisi data stego:
EF := FileSudahBerisiData(Edit5.Text);
if EF.FLAG <> STEGANO_FLAG then
begin
MessageBox(Handle,'Maaf. File stego tidak berisi data.', 'Informasi', MB_ICONHAND);
exit;
end;
DH := AmbilDataHeader(Edit5.Text);
//password valid?
if DH.Password <> Edit6.Text then
begin
MessageBox(Handle,'Maaf. Password tidak cocok.', 'Informasi', MB_ICONHAND);
Edit6.SetFocus;
Edit6.SelectAll;
exit;
end;
//belum ada? Ambil data dari file stego dan simpan ke file:
FS_Stego := TFileStream.Create(Edit5.Text, fmOpenReadWrite);
if FileExists(Edit7.Text) then
DeleteFile(Edit7.Text);
FS_Data := TFileStream.Create(Edit7.Text, fmCreate);
try
//tentukan posisi pembacaan sesuai Data Header:
FS_Stego.Position := DH.PosisiAwalData;
FS_Data.Position := 0 {Tempatkan pointer file data ke posisi BOF};
//Baca data:
try
FS_Data.CopyFrom(FS_Stego, DH.PanjangData);
MessageBox(Handle,'Sukses! Pembacaan data steganografi berhasil.', 'Error', MB_ICONINFORMATION);
except
on e : Exception do
MessageBox(Handle,PChar('Gagal. Terjadi error:#13'+e.Message), 'Error', MB_ICONHAND);
end;
finally
//tutup file dan bebaskan memori:
FS_Stego.Free;
FS_Data.Free;
end;
end;
Selesai. Berikut tampilan demo saat dijalankan:
Kode-kode di atas sebenarnya sudah cukup jelas, namun akan lebih afdol bila ada contoh yang bisa didownload, bukan?
Download:
Demo Teknik Steganography Dengan Metode EOF (166.2 KiB)
Incoming search terms:
- metode steganografi
- steganography
- contoh steganografi
- steganografi dengan delphi
- steganografi end of file
- metode EOF
- steganografi metode end of file
- metode end of file
- eof pada steganografi
- kumpulan program steganography
Comments
Powered by Facebook Comments














This is the default footer layout. You can easily add or remove columns in the footer.
tolong bagaimana cara pengungkapan data yang telah disisipkan?????masih bingung pakai programnya…..!
iya nie mas…
gimana cara baca file yang telah disisipkan itu?
Di contoh kode di atas kan ada mas. Di contoh project yang didownload juga bisa dilihat…
sama kayak pertanyaan Cia…
ada Metode EOF mengunakan VB 6.0..???
mas mau tanya klo script cara konversi citra ke biner gmn yah..