DAFTAR ISI

LEMBAR PENGESAHAN TUGAS AKHIR ........................................................ ii ABSTRAK ............................................................................................................. iii KATA PENGANTAR .......................................................................................... iv DAFTAR ISI.......................................................................................................... vi DAFTAR GAMBAR ............................................................................................. ix DAFTAR TABEL................................................................................................ xiv BAB I PENDAHULUAN .....................................................................................I-1 1.1 1.2 1.3 1.4 1.5 1.6 LATAR BELAKANG .....................................................................I-1 PERUMUSAN MASALAH............................................................I-3 BATASAN MASALAH..................................................................I-3 TUJUAN PENULISAN ..................................................................I-4 METODOLOGI...............................................................................I-4 SISTEMATIKA PEMBAHASAN ..................................................I-6

BAB II LANDASAN TEORI ............................................................................. II-1 2.1 STEGANOGRAFI......................................................................... II-1 2.1.1 Definisi Steganografi ........................................................... II-1 2.1.2 Teknik Steganografi............................................................. II-2 2.1.3 Kriteria Penyembunyian Data.............................................. II-7 2.2 CITRA DIGITAL .......................................................................... II-8 2.2.1 Format Citra Digital............................................................. II-8 2.2.2 Bitmap (BMP)...................................................................... II-9

vi

2.3 2.4

ALGORITMA DES..................................................................... II-11 FUNGSI HASH ........................................................................... II-15 2.4.1 Definisi Fungsi Hash.......................................................... II-15 2.4.2 Algoritma MD5.................................................................. II-16 2.4.3 Parameter Pengukuran Kualitas Citra................................ II-17

BAB III PERANCANGAN DAN IMPLEMENTASI PROGRAM .................. III-1 3.1 3.2 3.3 SPESIFIKASI SISTEM................................................................ III-1 DIAGRAM BLOK SISTEM ........................................................ III-2 PERANCANGAN DIAGRAM ALIR.......................................... III-3 3.3.1 Perancangan Diagram Alir Menu Utama............................ III-3 3.3.2 Perancangan Diagram Alir Program Enkripsi .................... III-5 3.3.3 Perancangan Diagram Alir Program Dekripsi .................. III-10 3.4 IMPLEMENTASI PROGRAM.................................................. III-12 3.4.1 Implementasi Menu Utama............................................... III-12 3.4.2 Implementasi Sub Program Enkripsi ................................ III-13 3.4.3 Implementasi Sub Program Dekripsi ................................ III-19 BAB IV PENGUJIAN DAN ANALISA PROGRAM ......................................IV-1 4.1 PENGUJIAN PROGRAM ...........................................................IV-1 4.1.1 Analisa Penyisipan Citra Pesan pada Citra Penampung .....IV-1 4.1.2 Pengaruh Modifikasi Terhadap Citra Hasil Steganografi ...IV-6 4.2 PENGARUH MODIFIKASI TERHADAP CITRA PESAN HASIL DEKRIPSI ......................................................................IV-9 4.2.1 Pengaruh Modifikasi Invert Terhadap Citra Pesan .............IV-9

vii

4.2.2 Pengaruh Modifikasi Mirror Vertical dan Mirror Horizontal Terhadap Citra Pesan.........................IV-11 4.2.3 Pengaruh Modifikasi Fog Terhadap Citra Pesan ..............IV-15 4.2.4 Pengaruh Modifikasi Lighten Terhadap Citra Pesan ........IV-20 4.2.4 Pengaruh Modifikasi Darken Terhadap Citra Pesan ........IV-25 BAB V PENUTUP.............................................................................................. V-1 5.1 5.2 KESIMPULAN ............................................................................. V-1 SARAN.......................................................................................... V-3

DAFTAR PUSTAKA LAMPIRAN

viii

DAFTAR GAMBAR

Gambar II.1

Ilustrasi Steganografi dan kriptografi pada citra digital[3]......... II-2

Gambar II-2. Gambar ter-watermark [4].......................................................... II-3 Gambar II-3. Steganografi menggunakan citra digital sebagai ........................ II-4 Gambar II-4. Penggantian bit LSB pada komponen warna RGB..................... II-5 Gambar II-5. Citra 24 bit 200x200 [4] ............................................................. II-6 Gambar II-6. Kombinasi warna gambar 4 dan 8 bit. [4] .................................. II-9 Gambar II-7. Semut.bmp (484x484 24 bit) [4] .............................................. II-10 Gambar II-8 Struktur file bitmap. [4] ............................................................ II-10

Gambar II-9. Skema Global Algoritma DES[5]............................................. II-12 Gambar II-10. Jaringan Feistel untuk satu putaran DES [5] ............................ II-13 Gambar II-11. Algoritma enkripsi dengan DES permutasi awal [5] ................ II-14 Gambar II-12. Fungsi hash [6] ......................................................................... II-16 Gambar II-13. Proses dalam algoritma MD5 ................................................... II-17 Gambar III-1. Diagram blok sistem .................................................................. III-2 Gambar III-2. Diagram Alir Menu Utama........................................................ III-4 Gambar III-3. Diagram alir memilih citra penampung ..................................... III-5 Gambar III-4. Diagram alir memilih citra pesan yang disisipkan .................... III-6 Gambar III-5. Diagram alir proses penyisipan citra pesan ............................... III-7 Gambar III-6. Diagram alir proses modifikasi.................................................. III-9 Gambar III-7. Diagram alir memilih citra termodifikasi ................................ III-10 Gambar III-8. Diagram alir dekripsi citra pesan ............................................. III-11

ix

Gambar III-9. Tampilan GUI Menu Utama.................................................... III-13 Gambar III-10. Tampilan GUI Sub Program Enkripsi .................................... III-14 Gambar III-11 Tampilan GUI Histogram ....................................................... III-15 Gambar III-12. Tampilan GUI Perbandingan Pixel......................................... III-17 Gambar III-13. Tampilan GUI Sub Program Dekripsi .................................... III-19 Gambar III-14. Tampilan GUI Histogram ....................................................... III-21 Gambar III-15. Tampilan GUI Perbandingan Pixel......................................... III-22 Gambar IV-1. Perbandingan Pengaruh Penyisipan Citra Pesan Terhadap Citra Penampung .......................................................................IV-2 Gambar IV-2. Perbandingan Histogram ............................................................IV-3 Gambar IV-3. Perubahan nilai pixel pada warna merah sebelum dan setelah penyisipan citra pesan Banana.bmp........................IV-4 Gambar IV-4. Perubahan nilai pixel pada warna merah sebelum dan setelah penyisipan citra pesan Treasuremap.bmp ...............IV-5 Gambar IV-5. Perubahan nilai pixel pada warna merah sebelum dan setelah penyisipan citra pesan Twins.bmp..........................IV-5 Gambar IV-6. Perubahan nilai pixel pada warna merah sebelum dan setelah penyisipan citra pesan Twins.bmp..........................IV-7 Gambar IV-7. Hasil modifikasi invert yang disisipkan citra pesan berbeda......IV-9 Gambar IV-8. Citra pesan hasil dekripsi citra termodifikasi invert .................IV-10 Gambar IV-9. Hasil modifikasi Mirror Vertical yang disisipkan citra pesan berbeda ..................................................................IV-12

x

Gambar IV-10. Hasil modifikasi Mirror Horizontal yang disisipkan citra pesan berbeda ..................................................................IV-12 Gambar IV-11. Citra pesan hasil dekripsi citra termodifikasi mirror vertical .........................................................................IV-13 Gambar IV-12. Citra pesan hasil dekripsi citra termodifikasi mirror horizontal .....................................................................IV-13 Gambar IV-13. Hasil modifikasi fog citra steganografi yang telah disisipkan Banana.bmp dengan berbagai nilai pengubah ........IV-15 Gambar IV-14. Hasil modifikasi fog citra steganografi yang telah disisipkan Treasuremap.bmp dengan berbagai nilai pengubah ................IV-16 Gambar IV-15. Hasil modifikasi fog citra steganografi yang telah disisipkan Twins.bmp dengan berbagai nilai pengubah ..........IV-16 Gambar IV-16. Perubahan level warna hijau setelah diberi nilai pengubah 9.......................................................................IV-17 Gambar IV-17. Perbandingan pengaruh nilai pengubah pada citra pesan Banana.bmp .............................................................................IV-18 Gambar IV-18. Perbandingan pengaruh nilai pengubah pada citra pesan Treasuremap.bmp ....................................................................IV-18 Gambar IV-19. Perbandingan pengaruh nilai pengubah pada citra pesan Twins.bmp ...............................................................................IV-18 Gambar IV-20. Hasil modifikasi lighten citra steganografi yang telah disisipkan Banana.bmp dengan berbagai nilai pengubah ........IV-21

xi

Gambar IV-21. Hasil modifikasi lighten citra steganografi yang telah disisipkan Treasuremap.bmp dengan berbagai nilai pengubah ................IV-21 Gambar IV-22. Hasil modifikasi lighten citra steganografi yang telah disisipkan Twins.bmp dengan berbagai nilai pengubah ..........IV-21 Gambar IV-23. Perubahan level warna hijau setelah diberi nilai pengubah 25.............................................................................IV-22 Gambar IV-24. Perbandingan pengaruh nilai pengubah pada citra pesan Banana.bmp .............................................................................IV-23 Gambar IV-25. Perbandingan pengaruh nilai pengubah pada citra pesan Treasuremap.bmp ....................................................................IV-23 Gambar IV-26. Perbandingan pengaruh nilai pengubah pada citra pesan Twins.bmp ...............................................................................IV-23 Gambar IV-27. Hasil modifikasi darken citra steganografi yang telah disisipkan Banana.bmp dengan berbagai nilai pengubah ........IV-25 Gambar IV-28. Hasil modifikasi darken citra steganografi yang telah disisipkan Treasuremap.bmp dengan berbagai nilai pengubah ................IV-26 Gambar IV-29. Hasil modifikasi darken citra steganografi yang telah disisipkan Twins.bmp dengan berbagai nilai pengubah ..........IV-26 Gambar IV-30. Perubahan level warna hijau setelah diberi nilai pengubah 25.....................................................................IV-27 Gambar IV-31. Perbandingan pengaruh nilai pengubah pada citra pesan Banana.bmp .............................................................................IV-28

xii

Gambar IV-32. Perbandingan pengaruh nilai pengubah pada citra pesan Treasuremap.bmp ....................................................................IV-28 Gambar IV-33. Perbandingan pengaruh nilai pengubah pada citra pesan Twins.bmp ...............................................................................IV-28

xiii

DAFTAR TABEL

Tabel III-1. Spesifikasi Perangkat Keras ........................................................... III-1 Tabel III-2. Spesifikasi Perangkat Lunak........................................................... III-1 Tabel IV-1 Parameter yang Digunakan dalam Pengujian..................................IV-1 Tabel IV-2. MSE dan PSNR Citra hasil steganografi dengan citra pesan berbeda ....................................................................IV-6 Tabel IV-3. MSE dan PSNR Citra Hasil Modifikasi .........................................IV-8 Tabel IV-4. MSE dan PSNR Citra pesan hasil dekripsi citra termodifikasi invert ........................................................................................IV-10 Tabel IV-5. MSE dan PSNR Citra pesan hasil dekripsi citra termodifikasi mirror vertical .........................................................................IV-14 Tabel IV-6. MSE dan PSNR Citra pesan hasil dekripsi citra termodifikasi mirror horizontal .....................................................................IV-14 Tabel IV-7. MSE dan PSNR citra pesan Banana.bmp.....................................IV-19 Tabel IV-8. MSE dan PSNR citra pesan Treasuremap.bmp............................IV-19 Tabel IV-9. MSE dan PSNR citra pesan Twins.bmp.......................................IV-19 Tabel IV-10. MSE dan PSNR citra pesan Banana.bmp...................................IV-24 Tabel IV-11. MSE dan PSNR citra pesan Treasuremap.bmp ..........................IV-24 Tabel IV-12. MSE dan PSNR citra pesan Twins.bmp.....................................IV-24 Tabel IV-13. MSE dan PSNR citra pesan Banana.bmp...................................IV-29 Tabel IV-14. MSE dan PSNR citra pesan Treasuremap.bmp ..........................IV-29 Tabel IV-15. MSE dan PSNR citra pesan Twins.bmp.....................................IV-29

xiv

BAB I PENDAHULUAN
1.1 LATAR BELAKANG Kehidupan modern saat ini tidak lepas dari kemajuan teknologi digital. Misalnya transaksi di mesin ATM, transaksi di bank, transaksi dengan kartu kredit, percakapan melalui telepon genggam, mengakses internet, mengaktifkan peluru kendali, tanda tangan digital, pengolahan suara digital , pengolahan video digital, pengolahan gambar/citra digital dan lain sebagainya. Semua kegiatan di atas sudah sangat umum dan rentan dengan manipulasi digital seperti pembajakan, pencurian, pelanggaran hak cipta konten media dan lain sebagainya. Beberapa teknik perlindungan terhadap manipulasi digital di atas yang telah populer sejak Perang Dunia II dan telah mengalami banyak perkembangan pesat saat ini seperti Kriptografi, Steganografi dan watermarking. Pada prinsipnya ketiga teknik yang telah disebutkan di paragraf sebelumnya adalah sama yaitu menyisipkan sesuatu berupa pesan/data ke dalam pesan/data yang lain, tetapi tujuan dari ketiganya berbeda. Kriptografi bertujuan menyembunyikan/menyisipkan pesan pada suatu media agar isi pesan tidak bisa dibaca oleh selain penerima pesan. Steganografi bertujuan

menyembunyikan/menyisipkan pesan pada suatu media agar pesan tidak bisa diketahui oleh selain penerima pesan. Watermarking bertujuan

menyembunyikan/menyisipkan pesan pada suatu media agar media yang disisipi bisa dipastikan keasliannya oleh penerima pesan.

I-1

Pada laporan tugas akhir yang menjadi referensi penulisan laporan ini, telah dibahas tentang steganografi menggunakan metode enkripsi CBC (Cipher Block Chain) dan LSB (Least Significant Bit) untuk metode penyisipan pesannya. Data steganografi yang dihasilkan mampu bertahan dari gangguan AWGN (Additive White Gaussian Noise). Dalam kasus steganografi pada tugas akhir ini adalah pesan/data disisipkan pada citra digital dan harus memenuhi sifat ketahanan (robustness). Ketahanan yang dimaksud adalah pesan/data yang disisipkan tidak terpengaruh dari upaya untuk menghilangkan atau merusak pesan/data tersebut baik sengaja atau tidak sengaja. Serangan (attack) terhadap pesan/data meliputi simple attack, detection disabling, removal dan ambiguity. Modifikasi pada citra meliputi foging, inverting, mirror, lighten, darken, rotating, addition, croping, resizing, scaling dan lain-lain dapat juga membuat kerusakan pada pesan atau data tersebut. Masalah ini sangatlah penting dalam steganografi karena pesan/data hasil steganografi tahan terhadap serangan maupun modifikasi sehingga pesan/data yang disisipkan dapat diungkapkan kembali seperti aslinya. Untuk itu diperlukan teknik steganografi yang memiliki ketergantungan terhadap arsip penampungnya. Ketergantungan ini meningkatkan keamanan pesan/data yang disisipkan karena untuk melakukan pengungkapan pesan/data diperlukan arsip penampung yang asli sebagai verfikasi. Salah satu cara yang umum untuk memperoleh ketergantungan tersebut adalah dengan menggunakan Algoritma DES (Data Encryption Standard) dan Fungsi Hash (MD5) sebagai metode enkripsi.

I-2

Berangkat dari hal tersebut maka dibuatlah Tugas Akhir dengan judul : “ANALISIS PENGGUNAAN STEGANOGRAFI DENGAN ALGORITMA DES DAN FUNGSI HASH UNTUK MENGATASI MODIFIKASI CITRA”

1.2

PERUMUSAN MASALAH Permasalahan yang dijadikan obyek penelitian dan pengembangan Tugas Akhir ini adalah sebagai berikut : 1. Pengimplementasikan Algoritma DES dan Fungsi hash dalam Mempertahankan pesan/data steganografi yang disisipkan pada citra digital. 2. Ketidaktahuan penerima citra steganografi tentang modifikasi yang terjadi pada citra hasil steganografi. 3. Pengaruh modifikasi citra pada citra digital hasil steganografi serta pesan/data yang disisipkan didalamnya. 4. Pengaruh ukuran file data/pesan yang disisipkan pada citra digital.

1.3

BATASAN MASALAH Batasan masalah dalam pengerjaan tugas akhir ini adalah : 1. Teknik enkripsi data yang digunakan adalah algoritma DES (Data Encryption Standard) dan fungsi hash (MD5). Metode penyisipan yang digunakan adalah Metode LSB (Least Significant Bit).

I-3

2. Citra yang digunakan sebagai penampung adalah citra digital berformat Bitmap dengan kedalaman 24 bit. 3. Pesan/data steganografi yang disisipkan berupa citra digital dengan format bitmap. Ukuran maksimal pesan tergantung dari ukuran citra penampung. 4. Modifikasi yang diujikan pada citra hasil steganografi antara lain fog, invert, mirror, lighten, darken.

1.4

TUJUAN PENULISAN Tujuan penulisan tugas akhir ini adalah : Membuat program dengan mengimplementasikan fungsi hash dan algoritma DES untuk mempertahankan pesan/data steganografi yang disisipkan pada arsip/berkas penampung. Membuat suatu sistem steganografi yang tahan terhadap modifikasi citra digital. Mengamati tingkat robustness sistem terhadap modifikasi citra digital dengan ukuran data/pesan steganografi yang semakin besar

berdasarkan nilai MSE dan PSNR.

1.5

METODOLOGI Dalam pengerjaan tugas akhir ini melalui beberapa tahap untuk

mendapatkan hasil yang maksimal. Langkah-langkah tersebut adalah sebagai berikut :

I-4

1. Studi literatur Studi literatur dilakukan dengan mempelajari buku, jurnal ilmiah, halaman web yang berkaitan dengan kriptografi, steganografi, Watermark digital, algoritma penyisipan dan ekstrasi pesan/data steganografi, citra digital, fungsi hash, pengujian terhadap arsip yang telah disisipi pesan/data steganografi. 2. Analisis Masalah Pada tahap ini pekerjaan yang dilakukan adalah menganalisa kebutuhan aplikasi penyisipan pesan/data steganografi terhadap arsip citra Bitmap. Juga menganalisa kebutuhan pengujian yang diperlukan untuk mengetahui kualitas pesan/data steganografi yang diekstrak. 3. Perancangan Software Pada tahap ini yang dilakukan adalah perancangan aplikasi/ software penyisipan pesan/data steganografi berdasar hasil analisa kebutuhan yang dilakukan sebelumnya, dengan menggunakan bahasa

pemograman Visual Basic 6.0. 4. Implementasi Aplikasi/software Pada tahap ini akan dilakukan pengimplementasian Aplikasi/Software penyisipan pesan/data steganografi yang telah dirancang prototipenya. 5. Pengujian dan Analisis Hasil Implementasi Tahap ini yang dilakukan adalah pengujian ketahanan pesan/data steganografi terhadap berbagai macam operasi manipulasi citra digital serta menganalisis hasil yang diperoleh.

I-5

6. Kesimpulan Setelah pengujian dan analisa dilaksanakan, maka dibuat kesimpulan mengenai program dan hasil implementasinya.

1.6

SISTEMATIKA PEMBAHASAN Sistematika yang disajikan dalam tugas akhir ini meliputi lima bab yang susunannya adalah sebagai berikut: BAB I : PENDAHULUAN Pada bab pertama berisi latar belakang masalah, rumusan masalah, tujuan, batasan masalah, dan sistematika pembahasan. BAB II : LANDASAN TEORI Bab ini membahas mengenai landasan teori dan konseptual yang akan digunakan dalam pembuatan tugas akhir. BAB III : PERANCANGAN DAN IMPLEMENTASI PROGRAM Pada bab ketiga berisi perancangan dan proses pembuatan perangkat lunak pada tugas akhir. BAB IV : PENGUJIAN DAN ANALISA PROGRAM Pada bab keempat berisi pengujian dan analisa perangkat lunak pada tugas akhir. BAB V : PENUTUP Pada bab lima berisi kesimpulan yang didapat dari pembuatan tugas akhir.

I-6

DAFTAR PUSTAKA : Pada daftar pustaka ini berisi referensi yang digunakan dalam proses pembuatan tugas akhir. LAMPIRAN : Pada halaman lampiran ini berisi listing program pada tugas akhir.

I-7

BAB II LANDASAN TEORI

Pada bab ini akan dibahas beberapa konsep dasar yang berhubungan dengan analisis penggunaan steganografi dengan algoritma DES dan fungsi Hash untuk mengatasi modifikasi citra seperti pengertian, sejarah, media, teknik enkripsi data, metode penyisipan, serta kegunaan steganografi. Kemudian dilanjutkan dengan pembahasan mengenai citra digital, algoritma DES (Data Encryption Standard) dan fungis Hash.

2.1

STEGANOGRAFI 2.1.1 Definisi Steganografi Kata steganografi berasal dari bahasa Yunani Steganos, yang artinya “tersembunyi atau terselubung” dan graphein, “menulis” sehingga kurang lebih artinya “menulis (tulisan) terselubung”[1]. Steganografi (steganography) adalah ilmu dan seni menyembunyikan pesan rahasia (hiding message) sedemikian hingga keberadaan (eksistensi) pesan tidak terdeteksi oleh indera manusia[2]. Steganografi memiliki tujuan yang sama dengan kriptografi, yaitu untuk mengamankan pesan rahasia, tapi kedua metode ini sangat berbeda. Perbedaan utamanya terletak pada hasil keluarannya. Hasil dari kriptografi biasanya berupa data yang berbeda dari bentuk aslinya dan datanya diolah berantakan namun dapat dikembalikan ke data semula. Sedangkan hasil

II-1

keluaran dari steganografi memiliki bentuk persepsi yang sama dengan bentuk aslinya. Kesamaan persepsi tersebut adalah oleh indera manusia (khususnya visual), namun bila digunakan komputer atau perangkat pengolah digital lainnya dapat dengan jelas dibedakan antara sebelum proses dan setelah proses. Gambar II.1 menunjukkan ilustrasi perbedaan antara steganografi dan kriptografi.

Gambar II.1

Ilustrasi Steganografi dan kriptografi pada citra digital[3] (a). Steganografi; (b). Kriptografi

2.1.2 Teknik Steganografi Secara garis besar, teknik penyembunyian data dengan

steganografi adalah dengan cara menyisipkan sepotong demi sepotong informasi asli pada sebuah media, sehingga informasi tersebut tampak kalah dominan dengan media yang ditumpangi. Dalam data digital, teknikteknik yang sering digunakan dalam steganografi modern yaitu :

II-2

1.

Masking dan Filtering Pada teknik masking dan filtering, informasi disembunyikan dengan

menandai suatu gambar dengan cara seperti paper watermark. Teknik watermarking dapat di aplikasikan dengan resiko rusaknya gambar dalam proses lossy compression, sebab masking dan filtering menyatu ke dalam gambar. Menurut definisinya, watermark bukanlah steganografi. Salah satu perbedaan utama adalah mengenai tujuannya. Steganografi tradisional merahasiakan informasi, sedangkan watermark meluaskan informasi dan menjadikannya suatu attribute dari gambar cover. Watermark digital dapat berupa informasi sebagai copyright, kepemilikan, atau lisensi. Dalam steganografi, objek dari komunikasi adalah pesan yang tersembunyi. Di dalam watermark digital, objek dari komunikasi adalah cover.

Gambar II-2. Gambar ter-watermark [4]

II-3

2.

Transformation Transformation adalah menyembunyikan data dalam fungsi

matematika yang disebut algoritma compression. Dua fungsi tersebut adalah Discrete Cosine Transformation (DCT) dan Wavelet

Transformation, yaitu teknik transformasi data dari satu bidang (domain) ke bidang (domain) yang lain. Fungsi DCT dan Wavelet mentransformasi data dari bidang spasial (spatial domain) ke bidang frekuensi (frequency domain). 3. Modifikasi LSB (Least-Significant Bit Modification). Teknik ini memanfaatkan bit-bit Least Significant Bit (LSB) citra penampung digital, dan menggantinya dengan bit-bit dari data rahasia. Bitbit data rahasia ini akan mengubah nilai komponen warna setiap pixel tertentu pada citra penampung, seperti yang di ilustrasikan pada gambar II-3.

Gambar II-3. Steganografi menggunakan citra digital sebagai media penampung [4]

Gambar II-4 mengilustrasikan proses penyembunyian data rahasia berupa karakter ’f’ (binary : 01100100) ke dalam citra digital, proses

II-4

steganografi berlangsung dengan cara mengganti sebagian bit komponen warna dalam tiap pixel citra digital warna 24 bit dengan bit data rahasia.

Gambar II-4. Penggantian bit LSB pada komponen warna RGB citra digital 24 bit [4]

Pada susunan bit di dalam sebuah byte (1 byte = 8 bit), ada bit paling signifikan yang disebut MSB (Most Significant Bit) dan bit yang paling kurang signifikan atau LSB (Least Significant Bit). Bit yang tepat untuk dimodifikasi adalah bit LSB, sebab penggantian hanya mengubah nilai byte tersebut satu lebih tinggi atau satu lebih rendah dari nilai sebelumnya. Misalkan byte tersebut di dalam gambar menyatakan warna tertentu, maka perubahan pada bit LSB-nya tidak mengubah warna tersebut secara signifikan. Keuntungan inilah yang dimanfaatkan dalam proses

penyembunyian data, karena mata manusia tidak dapat membedakan perubahan yang kecil pada warna.

II-5

Gambar II-5. Citra 24 bit 200x200 [4]

Sebagai contoh pada gambar II-7 setiap data pixel sudah mengandung komponen warna merah, hijau dan biru (RGB). Nilai-nilai dari bit-bit yang kurang signifikan atau LSB dari setiap byte di dalam data bitmap digantikan dengan bit-bit data yang akan disembunyikan. Jika byte tersebut merupakan komponen hijau (G), maka penggantian satu bit LSBnya hanya mengubah sedikit kadar warna hijau, dan perubahan tersebut tak terdeteksi oleh mata manusia. Ukuran data yang akan disembunyikan tergantung pada ukuran citra penampung. Pada citra 24 bit yang berukuran 200 x 200 pixel terdapat 40.000 pixel, setiap pixel berukuran 3 byte, maka ukuran data bitmap menjadi 40.000 x 3 = 120.000 byte. Jika setiap byte menyembunyikan 1 bit di LSB-nya, maka citra 24 bit dengan ukuran 200 x 200 pixel berpotensi membunyikan data rahasia di dalam citra sebesar 120.000/8 = 15.000 byte.

II-6

Untuk memperkuat dalam penyembunyian data, maka bit-bit data rahasia yang akan disembunyikan tidak langsung menggantikan bit-bit yang kurang signifikan atau LSB pada citra digital tetapi terlebih dahulu data rahasia dikodekan menjadi kode-kode yang tidak dimengerti (ciphertext) melalui algoritma kriptografi. 2.1.3 Kriteria Penyembunyian Data Kriteria yang harus diperhatikan dalam penyembunyian data rahasia dengan menggunakan citra digital sebagai berkas penampung adalah : 1. Imperceptibility Keberadaan pesan rahasia tidak dapat dipersepsi oleh inderawi. Misalnya, jika covertext berupa citra, maka penyisispan pesan membuat citra stegotext sukar dibedakan oleh mata dengan citra covertext-nya. Jika covertext berupa audio (misalnya berkas audio mp3,wav,midi, dan sebagainya), maka indera telinga tidak dapat mendeteksi perubahan audio stegotext-nya. 2. Fidelity Mutu media penampung tidak berubah banyak akibat penyisipan. Setelah penambahan data rahasia, citra hasil steganografi masih terlihat dengan baik. Pengamat tidak mengetahui kalau di dalam citra tersebut terdapat data rahasia.

II-7

3.

Recovery Pesan yang disembunyikan harus dapat diungkapkan kembali

(reveal). Karena tujuan steganografi adalah data hiding, maka sewaktu – waktu pesan rahasia di dalam stegotext harus dapat diambil kembali untuk dapat digunakan lebih lanjut.

2.2

CITRA DIGITAL Secara harfiah citra merupakan suatu representasi spasial dari suatu obyek

dalam pandangan 2 dimensi atau 3 dimensi[4]. Ditinjau dari sudut pandang matematis, citra merupakan fungsi malar (continue) dari intensitas cahaya pada bidang dua dimensi. Sumber cahaya yang menerangi objek akan memantulkan kembali sebagian dari berkas cahaya tersebut. Pantulan cahaya ini ditangkap oleh alat-alat optik, misalnya mata manusia, kamera pemindai, dan sebagainya, sehingga bayangan objek yang disebut citra tersebut terekam. Agar dapat diolah dengan komputer, maka suatu citra harus diwakili secara numerik dengan nilai-nilai diskrit. Perwakilan citra dari fungsi malar menjadi nilai-nilai diskrit disebut digitalisasi. Citra yang dihasilkan inilah yang disebut dengan citra digital. 2.2.1 Format Citra Digital Citra digital disimpan dalam berkas dengan menggunakan format tertentu. Format citra yang baku dilingkungan sistem operasi Microsoft Windows dan IBM OS/2 adalah berkas Bitmap (BMP), Joint Photographic Experts Group (JPEG), Graphics Interchange Format

II-8

(GIF) dan lain-lain. Saat ini format BMP memang tidak sepopuler format JPEG atau GIF, hal ini karena berkas BMP tidak dimampatkan sehingga ukuran datanya relatif besar daripada berkas JPEG maupun GIF. Meskipun format BMP memiliki kekurangan dari segi ukuran tetapi format BMP memiliki kelebihan dari segi kualitas gambar, karena tidak dimampatkan sehingga tidak ada informasi yang hilang. 2.2.2 Bitmap (BMP). Bitmap atau raster merupakan gambar yang tersusun atas titik-titik elemen gambar (pixel), masing-masing pixel memiliki informasi warna. Jumlah kemungkinan warna yang dapat ditampilkan oleh suatu pixel tergantung pada satuan bit yang dimiliki gambar tersebut. Sebagai contoh bitmap 4 bit, berarti pixel-pixel yang menyusunnya dapat menampilkan kombinasi warna sebanyak 24 atau 16 warna, demikian sebaliknya bitmap 8 bit yang mampu menampilkan kombinasi warna hingga 28 atau 256 warna seperti yang terlihat pada gambar II-1.

Gambar II-6. Kombinasi warna gambar 4 dan 8 bit. [4]

Berkas bitmap warna 24 bit mempunyai tiga komponen warna yaitu RGB (Red, Green, Blue). Tiap-tiap komponen tersebut terdiri 1 byte

II-9

(8 bit). Karena tiap byte memiliki kombinasi 256 warna, maka jika terdapat 3 komponen warna maka mempunyai 224 atau 16.777.216 kombinasi warna. Jika sebuah citra dengan format bitmap warna 24 bit dengan ukuran 800 x 600 maka besarnya ukuran berkas bitmap tersebut adalah (800 x 600 x 24) bit. Bitmap dengan resolusi (jumlah pixel setiap satuan ukur) besar, akan terlihat lebih halus dibandingkan dengan yang memiliki resolusi rendah. Resolusi bitmap dinyatakan dalam satuan dot per inch (dpi) atau pixel per inch (ppi).

Gambar II-7. Semut.bmp (484x484 24 bit) [4]

Struktur penyimpanan pada file bitmap terbagi menjadi tiga bagian besar seperti yang terlihat pada gambar II-8.

Gambar II-8

Struktur file bitmap. [4]

II-10

.

Bagian pertama berukuran 54 byte terletak pada bagian awal file

yang digunakan untuk menyimpan header dari file bmp. Bagian kedua berukuran 1024 byte berada setelah header dan digunakan untuk menyimpan informasi palet yang disusun dengan susunan RGB (Red, Green, Blue). Bagian ketiga adalah byte dari file BMP yang berisi informasi gambar

2.3

ALGORITMA DES DES (Data Encryption Standard) adalah algoritma cipher block yang

populer karena dijadikan standar algoritma enkripsi kunci simetri. Sebenarnya DES adalah nama standar enkripsi simetri, nama algoritma enkripsinya sendiri adalah DEA (Data Encryption Algorithm), namun nama DES lebih populer daripada DEA. Algoritma DES dikembangkan di IBM dibawah kepemimpinan W. L. Tuchman pada tahun 1972. Algoritma ini didasarkan pada algoritma

Lucifer yang dibuat oleh Horst Feistel. Algoritma ini telah disetujui oleh National Bureau of Standard (NBS) setelah penilaian kekuatannya oleh National Security Agency (NSA) Amerika Serikat[4]. DES beroperasi pada ukuran blok 64 bit. DES mengenkripsikan 64 bit Plaintext menjadi 64 bit ciphertext dengan menggunakan 48 bit kunci internal (internal key) atau upa-kunci (subkey). Kunci internal dibangkitkan dari kunci eksternal (external key) yang panjangnya 64 bit.

II-11

Blok Plaintext

IP 16 kali
Enciphering

IP-1

Blok Ciphertext
Gambar II-9. Skema Global Algoritma DES[5]

Skema global dari algoritma DES adalah sebagai berikut : 1. Blok Plaintext dipermutasi dengan matriks permutasi awal (initial permutation atau IP). 2. Hasil permutasi awal kemudian di-enciphering sebanyak 16 kali (16 putaran). Setiap putaran menggunakan kunci internal yang berbeda. 3. Hasil enciphering kemudian dipermutasi dengan matriks permutasi balikan (invers Initial Permutation atau IP-1) menjadi blok ciphertext. Di dalam proses enciphering, blok plaintext terbagi menjadi dua bagian, kiri (L) dan kanan (R), yang masing-masing panjangnya 32 bit. Kedua bagian ini masuk ke dalam 16 putaran DES. Pada setiap putaran i, blok R merupakan masukan untuk fungsi transformasi yang disebut f. Pada fungsi f, blok R dikombinasikan dengan kunci internal Ki. Keluaran dari fungsi f di-XOR-kan dengan blok L untuk mendapatkan blok R sebelumnya. Ini adalah satu putaran DES. Secara matematis, satu putaran DES dinyatakan sebagai :

II-12

Li = Ri – 1 Ri = Li – 1 ⨁ f(Ri – 1, Ki)

(2-1) (2-2)

. Satu putaran DES merupakan model jaringan Feistel (lihat Gambar II-10). Li – 1 Ri – 1 f

K
1

Li

Ri

Gambar II-10. Jaringan Feistel untuk satu putaran DES [5]

Perlu dicatat dari Gambar II-11 bahwa jika (L16, R16) merupakan keluaran dari putaran ke-16, maka (L16, R16) merupakan pre-ciphertext dari enciphering ini. Ciphertext yang sebenarnya diperoleh dengan melakukan melakukan permutasi awal balikan, IP-1 terhadap blok pre - ciphertext.

II-13

Plaintext

IP

L0

R0

f

K1

L1 = R0

R1 = L 0 ⨁ f ( R 0 , K 1 ) f K2

L2 = R1

R2 = L 1 ⨁ f ( R 1 , K 2 )

L15 = R14

R15 = L14 ⨁ f( R14 , K15 ) f K16

R16 = L15 ⨁ f( R15 , K16 ) IP-1

L16 = R15

Ciphertext

Gambar II-11. Algoritma enkripsi dengan DES permutasi awal [5]

II-14

2.4

FUNGSI HASH 2.4.1 Definisi Fungsi Hash Fungsi Hash adalah fungsi yang memetakan pesan berupa string biner dengan panjang sembarang menjadi string biner dengan panjang tetap[6]. Keluaran dari fungsi hash disebut nilai hash (hash value). Fungsi hash biasa digunakan untuk memeriksa keaslian sebuah salinan arsip digital dengan cara membandingkan nilai hash-nya dengan nilai hash arsip asli yang sudah diketahui. Sebuah fungsi hash H harus memenuhi sifatsifat berikut ini: 1. Menerima masukan x yang panjang sembarang dan menghasilkan keluaran H(x) yang panjangnya tetap. 2. Untuk setiap nilai masukan x, nilai hash H(x) mudah dihitung. Selain dua sifat di atas, sebuah fungsi hash H harus memiliki sifatsifat berikut ini : 1. Untuk nilai hash h yang dihasilkan, tidak mungkin mencari nilai x sehingga H(x) = h. 2. Untuk setiap nilai x, tidak mungkin mencari nilai y ≠ x sehingga H(y) = H(x). Beberapa contoh fungsi hash adalah MD2, MD4, MD5, Snefru, Nhash, SHA, dan lain-lain. Secara umum, dalam fungsi hash sebuah pesan masukan dibagibagi ke dalam blok-blok yang berukuran sama. Fungsi hash dilakukan kepada setiap blok pesan dengan masukan blok pesan dan hasil blok hash

II-15

sebelumnya (lihat Gambar II-12). Jika hi adalah keluaran fungsi hash untuk blok ke-i dan Mi menyatakan blok pesan ke-i, maka fungsi hash satu arah dapat dinotasikan sebagai berikut :

Mi hi-1

Fungsi hash

hi

Gambar II-12. Fungsi hash [6]

2.4.2 Algoritma MD5 MD5 merupakan fungsi hash yang menghasilkan nilai hash sebesar 128 bit. Algoritma ini merupakan hasil perbaikan dari algoritma MD4. Dalam algoritma MD5, masukan diproses dalam blok-blok berukuran 512 bit yang dibagi lagi menjadi 16 blok yang masing-masing berukuran 32bit. Masing-masing blok data dilibatkan dalam proses yang berjumlah empat putaran seperti yang diperlihatkan pada Gambar II-13. A, B, C, dan D pada gambar adalah penyangga yang digunakan untuk menampung hasil sementara dan hasil akhir.

II-16

Blok Pesan

A B C D

Putaran 1

Putaran 2

Putaran 3

Putaran 4

A B C D

Gambar II-13. Proses dalam algoritma MD5

2.4.3 Parameter Pengukuran Kualitas Citra Dalam proses pengolahan citra, pengukuran kualitas gambar (image quality) digunakan pendekatan perkiraan kualitas distorsi secara matematis yaitu MSE (Mean Square Error) dan PSNR (Peak Signal to Noise Ratio)[1]. Parameter PSNR umumnya digunakan dalam dunia

pengolahan citra, karena memuat nilai perbandingan antara nilai masukan pada derajat keabuan tertinggi secara umum yaitu 255 dan error (perbedaan nilai keabuan antara citra masukan dan keluaran). PSNR dihitung dengan persamaan[1] :

= 10 × log

(2-3)

Dengan MSE dihitung melalui persamaan[7] :

=

×

(

,

, )

(

,

, )

(

,

, )

(2-4)

II-17

Dimana : N M RPi,j : Panjang citra : Lebar citra : Warna merah pada pixel baris i kolom j pada citra asli

RQi,j : Warna merah pada pixel baris i kolom j pada citra setelah dimodifikasi GPi,j : Warna hijau pada pixel baris i kolom j pada citra asli GQi,j : Warna hijau pada pixel baris i kolom j pada citra setelah dimodifikasi BPi,j : Warna biru pada pixel baris i kolom j pada citra asli

BQi,j : Warna biru pada pixel baris i kolom j pada citra setelah dimodifikasi

Nilai MSE = 0 merupakan nilai titik konvergensi, namun dalam prakteknya tidak pernah dicapai nilai MSE = 0. Pada umumnya, suatu citra terekontruksi dikatakan mencapai titik konvergensi bilai nilai MSE mendekati nol. Jika nilai MSE mendekati nol, berarti nilai PSNR semakin besar. Ini berarti semakin besar nilai PSNR maka semakin bagus kualitas citra terekontruksi.

II-18

BAB III PERANCANGAN DAN IMPLEMENTASI PROGRAM

Perancangan bertujuan agar dalam pembuatan program dapat berjalan secara sistematis, terstruktur, dan terarah sehingga hasil program dapat optimal dan berjalan sesuai dengan apa yang dikehendaki. Dalam perancangan, yang perlu diperhatikan adalah kemampuan program, efektifitas, efisiensi, dan kemudahan untuk dipahami pengguna (user friendly) yang diwujudkan dalam tampilan grafis (Graphical User Interface).

3.1

SPESIFIKASI SISTEM Sistem dikembangkan dengan spesifikasi perangkat keras dan perangkat

lunak seperti dijelaskan pada tabel III-1 dan III-2.

Tabel III-1. Spesifikasi Perangkat Keras Jenis Perangkat Processor Memory Hard disc Spesifikasi Intel® Core TM 2 Duo CPU T6600 @ 2.20 GHz (2 CPU) 2048 MB 320 GB

Tabel III-2. Spesifikasi Perangkat Lunak Sistem Operasi Windows XP SP 2

Bahasa Pemrograman Visual Basic 6.0

III-1

3.2

DIAGRAM BLOK SISTEM Diagram blok sistem secara umum dapat digambarkan pada gambar III-1.

Citra Rahasia

Enkripsi
(DES & MD5)

Citra Asli (Penampung)

Proses Penyisipan

Hasil Steganografi

Proses Modifikasi

Citra Rahasia

Proses Dekripsi

Hasil Modifikasi Steganografi

Gambar III-1. Diagram blok sistem

Pada penulisan skripsi ini, program dibuat dalam sebuah sistem yang terdiri dari beberapa blok dengan fungsi yang spesifik. Diagram blok sistem menggambarkan proses kerja sistem mulai dari masukan sampai keluaran, yang dapat dijelaskan secara umum sebagai berikut : 1. Citra digital dengan format bitmap 24 bit disiapkan sebagai penampung data rahasia yang akan disisipkan. 2. Pesan rahasia atau disebut juga dengan plaintext terlebih dahulu di enkripsi untuk memberikan jaminan integritas dan kerahasiaan

III-2

informasi, metode enkripsi yang digunakan

adalah

Data Encryption

Standard (DES) dan fungsi hash (MD5). Hasil enkripsi disebut dengan ciphertext. 3. Proses selanjutnya adalah penggantian bit-bit pada berkas penampung (berupa citra digital dengan format bitmap 24 bit) dengan bit-bit ciphertext. Keluaran dari proses ini disebut dengan hasil steganografi. 4. Hasil steganografi kemudian disimulasikan dengan berbagai proses modifikasi. 5. Hasil steganografi yang telah mengalami proses modifikasi akan didekripsi. Proses dekripsi ini berfungsi untuk mengambil ciphertext yang terkandung dalam hasil steganografi. Hasil proses dekripsi yaitu plaintext atau pesan rahasia yang semula disembunyikan.

3.3

PERANCANGAN DIAGRAM ALIR Perancangan diagram alir dimaksudkan untuk menggambarkan urutan dan

tahap pembuatan program serta memperjelas penggunaannya. Perancangan diagram alir program terdiri atas perancangan diagram alir menu utama, program enkripsi dan program dekripsi. 3.3.1 Perancangan Diagram Alir Menu Utama Diagram alir menu utama menggambarkan urutan penggunaan program dengan menu-menu yang tersedia, yang menghubungkan ke pilihan-pilihan yang akan ditampilkan. Diagram alir menu utama program

III-3

analisis pengunaan steganografi denagn algoritma DES dan fungsi Hash untuk mengatasi modifikasi citra ditunjukkan pada Gambar III-2.
Mulai

Pilih Menu

Enkripsi

Dekripsi

Tampilan Form Enkripsi

Tampilan Form Dekripsi

Exit

T

Y
Keluar

Gambar III-2. Diagram Alir Menu Utama

Pada Gambar III-2 dapat dijelaskan bahwa pada saat program dijalankan akan ditampilkan menu utama pada form Menu Utama yang terdiri atas tiga pilihan menu yang bisa dipilih untuk ditampilkan. Pilihan menu tersebut terdiri atas pilihan Enkripsi untuk masuk ke form Enkripsi (proses penyembunyian data), pilihan Dekripsi untuk masuk ke form

III-4

Dekripsi (proses pengungkapan data) dan pilihan Keluar yaitu untuk keluar dari program. 3.3.2 Perancangan Diagram Alir Program Enkripsi Diagram alir program enkripsi menggambarkan urutan penggunaan menu yang tersedia pada form Enkripsi. Diagram alir program enkripsi terbagi menjadi beberapa bagian yang saling berhubungan. Untuk bagian yang pertama adalah diagram alir pengambilan citra yang digunakan sebagai berkas penampung, seperti yang terlihat pada Gambar III-3.
Mulai

Memilih citra penampung

Menampilkan citra penampung

A

`

Gambar III-3. Diagram alir memilih citra penampung

Pada Gambar III-3 terlihat bahwa proses dimulai dengan memilih citra penampung. Citra penampung yang akan dipilih berformat bitmap. Citra penampung yang telah dipilih akan ditampilkan pada form.

III-5

Bagian yang kedua adalah diagram alir untuk proses pemilihan citra yang akan disisipkan, seperti yang terlihat pada Gambar III-4.

Mulai

Memilih citra pesan

Manghitung maksimal data citra pesan yang disisipkan

Data maks > citra pesan

T

Y
Menampilkan citra pesan

B

Gambar III-4. Diagram alir memilih citra pesan yang disisipkan

Pada Gambar III-4 terlihat proses pemilihan citra pesan. Citra pesan yang akan disisipkan berformat bitmap. Setelah dipilih, maka program akan menghitung ukuran citra pesan. Jika daya tampung maksimal lebih besar dari ukuran citra pesan yang akan disisipkan maka citra pesan akan ditampilkan pada form.

III-6

Bagian yang ketiga adalah diagram alir proses penyisipan citra pesan steganografi menggunakan fungsi hash (MD5) dan algoritma DES. Diagram alirnya ditunjukkan pada gambar III-5.
Mulai

A B
Pemrosesan dengan fungsi hash (MD5)

Membaca nilai RGB dalam tiap pixel

Output berupa nilai hexadesimal Merubah nilai Hexadesimal ke biner

Pemrosesan dengan Algoritma DES

Ciphertext disisipkan ke komponen tiap RGB

Merubah Biner ke Hexadesimal

T

Simpan citra

Y
Menampilkan citra yang mengandung citra pesan

C

Gambar III-5. Diagram alir proses penyisipan citra pesan

III-7

Diagram alir pada Gambar III-5 memperlihatkan proses penyisipan citra pesan menggunakan fungsi hash (MD5) dan algoritma DES. Proses ini yang pertama dilakukan adalah mengambil nilai dari komponen warna citra penampung dalam tiap-tiap pixel dan mengubahnya ke nilai hexadesimal, kemudian diubah dalam bentuk biner. Sebagai contoh, jika ada suatu komponen warna bernilai 164 diubah menjadi A4 dalam bentuk hexadesimal, kemudian diubah ke bentuk biner menjadi 10100100. Sementara itu citra pesan yang akan disisipkan diproses terlebih dahulu menggunakan fungsi hash (MD5). Pesan dibagi menjadi L buah blok yang masing-masing panjangnya 512 bit. Setiap blok 512 bit diproses bersama dengan penyangga MD menjadi keluaran 128 bit. Output proses fungsi hash (MD5) kemudian masuk ke proses enkripsi DES. Blok data yang berukuran 128 bit dibagi menjadi dua bagian yaitu 64 bit plaintext dan 64 bit kunci. Blok pesan inilah yang diolah dalam proses enkripsi DES seperti yang telah dijelaskan pada sub bab 2.3. Kemudian bit pertama ciphertext yang ingin disisipkan kedalam berkas bitmap dimasukkan dalam

komponen warna merah, bit berikutnya dalam komponen warna hijau, bit berikutnya lagi dalam komponen warna biru pada pixel pertama. Satu bit ciphertext berikutnya dimasukkan dalam komponen warna merah, bit berikutnya lagi dimasukkan pada komponen warna hijau, bit berikutnya lagi dimasukkan pada komponen warna biru pada pixel kedua. Begitu seterusnya sampai ciphertext bit yang terakhir. Setelah selesai proses penyisipan maka selanjutnya adalah menampilkan citra hasil pada form.

III-8

Bagian keempat adalah diagram alir untuk proses modifikasi citra hasil steganografi. Diagram alir dari proses modifkasi ditunjukkan pada Gambar III-6.
Mulai

C

Membaca nilai RGB dalam tiap pixel

Modifikasi nilai RGB ditiap pixel

Write nilai RGB ditiap pixel

Menampilkan citra hasil modifkasi

T

Simpan citra

Y
Selesai

Gambar III-6. Diagram alir proses modifikasi Diagram alir pada Gambar III-6 memperlihatkan proses modifikasi citra steganografi. Pada proses ini yang pertama dilakukan adalah menmbaca nilai dari komponen warna citra steganografi dalam tiap-tiap

III-9

pixel. Masing-masing komponen warna kemudian dimodifkasi sesuai dengan pilihan modifkasi yang dilakukan. Hasil modifikasi tiap pixel akan di-write kembali dan ditampilkan pada form. Kemudian menentukan apakah citra hasil modifikasi akan disimpan atau tidak. 3.3.3 Perancangan Diagram Alir Program Dekripsi Diagram alir program dekripsi menjelaskan tentang proses yang terjadi pada form Dekripsi. Diagram alir program dekripsi terbagi dalam beberapa bagian yang saling berhubungan. Bagian pertama adalah diagram alir proses pengambilan citra termodifikasi dan menampilkannya pada form Dekripsi. Diagram alirnya ditunjukkan pada Gambar III-7.
Mulai

Memilih citra termodifikasi

Menampilkan citra termodifikasi

D

Gambar III-7. Diagram alir memilih citra termodifikasi

Pada Gambar III-7 terlihat proses pemilihan citra termodifikasi. Citra termodifikasi yang dipilih akan ditampilkan pada form.

III-10

Bagian kedua adalah diagram alir dekripsi citra pesan yaitu proses untuk mendekripsi citra pesan rahasia yang berbentuk ciphertext yang ada didalam citra penampung. Diagram alirnya ditunjukkan pada Gambar III-8
Mulai

D

Membaca struktur file bitmap

Deteksi modifikasi

Terdeteksi

T

Y
Remodifikasi Membaca nilai RGB dalam tiap pixel

Output berupa nilai hexadesimal Merubah nilai hexadesimal ke biner

Mengekstrak Pesan

Simpan citra

T

Y
Menampilkan citra pesan

Selesai

Gambar III-8. Diagram alir dekripsi citra pesan

III-11

Diagram alir pada Gambar III-8 memperlihatkan proses dekripsi citra pesan. Pada proses ini yang pertama dilakukan adalah membaca struktur file bitmap. Kemudian deteksi modifikasi dilakukan untuk mendeteksi modfikasi yang dilakukan terhadap citra hasil steganografi. Apabila jenis modifikasi yang dilakukan telah terdeteksi, perlu dilakukan proses remodifikasi. Dalam proses remodifikasi terjadi proses manipulasi citra termodifikasi agar citra pesan didalamnya dapat diekstrak kembali. Alur selanjutnya adalah proses ekstaksi pesan. Awal proses ekstraksi pesan adalah membaca nilai dari komponen warna citra penampung dalam tiap-tiap pixel yang berbentuk hexadesimal. Nilai hexadesimal tersebut diubah ke dalam bentuk biner. Bit-bit terakhir dalam setiap nilai pixel diinisialisasi kembali dengan fungsi hash (MD5) dan DES untuk mengekstrak citra pesan yang disisipkan. Kemudian menentukan citra pesan disimpan atau tidak setelah citra tersebut diekstrak. Proses terakhir adalah menampilkan citra pesan yang telah diekstrak.

3.4

IMPLEMENTASI PROGRAM Implementasi adalah dari perancangan program yang telah dibuat. 3.4.1 Implementasi Menu Utama Progam menu utama menampilkan judul tugas akhir, kolom identitas, tombol enkripsi, tombol dekripsi dan tombol keluar. Tampilan GUI untuk menu utama ditunjukkan pada gambar III-9.

III-12

Gambar III-9. Tampilan GUI Menu Utama

Pada gambar III-9 terdapat tiga tombol yaitu tombol enkripsi untuk menampilkan sub program enkripsi, tombol dekripsi untuk menampilkan sub program dekripsi dan tombol keluar untuk keluar dari program. 3.4.2 Implementasi Sub Program Enkripsi Sub program enkripsi terdiri dari beberapa tombol fungsi untuk menampilkan proses steganografi, simulasi modifikasi citra steganografi. Terdapat pula tombol pilihan untuk menampilkan histogram citra, perbandingan pixel citra sebelum dan sesudah proses steganografi serta perhitungan MSE (Means Square Error) dan PSNR (Pseudo Signal to

III-13

Noise Ratio). Tampilan GUI program enkripsi ditunjukkan pada gambar III-10.
14

1

3

4

5 7 8

2 11 12

6 10 9 13 9

Gambar III-10. Tampilan GUI Sub Program Enkripsi

Gambar III-10 menampilkan sub program enkripsi yang terdiri dari beberapa langkah proses yaitu : 1. Memilih citra penampung dengan meng-klik tombol Buka Citra Penampung. Citra yang dipilih akan ditampilkan pada PictureBox Citra Penampung. Tombol Histogram 1 dan Buka Citra Pesan diaktifkan.

III-14

2. Setelah citra penampung dipilih (langkah 1), tombol Histogram 1 diaktifkan. Tombol ini berfungsi menampilkan histogram dari citra penampung seperti pada gambar III-11 di bawah ini :

a b

Gambar III-11. Tampilan GUI Histogram Keterangan : a. Memilih warna yang akan ditampilkan histogramnya b. Memilih bentuk kurva (garis atau grafik penuh)

3. Memilih citra pesan yang akan disisipkan dengan meng-klik tombol Buka Citra Pesan. Citra yang dipilih akan ditampilkan pada PictureBox Citra Pesan. Citra pesan dapat ditambah dengan mengklik kembali tombol Buka Citra Pesan (berubah jadi Tambah Citra Pesan) dengan syarat akumulasi ukuran dari keseluruhan citra pesan yang telah dipilih tidak melebihi batas maksimum ukuran citra pesan yang dapat ditambahkan. Tombol Hapus Citra Pesan dan tombol

III-15

Sisipkan File diaktifkan. Tombol Buka Citra Penampung dinonaktifkan. 4. Citra pesan yang telah dipilih dapat dihapus (misalkan untuk mengganti dengan citra pesan lain, tentunya kembali ke langkah 2) dengan menekan tombol Hapus Citra Pesan. Tombol ini akan dinonaktifkan apabila semua citra pesan yang dipilih telah dihapus. 5. Setelah citra penampung dan citra pesan telah dipilih, maka proses penyisipan citra pesan ke dalam citra penampung dijalankan dengan meng-klik tombol Sisipkan Pesan. Proses ini membutuhkan waktu untuk memproses citra penampung dan citra pesan agar bisa dapat digabungkan. Citra hasil proses steganografi ditampilkan pada PictureBox Citra Hasil Steganografi. Tombol Buka Citra Pesan dan Hapus Citra Pesan dan Sisipkan Pesan dinon-aktifkan. Tombol Histogram 2, Pixel 1, MSE 1 dan PSNR 1 serta tombol-tombol untuk simulasi modifikasi citra (Invert, Fog, Mirror Horizontal, Mirror Vertikal, Lighten, dan Darken) diaktifkan. 6. Setelah proses penyisipan citra pesan selesai, citra yang dihasilkan akan ditampilkan pada PictureBox Citra Hasil Steganografi akan muncul save dialog untuk menyimpan citra hasil steganografi tersebut. Tombol Histogram 2 berfungsi untuk menampilkan histogram dari citra tersebut seperti pada Gambar III-11. 7. Perbandingan nilai RGB (Red, Green, Blue) citra penampung dengan citra hasil steganografi ditampilkan dengan meng-klik tombol Pixel 1.

III-16

Nilai-nilai RGB (Red, Green, Blue) yang ditampilkan adalah nilai-nilai yang berubah. Dalam fungsi ini perbandingannya dilakukan dari kiri ke kanan kemudian dari atas ke bawah. Tampilan GUI perbandingan pixel seperti pada gambar III-12.

a

Gambar III-12. Tampilan GUI Perbandingan Pixel Keterangan : a. Memilih jenis warna (RGB dan Luminance) yang akan ditampilkan nilainya yang berbeda di setiap pixel.

8. Untuk menampilkan nilai MSE dan PSNR antara citra penampung dan citra hasil steganografi dengan meng-klik tombol MSE 1 dan PSNR 1. 9. Untuk menjalankan proses simulasi modifikasi citra hasil steganografi dengan meng-klik tombol-tombol Invert, Fog, Mirror Horizontal, Mirror Vertikal, Lighten dan Darken. Khusus untuk modifikasi Lighten, Darken dan Fog akan muncul kotak input untuk

III-17

memasukkan nilai sebagai pengubah komposisi RGB pada citra. Hasil dari modifikasi akan ditampilkan pada PictureBox Citra Steganografi Termodifikasi. Tombol Histogram 3, Pixel 2, MSE 2, PSNR 2 dan Simpan Citra Termodifikasi diaktifkan. 10. Setelah proses simulasi modifikasi citra steganografi selesai, citra yang dihasilkan akan ditampilkan pada PictureBox Citra Steganografi Termodifikasi. Tombol Histogram 3 berfungsi untuk menampilkan histogram dari citra tersebut seperti pada Gambar III-11. 11. Perbandingan nilai RGB (Red, Green, Blue) citra steganografi dengan citra steganografi termodifikasi ditampilkan dengan meng-klik tombol Pixel 2. Nilai-nilai RGB (Red, Green, Blue) yang ditampilkan adalah nilai-nilai yang berubah. Dalam fungsi ini perbandingannya dilakukan dari kiri ke kanan kemudian dari atas ke bawah. Tampilan GUI perbandingan pixel seperti pada gambar III-12. 12. Untuk menampilkan nilai MSE dan PSNR antara citra steganografi dan citra steganografi termodifikasi dengan meng-klik tombol MSE 2 dan PSNR 2. 13. Untuk menyimpan hasil modifikasi citra steganografi dengan mengklik tombol Simpan Citra Termodifikasi. 14. Untuk keluar dari sub program enkripsi dan kembali ke Menu Utama dengan meng-klik tombol Selesai.

III-18

3.4.3 Implementasi Sub Program Dekripsi Sub program dekripsi terdiri dari beberapa tombol fungsi untuk menampilkan proses deteksi pesan steganografi, deteksi modifikasi citra steganografi dan ekstraksi pesan steganografi. Terdapat pula tombol pilihan untuk menampilkan histogram citra, perbandingan pixel citra pesan asli dan pesan hasil dekripsi serta perhitungan MSE (Means Square Error) dan PSNR (Pseudo Signal to Noise Ratio). Tampilan GUI program dekripsi ditunjukkan pada gambar III-13.

10 6

1

2 4 3 3 8 9

7 5

Gambar III-13. Tampilan GUI Sub Program Dekripsi

III-19

Gambar III-13 menampilkan sub program dekripsi yang terdiri dari beberapa langkah proses yaitu : 1. Memilih citra yang dianggap citra hasil steganografi dengan meng-klik tombol Buka Citra. Citra yang dipilih akan ditampilkan pada PictureBox Citra Hasil Steganografi. Tombol Histogram 1 dan Deteksi Modifikasi diaktifkan. 2. Untuk mendeteksi metode modifikasi yang telah dilakukan pada citra hasil steganografi dengan meng-klik tombol Deteksi Modifikasi. Proses yang terjadi adalah pembandingan nilai RGB pada Pixel gambar yang dipilih dengan gambar citra penampung. Tombol yang diaktifkan adalah salah satu tombol remodifikasi (Invert, Fog, Mirror Horizontal, Mirror Vertikal, Lighten, Darken). 3. Setelah proses deteksi modifikasi selesai dan klik tombol modifikasi yang diaktifkan untuk memanipulasi citra hasil steganografi agar citra pesan yang disisipkan dapat di ekstrak. Setelah Proses yang lumayan lama, maka tombol Ekstrak Pesan diaktifkan . 4. Klik tombol Ekstrak Pesan untuk mengekstrak pesan dari citra hasil steganografi. Citra hasil ekstraksi ditampilkan pada PictureBox Citra Hasil Recovery dan akan muncul save dialog untuk menyimpan citra hasil ekstraksi tersebut. Tombol Buka diaktifkan. tombol Ekstrak Pesan dinon-aktifkan. 5. Setelah proses Ekstraksi pesan selesai, citra yang dihasilkan akan ditampilkan pada PictureBox Citra Hasil Ekstraksi. Tombol

III-20

Histogram 2 berfungsi untuk menampilkan histogram dari citra tersebut seperti pada Gambar III-14.

a b

Gambar III-14. Tampilan GUI Histogram Keterangan : a. Memilih warna yang akan ditampilkan histogramnya b. Memilih bentuk kurva (garis atau grafik penuh)

6. Untuk membandingkan citra hasil recovery dengan citra pesan asli maka citra pesan asli yang disisipkan dibuka dengan menekan tombol Buka. Tombol Histogram 1, Pixel, MSE dan PSNR diaktifkan. 7. Setelah tombol buka di klik, citra pesan asli akan ditampilkan pada PictureBox Citra Asli Yang Disisipkan. Tombol Histogram 1 berfungsi untuk menampilkan histogram dari citra tersebut seperti pada Gambar III-14.

III-21

8. Perbandingan nilai RGB (Red, Green, Blue) citra pesan asli dengan citra hasil recovery ditampilkan dengan meng-klik tombol Pixel. Nilainilai RGB (Red, Green, Blue) yang ditampilkan adalah nilai-nilai yang berubah. Dalam fungsi ini perbandingannya dilakukan dari kiri ke kanan kemudian dari atas ke bawah. Tampilan GUI perbandingan pixel seperti pada gambar III-15.

a

Gambar III-15. Tampilan GUI Perbandingan Pixel Keterangan : a. Memilih jenis warna (RGB dan Luminance) yang akan ditampilkan nilainya yang berbeda di setiap pixel. 9. Untuk menampilkan nilai MSE dan PSNR antara citra asli yang disisipkan dan citra hasil recovery dengan meng-klik tombol MSE dan PSNR. 10. Untuk keluar dari sub program dekripsi dan kembali ke Menu Utama dengan meng-klik tombol Selesai.

III-22

BAB IV
PENGUJIAN DAN ANALISA PROGRAM

Bab ini membahas hasil implementasi program dan hasil-hasil percobaan modifikasi citra. Pengujian meliputi pengaruh ukuran citra pesan pada citra hasil steganografi, pengaruh modifikasi pada citra hasil dekripsi, quality (MSE dan PSNR) . image measure

4.1

PENGUJIAN PROGRAM Pada bagian ini akan dijelaskan mengenai hasil pengujian proses

steganografi citra digital yang dimofikasi. Citra pesan yang digunakan berupa citra digital *.bmp. Parameter yang digunakan dalam pengujian ditampilkan dalam Tabel IV.1

Tabel IV-1 Parameter yang Digunakan dalam Pengujian Citra Penampung Monalisa.bmp (783 x 1050) pixel Banana.bmp (292 x 287) pixel Citra Pesan Treasuremap.bmp (300 x 222) pixel Twins.bmp (179 x 214) pixel 2,35 MB 245 KB 195 KB 112 KB

4.1.1 Analisa Penyisipan Citra Pesan pada Citra Penampung Pengujian dilakukan dengan menyisipkan tiga citra pesan yang memiliki ukuran berbeda-beda untuk melihat pengaruh proses penyisipan

IV-1

pesan terhadap perubahan nilai pixel, histogram serta nilai MSE dan PSNR. Berdasarkan penelitian yang dilakukan, diperoleh data-data hasil penelitian yang ditunjukkan pada Gambar IV-1. Gambar IV-1(a) menunjukan citra penampung sebelum proses steganografi dilakukan.

Gambar IV-1(b), Gambar IV-1(c), dan Gambar IV-1(d) berturut-turut menunjukan citra hasil steganografi yang telah mengandung citra pesan Banana.bmp, Treasuremap.bmp, dan Twins.bmp.

(a)

(b)

(c)

(d)

Gambar IV-1. Perbandingan Pengaruh Penyisipan Citra Pesan Terhadap Citra Penampung (a) Citra Penampung; (b) Hasil Steganografi dengan Citra Pesan Banana.bmp; (c) Hasil Steganografi dengan Citra Pesan Treasuremap.bmp; (d) Hasil Steganografi dengan Citra Pesan Twins.bmp

Berdasarkan pengamatan visual pada serangkaian citra pada Gambar IV-1, tidak terjadi perubahan yang signifikan terhadap citra penampung yang telah disisipkan citra pesan. Oleh karena itu, untuk melihat

perubahan yang terjadi perlu ditinjau dari histogram, perubahan nilai pixel, serta nilai MSE dan PSNR. Gambar IV-2 menunjukkan perbandingan

IV-2

histogram antara citra penampung sebelum dan setelah penyisipan citra pesan Banana.bmp, Treauremap.bmp, dan Twins.bmp dilakukan.

(a)

(b)

(c)

(d)

Gambar IV-2. Perbandingan Histogram (a) Histogram Citra Penampung; (b) Histogram Hasil Steganografi dengan Citra Pesan Banana.bmp; (c) Histogram Hasil Steganografi dengan Citra Pesan Treasuremap.bmp; (d) Histogram Hasil Steganografi dengan Citra Pesan Twins.bmp

IV-3

Gambar IV-2 menunjukkan bahwa masing-masing citra memiliki histogram yang berbeda satu sama lain. Histogram tersebut menunjukkan perbandingan antara jumlah pixel dan level warna pada citra penampung. Selanjutnya Gambar IV-3, Gambar IV-4, dan Gambar IV-5

memperlihatkan seratus sampel perubahan nilai pixel pada warna merah sebelum dan setelah penyisipan citra pesan Banana.bmp,

Treauremap.bmp, dan Twins.bmp dilakukan.

Gambar IV-3. Perubahan nilai pixel pada warna merah sebelum dan setelah penyisipan citra pesan Banana.bmp

IV-4

Gambar IV-4. Perubahan nilai pixel pada warna merah sebelum dan setelah penyisipan citra pesan Treasuremap.bmp

Gambar IV-5. Perubahan nilai pixel pada warna merah sebelum dan setelah penyisipan citra pesan Twins.bmp

IV-5

Dari Gambar IV-3, Gambar IV-4, dan Gambar IV-5 terlihat bahwa terjadi perubahan nilai-nilai pixel citra penampung pada koordinat tertentu setelah disisipkan citra pesan. Setiap citra penampung yang disisipkan dengan ketiga citra pesan tersebut memiliki perubahan nilai pixel pada koordinat yang berbeda-beda. Hal ini membuktikan bahwa penyisipan citra pesan pada citra penampung terjadi secara random (acak). Parameter selanjutnya yang dapat digunakan untuk mengamati perubahan yang terjadi pada citra penampung adalah nilai MSE dan PSNR. Nilai MSE dan PSNR citra hasil steganografi terhadap citra penampung ditampilkan dalam Tabel IV-2.

Tabel IV-2. MSE dan PSNR Citra hasil steganografi dengan citra pesan berbeda Citra Pesan yang MSE PSNR (dB) Disisipkan Banana.bmp Treasuremap.bmp Twins.bmp 1,263E-03 8,957E-04 2,809E-04 38,559 39,305 41,822

Dari data yang ditampilkan dalam Tabel IV-2, terlihat bahwa semakin kecil ukuran citra pesan yang disisipkan maka semakin baik citra staganografi yang dihasilkan. 4.1.2 Pengaruh Modifikasi Terhadap Citra Hasil Steganografi Pada bagian ini akan diamati bagaimana pengaruh modifikasi terhadap citra hasil steganografi. Kemudian menghitung nilai MSE dan PSNR citra hasil steganografi termodifikasi. Parameter yang digunakan

IV-6

dalam pengujian ini adalah citra hasil steganografi yang telah disisipkan citra pesan Banana.bmp. Citra hasil steganografi yang telah termodifikasi dengan berbagai jenis modifikasi ditunjukkan pada Gambar IV-6.

(a)

(b)

(c)

(d)

(e)

(f)

Gambar IV-6. Perubahan nilai pixel pada warna merah sebelum dan setelah penyisipan citra pesan Twins.bmp (a) Hasil Modifikasi Invert; (b) Hasil Modifikasi Darken; (c) Hasil Modifikasi Lighten; (d) Hasil Modifikasi Fog; (e) Hasil Modifikasi Mirror Horizontal; (f) Hasil Modifikasi Mirror Vertical

Gambar IV-6 (a) menunjukkan hasil modifikasi invert. Modifikasi ini dilakukan dengan membalik level warna awal RGB dalam tiap komponen pixel. Modifikasi selanjutnya yang ditunjukkan pada bagian (b) adalah modifikasi darken. Jenis modifikasi ini mengurangi level warna

IV-7

RGB mendekati nilai 0 sesuai dengan nilai modifikasi pengubah yang dimasukkan. Bagian (c) merupakan kebalikan dari darken yaitu lighten. Pada modifikasi ini level warna RGB ditambah mendekati nilai 255 sesuai dengan nilai pengubah yang dimasukkan. Selanjutnya adalah modifikasi fog, yang menambahkan dan mengurangi nilai RGB agar mendekati nilai keabuan yaitu 127. Jika nilai awal pixel lebih kecil dari 127, maka nilainya akan ditambahkan dengan nilai modifikasi pengubah yang dimasukkan, begitu pula sebaliknya. Gambar IV-6 bagian (e) dan (f) adalah jenis modifikasi yang merubah posisi RGB sesuai dengan jenis modifikasi yang dilakukan. Besarnya perubahan yang terjadi pada citra hasil steganografi setelah dimodifikasi dapat diamati pada nilai MSE dan PSNR yan ditampilkan pada Tabel IV-3.

Tabel IV-3. MSE dan PSNR Citra Hasil Modifikasi Jenis modifikasi yang MSE PSNR (dB) dilakukan Invert Darken Lighten Fog Mirror Horizontal Mirror Vertical 108,349 1,409 8,017 3,417 6,224 16,889 13,891 23,321 19,545 21,397 20,095 17,927

IV-8

Dari tabel IV-3 dapat diamati nilai MSE lebih besar dari 0 dan nilai PSNR kecil. Hal ini membuktikan bahwa modifikasi yang telah dilakukan benar-benar merusak citra hasil steganografi.

4.2

PENGARUH MODIFIKASI TERHADAP CITRA PESAN HASIL DEKRIPSI Pada pengujian ini, citra pesan di dalam citra termodifikasi akan diekstrak

kembali dan diamati tingkat perubahannya berdasarkan nilai MSE dan PSNR. 4.2.1 Pengaruh Modifikasi Invert Terhadap Citra Pesan Pada bagian ini, seluruh parameter akan digunakan untuk mengamati pengaruh modifikasi terhadap citra pesan dengan ukuran yang berbeda. Gambar IV-7 menampilkan hasil modifikasi invert pada citra steganografi yang telah disisipkan citra pesan Banana.bmp,

Treasuremap.bmp, dan Twins.bmp.

(a)

(b)

(c)

Gambar IV-7. Hasil modifikasi invert yang disisipkan citra pesan berbeda (a) Citra pesan Banana.bmp; (b) Citra pesan Treasuremap.bmp; (c) Citra pesan Twins.bmp

IV-9

Setelah dilakukan proses remodifikasi dan ekstraksi, didapatkan citra pesan yang ditunjukkan pada Gambar IV-8.

(a)

(b)

(c)

Gambar IV-8. Citra pesan hasil dekripsi citra termodifikasi invert (a) Banana.bmp; (b) Treasuremap.bmp; (c) Twins.bmp

Berdasarkan pengamatan visual, citra pesan ini tidak tampak berbeda dengan citra pesan asli. Namun jika ditinjau dari nilai MSE dan PSNR maka akan tampak perbedaannya. Nilai MSE dan PSNR citra pesan hasil dekripsi dapat dilihat pada Tabel IV-4

Tabel IV-4. MSE dan PSNR Citra pesan hasil dekripsi citra termodifikasi invert Citra Pesan hasil MSE PSNR (dB) dekripsi Banana.bmp Treasuremap.bmp Twins.bmp 5,226E-03 1,725E-04 6,395E-04 35,475 42,882 40,036

Berdasarkan Tabel IV-4 terlihat bahwa error yang terjadi pada citra pesan yang diakibatkan oleh modifikasi invert tidak memiliki

IV-10

hubungan dengan ukuran citra pesan. Artinya ukuran citra pesan yang memiliki ukuran yang lebih besar, belum tentu memiliki nilai MSE yang besar, begitu pula sebaliknya. Nilai MSE tertinggi diperoleh Banana.bmp yang memiliki ukuran 245 KB yaitu sebesar 5,226E-03 dimana nilai PSNR adalah 35,475 dB. Nilai MSE terendah dimiliki oleh

Treasuremap.bmp yang memiliki ukuran 195 KB sebesar 1,725E-04 dan PSNR sebesar 42,882. Sedangkan Twins.bmp yang memiliki ukuran paling kecil berada pada tingkat kedua untuk nilai MSE dan PSNR 4.2.2 Pengaruh Modifikasi Mirror Vertical dan Mirror Horizontal Terhadap Citra Pesan Sama seperti pada bagian modifikasi invert, seluruh parameter akan digunakan untuk mengamati pengaruh modifikasi terhadap citra pesan dengan ukuran yang berbeda. Gambar IV-9 dan Gambar IV-10 menampilkan hasil modifikasi mirror vertical dan mirror horizontal citra steganografi yang telah disisipkan citra pesan Banana.bmp,

Treasuremap.bmp, dan Twins.bmp.

IV-11

(a)

(b)

(c)

Gambar IV-9. Hasil modifikasi Mirror Vertical yang disisipkan citra pesan berbeda (a) Citra pesan Banana.bmp; (b) Citra pesan Treasuremap.bmp; (c) Citra pesan Twins.bmp

(a)

(b)

(c)

Gambar IV-10. Hasil modifikasi Mirror Horizontal yang disisipkan citra pesan berbeda (a) Citra pesan Banana.bmp; (b) Citra pesan Treasuremap.bmp; (c) Citra pesan Twins.bmp

Setelah dilakukan proses remodifikasi dan ekstaksi, didapatkan citra pesan yang ditunjukkan pada Gambar IV-11 dan Gambar IV-12.

IV-12

(a)

(b)

(c)

Gambar IV-11. Citra pesan hasil dekripsi citra termodifikasi mirror vertical (a) Banana.bmp; (b) Treasuremap.bmp; (c) Twins.bmp

(a)

(b)

(c)

Gambar IV-12. Citra pesan hasil dekripsi citra termodifikasi mirror horizontal (a) Banana.bmp; (b) Treasuremap.bmp; (c) Twins.bmp

Berdasarkan pengamatan visual, citra pesan hasil dekripsi modifikasi mirror vertical tidak tampak berbeda dengan citra pesan asli, sedangkan citra pesan hasil dekripsi modifikasi mirror horizontal memiliki titik-titik noise. Besarnya nilai MSE dan PSNR citra pesan hasil dekripsi kedua modifikasi ini ditampilkan pada Tabel IV-5 dan Tabel IV-6.

IV-13

Tabel IV-5. MSE dan PSNR Citra pesan hasil dekripsi citra termodifikasi mirror vertical Citra Pesan hasil MSE PSNR (dB) dekripsi Banana.bmp Treasuremap.bmp Twins.bmp 5,226E-03 1,725E-04 6,395E-04 35,475 42,882 40,036

Tabel IV-6. MSE dan PSNR Citra pesan hasil dekripsi citra termodifikasi mirror horizontal Citra Pesan hasil MSE PSNR (dB) dekripsi Banana.bmp Treasuremap.bmp Twins.bmp 0,823 0,525 0,589 24,488 25,463 25,215

Berdasarkan Tabel IV-5 dan Tabel-IV-6 terlihat bahwa error yang terjadi pada citra pesan yang diakibatkan oleh modifikasi mirror vertical dan mirror horizontal juga tidak memiliki hubungan dengan ukuran citra pesan. Nilai MSE tertinggi dari kedua modifikasi tersebut diperoleh Banana.bmp yaitu 5,226E-03 dan 0,823 dengan nilai PSNR 35,475 dB dan 24,488 dB. Sedangkan nilai terendah dimiliki oleh Treasuremap.bmp yaitu 1,725E-04 dan 0,525 dengan nilai PSNR 42,882 dB dan 25,463 dB. Dari kedua tabel diatas juga terlihat bahwa hasil dekripsi modifikasi mirror vertical memiliki nilai error yang jauh lebih rendah dibandingkan hasil dekripsi modifikasi mirror horizontal. Hal ini membuktikan bahwa citra pesan lebih robust (tahan) terhadap modifikasi mirror vertical

dibandingkan mirror horizontal.

IV-14

4.2.3 Pengaruh Modifikasi Fog Terhadap Citra Pesan Pada bagian ini akan diamati pengaruh modifikasi fog terhadap parameter dengan ukuran yang berbeda-beda. Syarat modifikasi fog adalah mengubah level warna pada setiap pixel yang ada pada citra menjadi atau mendekati level warna 127. Jenis modifikasi ini menggunakan lima buah sampel nilai yang akan dimasukkan sebagai pengubah nilai RGB dalam suatu pixel. Nilai yang digunakan adalah 9, 17, 25, 33, dan 41. Gambar IV-13 sampai Gambar IV-15 menampilkan hasil modifikasi fog pada citra steganografi yang telah disisipkan citra pesan Banana.bmp,

Treasuremap.bmp, dan Twins.bmp.

(a)

(b)

(c)

(d)

(e)

Gambar IV-13. Hasil modifikasi fog citra steganografi yang telah disisipkan Banana.bmp dengan berbagai nilai pengubah (a) Nilai pengubah = 9; (b) Nilai pengubah = 17;(c) Nilai pengubah = 25; (d) Nilai pengubah = 33; (e) Nilai pengubah = 41

IV-15

(a)

(b)

(c)

(d)

(e)

Gambar IV-14. Hasil modifikasi fog citra steganografi yang telah disisipkan Treasuremap.bmp dengan berbagai nilai pengubah (a) Nilai pengubah = 9; (b) Nilai pengubah = 17;(c) Nilai pengubah = 25; (d) Nilai pengubah = 33; (e) Nilai pengubah = 41

(a)

(b)

(c)

(d)

(e)

Gambar IV-15. Hasil modifikasi fog citra steganografi yang telah disisipkan Twins.bmp dengan berbagai nilai pengubah (a) Nilai pengubah = 9; (b) Nilai pengubah = 17;(c) Nilai pengubah = 25; (d) Nilai pengubah = 33; (e) Nilai pengubah = 41

Nilai pengubah pada modifikasi ini berfungsi menambahkan dan mengurangi nilai RGB dalam suatu pixel agar mendekati nilai keabuan yaitu 127. Jika nilai awal pixel lebih kecil dari nilai 127, maka nilainya akan ditambahkan dengan nilai pengubah yang dimasukkan, begitu pula sebaliknya. Apabila hasil penambahan dengan nilai pengubah lebih besar dari nilai 127 maka hasilnya tetap akan dibaca nilai 127. Hal yang sama akan terjadi jika proses pengurangan lebih kecil dari nilai 127. Gambar

IV-16

IV-16 memperlihatkan contoh perubahan level warna hijau setelah diberi nilai pengubah 9.

Gambar IV-16. Perubahan level warna hijau setelah diberi nilai pengubah 9

Pada Gambar IV-16 terlihat perubahan level warna hijau setelah ditambahkan nilai pengubah 9. Pada posisi (0,0), nilai yang awalnya 93 berubah menjadi 102 setelah ditambahkan 9. Tetapi pada posisi (7,0), hasil penambahan yang seharusnya bernilai 131, tetap dibaca 127. Hal ini dilakukan memperoleh nilai yang tepat berada pada nilai keabuan 127 agar sesuai dengan syarat melakukan modifikasi fog. Setelah dilakukan proses remodifikasi dan ekstraksi, didapatkan citra pesan yang memiliki kualitas yang berbeda-beda. Hal ini dipengaruhi oleh besar kecilnya nilai pengubah. Perbandingan hasil dekripsi citra pesan ditunjukkan pada Gambar IV-17 sampai Gambar IV-19.

IV-17

(a)

(b)

(c)

(d)

(e)

Gambar IV-17. Perbandingan pengaruh nilai pengubah pada citra pesan Banana.bmp (a) Nilai pengubah = 9; (b) Nilai pengubah = 17; (c) Nilai pengubah = 25; (d) Nilai pengubah = 33; (e) Nilai pengubah = 41

(a)

(b)

(c)

(d)

(e)

Gambar IV-18. Perbandingan pengaruh nilai pengubah pada citra pesan Treasuremap.bmp (a) Nilai pengubah = 9; (b) Nilai pengubah = 17; (c) Nilai pengubah = 25; (d) Nilai pengubah = 33; (e) Nilai pengubah = 41

(a)

(b)

(c)

(d)

(e)

Gambar IV-19. Perbandingan pengaruh nilai pengubah pada citra pesan Twins.bmp (a) Nilai pengubah = 9; (b) Nilai pengubah = 17; (c) Nilai pengubah = 25; (d) Nilai pengubah = 33; (e) Nilai pengubah = 41

Secara visual, informasi yang ada dalam ketiga citra pesan hasil dekripsi yang ditunjukkan pada Gambar IV-17 sampai Gambar IV-19

IV-18

masih bisa dipersepsi dan dipahami. Namun kualitas citra pesan tersebut semakin berkurang seiring dengan peningkatan nilai pengubah. Tabel IV-7 sampai IV-9 menunjukkan besarnya nilai MSE dan PSNR seluruh citra pesan hasil dekripsi.

Tabel IV-7. MSE dan PSNR citra pesan Banana.bmp Nilai Pengubah MSE PSNR (dB) 9 17 25 33 41 1,273 2,356 3,032 4,372 5,332 23,542 22,205 21,657 20,862 20,431

Tabel IV-8. MSE dan PSNR citra pesan Treasuremap.bmp Nilai Pengubah MSE PSNR (dB) 9 17 25 33 41 0,190 0,766 1,146 1,820 2,601 27,668 24,643 23,769 22,765 21,989

Tabel IV-9. MSE dan PSNR citra pesan Twins.bmp Nilai Pengubah MSE PSNR (dB) 9 17 25 33 41 0,735 1,788 2,379 2,741 3,803 24,735 22.804 22,184 21,876 21,165

IV-19

Berdasarkan Tabel IV-7 sampai Tabel-IV-9 semaikin jelas memperlihatkan bahwa semakin tinggi nilai pengubah RGB yang dimasukkan maka senakin besar pula error yang terjadi pada citra pesan yang diakibatkan oleh modifikasi fog. Dari tabel-tabel tersebut juga terlihat bahwa besarnya error yang terjadi pada citra pesan yang diakibatkan oleh modifikasi fog dengan berbagai tingkatan nilai pengubah tidak memiliki hubungan dengan ukuran citra pesan. Dengan

menggunakan nilai pengubah 9 sebagai standar perbandingan, maka diperoleh nilai MSE tertinggi dari Banana.bmp yaitu 1,273 dan nilai PSNR 23,542 dB. Sedangkan nilai terendah dimiliki oleh Treasuremap.bmp yaitu 0,190 dan nilai sebesar PSNR 27,668 dB. 4.2.4 Pengaruh Modifikasi Lighten Terhadap Citra Pesan Pada bagian ini akan diamati pengaruh modifikasi lighten terhadap parameter dengan ukuran yang berbeda-beda. Modifikasi ini menggunakan lima buah sampel nilai yang akan dimasukkan sebagai pengubah nilai RGB dalam suatu pixel. Nilai yang digunakan adalah 9, 17, 25, 33, dan 41. Gambar IV-20 sampai Gambar IV-22 menampilkan hasil modifikasi lighten pada citra steganografi yang telah disisipkan citra pesan Banana.bmp, Treasuremap.bmp, dan Twins.bmp.

IV-20

(a)

(b)

(c)

(d)

(e)

Gambar IV-20. Hasil modifikasi lighten citra steganografi yang telah disisipkan Banana.bmp dengan berbagai nilai pengubah (a) Nilai pengubah = 9; (b) Nilai pengubah = 17; (c) Nilai pengubah = 25; (d) Nilai pengubah = 33; (e) Nilai pengubah = 41

(a)

(b)

(c)

(d)

(e)

Gambar IV-21. Hasil modifikasi lighten citra steganografi yang telah disisipkan Treasuremap.bmp dengan berbagai nilai pengubah (a) Nilai pengubah = 9; (b) Nilai pengubah = 17; (c) Nilai pengubah = 25; (d) Nilai pengubah = 33; (e) Nilai pengubah = 41

(a)

(b)

(c)

(d)

(e)

Gambar IV-22. Hasil modifikasi lighten citra steganografi yang telah disisipkan Twins.bmp dengan berbagai nilai pengubah (a) Nilai pengubah = 9; (b) Nilai pengubah = 17; (c) Nilai pengubah = 25; (d) Nilai pengubah = 33; (e) Nilai pengubah = 41

IV-21

Nilai pengubah pada modifikasi ini berfungsi menambahkan nilai RGB dalam suatu pixel agar mendekati nilai warna maksimum 255. Gambar IV-23 memperlihatkan contoh perubahan level warna hijau setelah diberi nilai pengubah 25.

Gambar IV-23. Perubahan level warna hijau setelah diberi nilai pengubah 25

Pada Gambar IV-23 terlihat seluruh level warna hijau mengalami perubahan setelah ditambahkan nilai pengubah 25. Setelah dilakukan proses remodifikasi dan ekstraksi, didapatkan citra pesan yang memiliki kualitas yang berbeda-beda. Hal ini dipengaruhi oleh besar kecilnya nilai pengubah. Perbandingan hasil dekripsi citra pesan ditunjukkan pada Gambar IV-24 sampai Gambar IV-26

IV-22

(a)

(b)

(c)

(d)

(e)

Gambar IV-24. Perbandingan pengaruh nilai pengubah pada citra pesan Banana.bmp (a) Nilai pengubah = 9; (b) Nilai pengubah = 17; (c) Nilai pengubah = 25; (d) Nilai pengubah = 33; (e) Nilai pengubah = 41

(a)

(b)

(c)

(d)

(e)

Gambar IV-25. Perbandingan pengaruh nilai pengubah pada citra pesan Treasuremap.bmp (a) Nilai pengubah = 9; (b) Nilai pengubah = 17; (c) Nilai pengubah = 25; (d) Nilai pengubah = 33; (e) Nilai pengubah = 41

(a)

(b)

(c)

(d)

(e)

Gambar IV-26. Perbandingan pengaruh nilai pengubah pada citra pesan Twins.bmp (a) Nilai pengubah = 9; (b) Nilai pengubah = 17; (c) Nilai pengubah = 25; (d) Nilai pengubah = 33; (e) Nilai pengubah = 41

Berdasarkan pengamatan visual, informasi yang ada dalam ketiga citra pesan hasil dekripsi yang ditunjukkan pada Gambar IV-24 sampai

IV-23

Gambar IV-26 masih bisa dipersepsi dan dipahami. Tetapi kualitas citra pesan tersebut semakin berkurang seiring dengan peningkatan nilai pengubah. Tabel IV-10 sampai IV-12 menunjukkan besarnya nilai MSE dan PSNR seluruh citra pesan hasil dekripsi.

Tabel IV-10. MSE dan PSNR citra pesan Banana.bmp Nilai Pengubah MSE PSNR (dB) 9 17 25 33 41 0,173 0,473 0,845 1,001 1,001 27,872 25,690 24,432 24,063 24,063

Tabel IV-11. MSE dan PSNR citra pesan Treasuremap.bmp Nilai Pengubah MSE PSNR (dB) 9 17 25 33 41 0,165 0,408 0,702 0,856 0,856 27,984 26,0094 24,833 24,403 24,403

Tabel IV-12. MSE dan PSNR citra pesan Twins.bmp Nilai Pengubah MSE PSNR (dB) 9 17 25 33 41 1,322E-03 0,141 0,271 0,415 0,503 38,460 28,319 26,896 25,976 25,556

IV-24

Tabel IV-10 sampai Tabel-IV-12 memperlihatkan bahwa besarnya error yang terjadi pada citra pesan yang diakibatkan oleh modifikasi lighten dengan berbagai tingkatan nilai pengubah masih tidak memiliki hubungan dengan ukuran citra pesan. Dengan menggunakan nilai pengubah 9 sebagai standar perbandingan, maka diperoleh nilai MSE tertinggi dari Banana.bmp yaitu 0,173 dan nilai PSNR 27,872 dB. Sedangkan nilai terendah dimiliki oleh Twins.bmp yaitu 1,322E-03 dan nilai PSNR sebesar 38,460 dB. 4.2.4 Pengaruh Modifikasi Darken Terhadap Citra Pesan Pada bagian ini akan diamati pengaruh modifikasi darken terhadap parameter dengan ukuran yang berbeda-beda. Modifikasi ini menggunakan lima buah sampel nilai yang akan dimasukkan sebagai pengubah nilai RGB dalam suatu pixel. Nilai yang digunakan adalah 9, 17, 25, 33, dan 41. Gambar IV-27 sampai Gambar IV-29 menampilkan hasil modifikasi darken pada citra steganografi yang telah disisipkan citra pesan Banana.bmp, Treasuremap.bmp, dan Twins.bmp.

(a)

(b)

(c)

(d)

(e)

Gambar IV-27. Hasil modifikasi darken citra steganografi yang telah disisipkan Banana.bmp dengan berbagai nilai pengubah (a) Nilai pengubah = 9; (b) Nilai pengubah = 17; (c) Nilai pengubah = 25; (d) Nilai pengubah = 33; (e) Nilai pengubah = 41

IV-25

(a)

(b)

(c)

(d)

(e)

Gambar IV-28. Hasil modifikasi darken citra steganografi yang telah disisipkan Treasuremap.bmp dengan berbagai nilai pengubah (a) Nilai pengubah = 9; (b) Nilai pengubah = 17; (c) Nilai pengubah = 25; (d) Nilai pengubah = 33; (e) Nilai pengubah = 41

(a)

(b)

(c)

(d)

(e)

Gambar IV-29. Hasil modifikasi darken citra steganografi yang telah disisipkan Twins.bmp dengan berbagai nilai pengubah (a) Nilai pengubah = 9; (b) Nilai pengubah = 17; (c) Nilai pengubah = 25; (d) Nilai pengubah = 33; (e) Nilai pengubah = 41

Nilai pengubah pada modifikasi ini berfungsi mengurangi nilai RGB dalam suatu pixel agar mendekati nilai warna minimum 0. Gambar IV-30 memperlihatkan contoh perubahan level warna hijau setelah diberi nilai pengubah 25.

IV-26

Gambar IV-30. Perubahan level warna hijau setelah diberi nilai pengubah 25

Pada Gambar IV-30 terlihat seluruh level warna hijau mangalami perubahan setelah dikurangi nilai pengubah 25. Terlihat perubahan dari darken terbalik dengan perubahan yang terjadi pada lighten. Setelah dilakukan proses remodifikasi dan ekstraksi, didapatkan citra pesan yang memiliki kualitas yang berbeda-beda. Hal ini dipengaruhi oleh besar kecilnya nilai pengubah. Perbandingan hasil dekripsi citra pesan ditunjukkan pada Gambar IV-31 sampai Gambar IV-33

IV-27

(a)

(b)

(c)

(d)

(e)

Gambar IV-31. Perbandingan pengaruh nilai pengubah pada citra pesan Banana.bmp (a) Nilai pengubah = 9; (b) Nilai pengubah = 17; (c) Nilai pengubah = 25; (d) Nilai pengubah = 33; (e) Nilai pengubah = 41

(a)

(b)

(c)

(d)

(e)

Gambar IV-32. Perbandingan pengaruh nilai pengubah pada citra pesan Treasuremap.bmp (a) Nilai pengubah = 9; (b) Nilai pengubah = 17; (c) Nilai pengubah = 25; (d) Nilai pengubah = 33; (e) Nilai pengubah = 41

(a)

(b)

(c)

(d)

(e)

Gambar IV-33. Perbandingan pengaruh nilai pengubah pada citra pesan Twins.bmp (a) Nilai pengubah = 9; (b) Nilai pengubah = 17; (c) Nilai pengubah = 25; (d) Nilai pengubah = 33; (e) Nilai pengubah = 41

Berdasarkan pengamatan visual, informasi yang ada dalam ketiga citra pesan hasil dekripsi yang ditunjukkan pada Gambar IV-31 sampai

IV-28

Gambar IV-33 bisa dipersepsi dan dipahami.. Tabel IV-13 sampai IV-15 menunjukkan besarnya nilai MSE dan PSNR seluruh citra pesan hasil dekripsi.

Tabel IV-13. MSE dan PSNR citra pesan Banana.bmp Nilai Pengubah MSE PSNR (dB) 9 17 25 33 41 4,119E-04 4,119E-04 4,119E-04 4,119E-04 4,119E-04 40,991 40,991 40,991 40,991 40,991

Tabel IV-14. MSE dan PSNR citra pesan Treasuremap.bmp Nilai Pengubah MSE PSNR (dB) 9 17 25 33 41 1,724E-04 1,724E-04 1,724E-04 1,724E-04 1,724E-04 42,881 42,881 42,881 42,881 42,881

Tabel IV-15. MSE dan PSNR citra pesan Twins.bmp Nilai Pengubah MSE PSNR (dB) 9 17 25 33 41 6,394E-04 6,394E-04 6,394E-04 6,394E-04 6,394E-04 40,036 40,036 40,036 40,036 40,036

Tabel IV-13 sampai Tabel-IV-15 memperlihatkan bahwa besarnya error yang terjadi pada citra pesan yang diakibatkan oleh modifikasi
IV-29

darken dengan berbagai tingkatan nilai pengubah adalah sama Hal ini disebabkan operasi yang terjadi pada modifikasi darken adalah operasi pengurangan. Dalam aplikasinya, citra dirubah ke dalam angka biner. Operasi pengurangan pada biner melibatkan komplemen ke dua dari hasil pengurangan. Sehingga bit-bit terakhir dari citra steganografi tidak mengalami perubahan yang signifikan seperti pada modifikasi-modifikasi yang lain. Sehingga dapat dilihat bahwa darken adalah modifikasi yang memiliki nilai MSE dan PSNR yang lebih stabil. Ukuran citra pesan tidak berpengaruh terhadap MSE dan PSNR citra hasil dekripsi yang diperoleh. Banana.bmp yang memiliki ukuran paling besar memiliki nilai MSE 4,119E-04 lebih kecil dari Twins.bmp yang memiliki ukuran paling kecil dengan nilai MSE 6,394E-04. Begitupula nilai PSNR untuk Banana.bmp yaitu 40,991 dB lebih bagus dari nilai PSNR untuk Twins.bmp yaitu 40,036 dB.

IV-30

BAB V PENUTUP
5.1 KESIMPULAN Dari hasil analisis penggunaan steganografi dengan algoritma DES dan fungsi hash untuk mengatasi modifikasi citra, dengan menggunakan citra Banana.bmp, Treasuremap.bmp, dan Twins.bmp sebagai citra pesan, serta citra Monalisa.bmp sebagai citra penampung, maka dapat diambil kesimpulan bahwa: 1. Implementasi Algoritma DES dan Fungsi Hash pada teknik steganografi menghasilkan citra steganografi yang memiliki robustness terhadap modifikasi citra yang diujikan antara lain fog, invert, mirror, lighten, darken. 2. Semakin kecil ukuran citra pesan yang disisipkan maka semakin baik citra staganografi yang dihasilkan. Banana.bmp dengan ukuran 245 KB memiliki MSE sebesar 1,263E-03 dan PSNR sebesar 38,559 dB. Treasuremap.bmp dengan ukuran 195 KB memiliki MSE sebesar 8,957E04 dan PSNR sebesar 39,305 dB. Twins.bmp dengan ukuran 195 KB memiliki MSE sebesar 2,809E-04 dan PSNR sebesar 41,822 dB. 3. Ukuran citra pesan tidak mempengaruhi besarnya error yang terjadi pada hasil dekripsi citra steganografi yang telah dimodifikasi. Contohnya pada modifikasi invert, Banana.bmp hasil dekripsi dengan ukuran 245 KB memiliki MSE sebesar 5,226E-03 dan PSNR sebesar 35,475 dB. Treasuremap.bmp dengan ukuran 195 KB memiliki MSE sebesar

V-1

1,725E-04 dan PSNR sebesar 42,882 dB. Twins.bmp dengan ukuran 195 KB memiliki MSE sebesar 6,395E-04 dan PSNR sebesar 40,036 dB. 4. Untuk jenis modifikasi yang tidak memerlukan nilai pengubah, mirror horizontal paling mempengaruhi citra pesan hasil dekripsi dengan nilai MSE dan PSNR masing-masing citra pesan yaitu 0,823 dan 24,488 dB untuk Banana.bmp, 0,525 dan 25,463 dB untuk Treasuremap.bmp, 0,589 dan 25,215 dB untuk Twins.bmp. Sedangkan modifikasi yang memiliki sedikit pengaruh terhadap citra pesan hasil dekripsi adalah invert dan mirror vertical dengan nilai MSE dan PSNR masing-masing citra pesan yaitu 5,226E-03 dan 35,475 dB untuk Banana.bmp, 1,725E-04 dan 42,882 dB untuk Treasure.bmp, 6,395E-04 dan 40,036 dB untuk Twins.bmp. 5. Untuk jenis modifikasi yang memerlukan nilai pengubah, modifikasi fog (nilai pengubah 9 sebagai standar perbandingan) paling mempengaruhi citra pesan hasil dekripsi. Nilai MSE dan PSNR masing-masing citra pesan yaitu 1,273 dan 23,542 dB untuk Banana.bmp, 0,190 dan 27,668 dB untuk Treasuremap.bmp, 0,735 dan 24,735 dB untuk Twins.bmp. Sedangkan modifikasi yang memiliki sedikit pengaruh terhadap citra pesan hasil

dekripsi adalah darken dengan nilai MSE dan PSNR masing-masing citra pesan yaitu 4,119E-04 dan 40,991 dB untuk Banana.bmp, 1,724E-04 dan 42,881 dB untuk Treasuremap.bmp, 6,394E-04 dan 40,036 dB untuk Twins.bmp.

V-2

5.2

SARAN 1. Untuk penulisan selanjutnya, bisa dilakukan uji steganografi dengan mengganti media penapung dan data rahasia yang digunakan. 2. Untuk penulisan selanjutnya, bisa dikembangkan dengan menggunakan teknik enkripsi dan metode penyisipan steganografi yang lain. 3. Pada penelitian selanjutnya perlu diujicobakan berbagai jenis modifikasi dan manipulasi lain terhadap citra hasil steganografi.

V-3

DAFTAR PUSTAKA

[1]

Suryani, ST dan Batti, Anastasia A. 2009. Implementasi Spread Spectrum Citra Digital dengan Metode Least Significant Bit (LSB). Universitas Hasanuddin. Makassar.

[2]

Munir, Rinaldi. 2004. Steganografi dan Watermarking. Informatika Bandung. Bandung.

[3]

Wijaya, Ermadi Satriya dan Prayudi, Yudi. 2004. Konsep Hidden Message Menggunakan Teknik Steganografi Dynamic Cell Spreading. Universitas Islam Indonesia. Yogyakarta.

[4]

Kusumaningrum, Septiana dan Priadi, Timbar Imam. 2009. Uji Steganografi Citra Digital dengan Metode Least Significant Bit dan Mode Operasi Cipher Block Chaining Pada kanal AWGN. Universitas Hasanuddin. Makassar.

[5] [6]

Munir, Rinaldi. 2006. Kriptografi. Informatika Bandung. Bandung. Fahmi. 2007. Studi dan Implementasi Watermarking Citra digital dengan Menggunakan Fungsi Hash. Sekolah Teknik Elektro dan Informatika ITB. Bandung.

[7]

Rachmad, Aeri. 2008. Pengolahan Citra Digital Menggunakan Teknik Filtering Adaptive Noise Removal Pada Gambar Bernoise. Institut Teknologi Adhi Tama Surabaya. Surabaya.

LAMPIRAN

1.

LISTING PROGRAM MENU UTAMA

Private Sub ImgAdd_Click() frmAdd.Show vbModeless, Me frmMain.Hide End Sub Private Sub lbExit_Click() Unload Me End Sub Private Sub lbAdd_Click() frmAdd.Show vbModeless, Me frmMain.Hide End Sub Private Sub lbExtract_Click() frmRead.Show vbModeless, Me frmMain.Hide End Sub Private Sub imgExtract_Click() frmRead.Show vbModeless, Me frmMain.Hide End Sub

1.1 LISTING SUB PROGRAM ENKRIPSI
Private Sub Form_Unload(Cancel As Integer) Unload Me Option Explicit Dim DSImageFile$ Dim strImageFile$ 'Gambar utama dimana file akan dilampirkan Dim m_Millimeter& Dim ToW&, ToH&, InW&, InH&, mPad& Dim Dim Dim Dim Dim Dim Dim MM As Double NN As Double OOO As Double PPP As Double PPP1 As Double RRR As Double QQQ As Double

Dim Rred As Double Dim Ggreen As Double Dim Bblue As Double Dim Rred1 As Integer Dim Ggreen1 As Integer Dim Bblue1 As Integer

Dim Rred2 As Integer Dim Ggreen2 As Integer Dim Bblue2 As Integer Dim RR1 As Double Dim GG1 As Double Dim BB1 As Double Dim Pixel As Long Dim Pixel1 As Long Dim Pixel12 As Long Dim Dim Dim Dim QF QL QD QQ As As As As String String String Double

Dim Temp As Integer Dim XXX As Integer Dim YYY As Integer Dim WithEvents clsStega As ClsStegano 'class stegano! Private Sub Center_Click() HS.Value = HS.Max / 2 VS.Value = VS.Max / 2 End Sub Private Sub Center0_Click() HS0.Value = HS0.Max / 2 VS0.Value = VS0.Max / 2 End Sub Private Sub Center2_Click() HS1.Value = HS1.Max / 2 VS1.Value = VS1.Max / 2 End Sub Private Sub Center3_Click() HS2.Value = HS2.Max / 2 VS2.Value = VS2.Max / 2 End Sub 'Peringatan error Private Sub clsStega_SomeError(strDescription As String) cmdRemove.Enabled = False MsgBox "Ada Kesalahan: " & strDescription, , "Tugas Akhir" End Sub 'Proses yang sedang dijalankan ditunjukkan pada langkah ini Private Sub clsStega_StatusChanged(prcDone As Long, strStatus As String) frmLoad.ProgBar.Value = prcDone frmLoad.lbStatus = strStatus End Sub Private Sub txtPwd_GotFocus()

lbStep.Caption = "Langkah 4: Masukan Kata Sandi Jika Diinginkan" End Sub Private Sub VS_Change() TheImage.Move TheImage.Left, -VS.Value End Sub Private Sub VS_Scroll() TheImage.Move TheImage.Left, -VS.Value End Sub Private Sub VS0_Change() DataStega.Move DataStega.Left, -VS0.Value End Sub Private Sub VS0_Scroll() DataStega.Move DataStega.Left, -VS0.Value End Sub Private Sub VS1_Change() Hasil.Move Hasil.Left, -VS1.Value End Sub Private Sub VS1_Scroll() Hasil.Move Hasil.Left, -VS1.Value End Sub Private Sub VS2_Change() ModPicture.Move ModPicture.Left, -VS2.Value End Sub Private Sub VS2_Scroll() ModPicture.Move ModPicture.Left, -VS2.Value End Sub Private Sub GetRGB(ByVal Col As String) On Error Resume Next Bblue = Col \ (256 ^ 2) Ggreen = (Col - Bblue * 256 ^ 2) \ 256 Rred = (Col - Bblue * 256 ^ 2 - Ggreen * 256) '\ 256 End Sub End Sub Private Sub OpAlgoId_Click(Index As Integer) clsStega.HashAlgorithm = Index End Sub Private Sub OpEncAlgo_Click(Index As Integer) clsStega.EncryptionAlgorithm = Index cmdRemove.Enabled = False cmdAddFile.Enabled = False cmdTarget.Enabled = False End Sub Private Sub cmdremove_MouseOut() lbStep.Caption = "" End Sub

Private Sub cmdremove_MouseOver() lbStep.Caption = "Menghapus Citra Pesan Yang Akan Disisipkan" End Sub

Private Sub cmdFinish_Click() Unload Me End Sub Private Sub Form_Load() Set clsStega = New ClsStegano m_Millimeter = ScaleX(100, vbPixels, vbMillimeters) End Sub Private Sub Form_Unload(Cancel As Integer) Dim It As ListItem For Each It In lvwFilesAdded.ListItems Kill clsStega(It.Key).Filename Next Set clsStega = Nothing frmMain.Show End Sub Private Sub Gopixel1_Click() FormPixel1.Show vbModeless, Me End Sub Private Sub Gopixel_Click() FormPixel.Show vbModeless, Me End Sub

Private Sub HS_Change() TheImage.Move -HS.Value End Sub Private Sub HS_Scroll() TheImage.Move -HS.Value End Sub Private Sub HS0_Change() DataStega.Move -HS0.Value End Sub Private Sub HS0_Scroll() DataStega.Move -HS0.Value End Sub Private Sub HS1_Change() Hasil.Move -HS1.Value End Sub Private Sub HS1_Scroll() Hasil.Move -HS1.Value End Sub Private Sub HS2_Change() ModPicture.Move -HS2.Value End Sub Private Sub HS2_Scroll()

ModPicture.Move -HS2.Value End Sub Private Sub Image1_Click() Call cmdTarget_Click End Sub Private Sub Hysto_Click() frmHistogram.Show vbModeless, Me End Sub Private Sub Shocut_Click() Files.Filter = "Image File|*.bmp" Files.ShowOpen DSImageFile = Files.Filename ModPicture.Picture = LoadPicture(DSImageFile) ToW ToH InW InH = = = = Me.ScaleWidth - mPad - mPad Me.ScaleHeight - mPad - mPad ModPicture.Picture.Width / m_Millimeter ModPicture.Picture.Height / m_Millimeter HS2.TOp + mPad VS2.Left + mPad = ToH - HS2.Height = ToW - VS2.Width

VS2.Max = InH HS2.Max = InW VS2.LargeChange HS2.LargeChange

Fog.Enabled = True Invert.Enabled = True Rotate.Enabled = True MirrorH.Enabled = True MirrorV.Enabled = True Lighten.Enabled = True Darken.Enabled = True sdt.Visible = True sudut.Visible = True End Sub Private Sub Shortcut_Click() Files.Filter = "Image File|*.bmp" Files.ShowOpen DSImageFile = Files.Filename Hasil.Picture = LoadPicture(DSImageFile) ToW ToH InW InH = = = = Me.ScaleWidth - mPad - mPad Me.ScaleHeight - mPad - mPad Hasil.Picture.Width / m_Millimeter Hasil.Picture.Height / m_Millimeter HS1.TOp + mPad VS1.Left + mPad = ToH - HS1.Height = ToW - VS1.Width

VS1.Max = InH HS1.Max = InW VS1.LargeChange HS1.LargeChange End Sub

Private Sub Hysto2_Click() frmHistogram1.Show vbModeless, Me End Sub Private Sub Hysto3_Click() frmHistogram2.Show vbModeless, Me End Sub

1.1.1 Listing Subprogram Buka Citra Penampung
Private Sub cmdTarget_Click() mPad = 2 Files.Filter = "Image File|*.bmp" Files.ShowOpen strImageFile = Files.Filename If strImageFile <> "" And VBA.Right$(strImageFile, 4) = ".bmp" Then TheImage.Picture = LoadPicture(strImageFile) clsStega.ImageFile = strImageFile lbImgName = "Nama: " & Files.FileTitle lbImgSize = "Ukuran: " & clsStega.ImgSize lbImgRes = "Resolusi: " & clsStega.ImgRes & " bits" lbWarning.Visible = IIf(clsStega.ImgRes < 24, True, False) 'menghitung ukuran gambar untuk disesuaikan dengan layar ToW = Me.ScaleWidth - mPad - mPad ToH = Me.ScaleHeight - mPad - mPad InW = TheImage.Picture.Width / m_Millimeter InH = TheImage.Picture.Height / m_Millimeter VS.Max = InH HS.Max = InW VS.LargeChange HS.LargeChange HS.TOp + mPad VS.Left + mPad = ToH - HS.Height = ToW - VS.Width

lbRema = "Ukuran File Yang Bisa Disisipkan:" & clsStega.BytesTotal & " byte" cmdAddFile.Enabled = True Center.Enabled = True Hysto.Enabled = True cmdTarget.Caption = "Buka Citra Lain" lbStep.Caption = "" Else MsgBox "Tidak Memilih Citra Penampung", vbCritical, "Kesalahan" End If End Sub

1.1.2 Listing Sub Subprogram Buka Citra Pesan
Private Sub cmdAddFile_Click() Dim theData$, theKey$, sTitle$ Dim Itlvw As ListItem Dim iconFile%, myclsGetIcon As New clsGetIcon Dim imgRet As IPictureDisp 'mem-browse file yang akan ditambahkan 'jenis file yang bisa ditambahkan Files.Filter = "Image File|*.bmp;*.gif;*.jpg;*.wmf;*.emf;*.ico;*.cur" Files.Filename = "" Files.ShowOpen theData = Files.Filename If theData = "" Then MsgBox "Tidak Memilih Citra Pesan", vbCritical, "Kesalahan" Exit Sub End If DataStega.Picture = LoadPicture(Files.Filename) m_Millimeter = ScaleX(100, vbPixels, vbMillimeters) ToW ToH InW InH = = = = Me.ScaleWidth - mPad - mPad Me.ScaleHeight - mPad - mPad DataStega.Picture.Width / m_Millimeter DataStega.Picture.Height / m_Millimeter HS0.TOp + mPad VS0.Left + mPad = ToH - HS0.Height = ToW - VS0.Width

VS0.Max = InH HS0.Max = InW VS0.LargeChange HS0.LargeChange

Center0.Enabled = True sTitle = VBA.Left$(Files.FileTitle, Len(Files.FileTitle) - 4) If theData <> "" Then theKey = "FTUNHAS" & lvwFilesAdded.ListItems.Count + 1 'membangkitkan "unique key" untuk file ini

If clsStega.AddFile(theData, sTitle, theKey) Then 'jika file telah ditambahkan maka ...continue Me.ScaleMode = vbTwips 'untuk memperbaiki ikon gambar Set imgRet = myclsGetIcon.SetIcon(theData) ImgLst.ListImages.Add , , imgRet iconFile = ImgLst.ListImages.Count Set Itlvw = lvwFilesAdded.ListItems.Add(, theKey, VBA.Right$(theData, 3), , iconFile) Itlvw.SubItems(1) = sTitle

Itlvw.SubItems(2) = FileLen(theData) lbRema = "Ukuran File Yang Bisa Disisipkan: " & clsStega.BytesTotal - clsStega.BytesAdded & "byte" 'Batas jumlah byte file yang bisa ditambahkan Me.ScaleMode = vbPixels 'untuk memperbaiki ikon gambar End If lbStep.Caption = "" cmdAddFile.Caption = "Tambah Citra Pesan" cmdRemove.Enabled = True Enkripsi.Enabled = True cmdTarget.Enabled = False End If End Sub

1.1.3 Listing Sub Subprogram Hapus Citra Pesan
Private Sub cmdRemove_Click() Dim ItSel As ListItem Set ItSel = lvwFilesAdded.SelectedItem If Not ItSel Is Nothing Then clsStega.RemoveFile ItSel.Key lbRema = "Ukuran File Yang Bisa Disisipkan: " & clsStega.BytesTotal - clsStega.BytesAdded & "byte" lvwFilesAdded.ListItems.Remove ItSel.Index End If If lvwFilesAdded.ListItems.Count = 0 Then cmdRemove.Enabled = False DataStega.Picture = Nothing End If End Sub

1.1.4 Listing Sub Subprogram Sisipkan Pesan
Private Sub Enkripsi_Click() mPad = 2 If Len(Trim(txtPwd)) > 0 Then clsStega.Pwd = Trim(txtPwd) clsStega.EncrypMe = True End If frmLoad.Show vbModeless, Me lbStep.Caption = "Langkah 5: Proses Penyisipan " clsStega.Encodeit 'mengkodekan Files.Filename = "" Files.Filter = "Image File|*.bmp" Files.ShowSave ' menyimpan gambar yang telah disisipkan file rahasia If Files.Filename <> "" Then clsStega.OutputImageFile = Files.Filename

clsStega.Save2Image Label8 = "Nama: " & Files.FileTitle Label7 = "Ukuran: " & clsStega.ImgSize Label6 = "Resolusi: " & clsStega.ImgRes & " bit" 'Menampilkan Gambar Hasil Hasil.Picture = LoadPicture(Files.Filename) m_Millimeter = ScaleX(100, vbPixels, vbMillimeters) ToW ToH InW InH = = = = Me.ScaleWidth - mPad - mPad Me.ScaleHeight - mPad - mPad Hasil.Picture.Width / m_Millimeter Hasil.Picture.Height / m_Millimeter

VS1.Max = InH - HS1.TOp + mPad HS1.Max = InW - VS1.Left + mPad VS1.LargeChange = ToH - HS1.Height HS1.LargeChange = ToW - VS1.Width lbStep.Caption = "Langkah 6: Proses Penyisipan Selesai" Else MsgBox "Proses Penyimpanan Citra Dibatalkan!", , "Tugas Akhir" End If Unload frmLoad Center2.Enabled = True GoPixel.Enabled = True Hysto2.Enabled = True MSE1.Enabled = True PSNR1.Enabled = True cmdFinish.Enabled = True cmdTarget.Enabled = False cmdAddFile.Enabled = False cmdRemove.Enabled = False Enkripsi.Enabled = False txtPwd.Enabled = False Fog.Enabled = True Invert.Enabled = True Rotate.Enabled = True MirrorH.Enabled = True MirrorV.Enabled = True Lighten.Enabled = True Darken.Enabled = True sdt.Visible = True sudut.Visible = True End Sub

1.1.5 Listing Sub Subprogram Histogram Citra Penampung
Option Explicit Dim hData(0 To 3, 0 To 255) As Single Dim hMax(0 To 3) As Single

Dim x As Long, y As Long Private Sub cmbHistMethod_Click() lastHistMethod = cmbHistMethod.ListIndex DrawHistogram cmbHistSource.ListIndex, cmbHistMethod.ListIndex End Sub Private Sub cmbHistSource_Click() lastHistSource = cmbHistSource.ListIndex DrawHistogram cmbHistSource.ListIndex, cmbHistMethod.ListIndex End Sub Private Sub Form_Load() GenerateHistogram cmbHistSource.Clear cmbHistSource.AddItem cmbHistSource.AddItem cmbHistSource.AddItem cmbHistSource.AddItem

"Merah" "Hijau" "Biru" "Luminance"

cmbHistSource.ListIndex = lastHistSource cmbHistMethod.Clear cmbHistMethod.AddItem "Garis" cmbHistMethod.AddItem "Grafik Penuh" cmbHistMethod.ListIndex = lastHistMethod End Sub 'Subroutine untuk menggambar histogram '0 - merah '1 - hijau '2 - Biru '3 - Luminance 'jenis2 histogram '0 - garis '1 - grafik penuh Private Sub DrawHistogram(ByVal hType As Long, ByVal drawMethod As Long) picH.Cls Dim tHeight As Long tHeight = picH.ScaleHeight - 2 Dim LastX As Long, LastY As Long Select Case hType Case 0 DrawGradient picH, RGB(0, 0, 0), RGB(255, 0, 0) picH.ForeColor = RGB(255, 255, 255)

Case 1 DrawGradient picH, RGB(0, 0, 0), RGB(0, 255, 0) picH.ForeColor = RGB(255, 255, 255) Case 2 DrawGradient picH, RGB(0, 0, 0), RGB(0, 0, 255) picH.ForeColor = RGB(255, 255, 255) Case 3 DrawGradient picH, RGB(0, 0, 0), RGB(255, 255, 255) picH.ForeColor = RGB(255, 0, 0) End Select LastX = 0 LastY = tHeight - (hData(hType, 0) / hMax(hType)) * tHeight For x = 0 To 255 y = tHeight - (hData(hType, x) / hMax(hType)) * tHeight 'untuk garis If drawMethod = 0 Then picH.Line (LastX, LastY)-(x, y) LastX = x LastY = y 'untuk grafik penuh ElseIf drawMethod = 1 Then picH.Line (x, tHeight)-(x, y) End If Next x 'jumlah total pixel Dim fDraw As New FastDrawing Dim iWidth As Long, iHeight As Long iWidth = fDraw.GetImageWidth(frmAdd.TheImage) iHeight = fDraw.GetImageHeight(frmAdd.TheImage) lblTotalPixels.Caption = "Total pixel: " & (iWidth * iHeight) 'pixel terbanyak lblMaxCount.Caption = hMax(hType) End Sub Private Sub Form_Terminate() Unload Me End Sub Private Sub picH_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single) lblLevel.Caption = x lblCount.Caption = hData(lastHistSource, x) End Sub Public Sub GenerateHistogram()

Dim ImageData() As Byte Dim iWidth As Long, iHeight As Long Dim fDraw As New FastDrawing iWidth = fDraw.GetImageWidth(frmAdd.TheImage) iHeight = fDraw.GetImageHeight(frmAdd.TheImage) fDraw.GetImageData2D frmAdd.TheImage, ImageData() Dim r As Long, g As Long, b As Long, L As Long For x = 0 To 3 hMax(x) = 0 For y = 0 To 255 hData(x, y) = 0 Next y Next x Dim QuickX As Long For x = 0 To iWidth - 1 QuickX = x * 3 For y = 0 To iHeight - 1 r = ImageData(QuickX + 2, y) g = ImageData(QuickX + 1, y) b = ImageData(QuickX, y) L = (r + g + b) \ 3 hData(0, r) = hData(0, r) + 1 hData(1, g) = hData(1, g) + 1 hData(2, b) = hData(2, b) + 1 hData(3, L) = hData(3, L) + 1 Next y Next x For x = 0 To 255 'merah If hData(0, x) 'hijau If hData(1, x) 'biru If hData(2, x) 'Luminance If hData(3, x) Next x

> hMax(0) Then hMax(0) = hData(0, x) > hMax(1) Then hMax(1) = hData(1, x) > hMax(2) Then hMax(2) = hData(2, x) > hMax(3) Then hMax(3) = hData(3, x)

DrawHistogram lastHistSource, lastHistMethod End Sub

1.1.6 Listing Sub Subprogram Histogram Citra Hasil Steganografi
Option Explicit Dim hData(0 To 3, 0 To 255) As Single Dim hMax(0 To 3) As Single Dim x As Long, y As Long Private Sub cmbHistMethod_Click() lastHistMethod = cmbHistMethod.ListIndex DrawHistogram cmbHistSource.ListIndex, cmbHistMethod.ListIndex End Sub Private Sub cmbHistSource_Click() lastHistSource = cmbHistSource.ListIndex DrawHistogram cmbHistSource.ListIndex, cmbHistMethod.ListIndex End Sub Private Sub Form_Load() GenerateHistogram cmbHistSource.Clear cmbHistSource.AddItem cmbHistSource.AddItem cmbHistSource.AddItem cmbHistSource.AddItem

"Merah" "Hijau" "Biru" "Luminance"

cmbHistSource.ListIndex = lastHistSource cmbHistMethod.Clear cmbHistMethod.AddItem "Garis" cmbHistMethod.AddItem "Grafik Penuh" cmbHistMethod.ListIndex = lastHistMethod End Sub 'Subroutine untuk menggambar histogram '0 - merah '1 - hijau '2 - Biru '3 - Luminance 'jenis2 histogram '0 - garis '1 - grafik penuh Private Sub DrawHistogram(ByVal hType As Long, ByVal drawMethod As Long) picH.Cls Dim tHeight As Long tHeight = picH.ScaleHeight - 2 Dim LastX As Long, LastY As Long

Select Case hType Case 0 DrawGradient picH, RGB(0, picH.ForeColor = RGB(255, Case 1 DrawGradient picH, RGB(0, picH.ForeColor = RGB(255, Case 2 DrawGradient picH, RGB(0, picH.ForeColor = RGB(255, Case 3 DrawGradient picH, RGB(0, picH.ForeColor = RGB(255, End Select

0, 0), RGB(255, 0, 0) 255, 255) 0, 0), RGB(0, 255, 0) 255, 255) 0, 0), RGB(0, 0, 255) 255, 255) 0, 0), RGB(255, 255, 255) 0, 0)

LastX = 0 LastY = tHeight - (hData(hType, 0) / hMax(hType)) * tHeight For x = 0 To 255 y = tHeight - (hData(hType, x) / hMax(hType)) * tHeight 'untuk garis If drawMethod = 0 Then picH.Line (LastX, LastY)-(x, y) LastX = x LastY = y 'untuk grafik penuh ElseIf drawMethod = 1 Then picH.Line (x, tHeight)-(x, y) End If Next x 'jumlah total pixel Dim fDraw As New FastDrawing Dim iWidth As Long, iHeight As Long iWidth = fDraw.GetImageWidth(frmAdd.Hasil) iHeight = fDraw.GetImageHeight(frmAdd.Hasil) lblTotalPixels.Caption = "Total pixel: " & (iWidth * iHeight) 'pixel terbanyak lblMaxCount.Caption = hMax(hType) End Sub Private Sub Form_Terminate() Unload Me End Sub Private Sub picH_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single) lblLevel.Caption = x lblCount.Caption = hData(lastHistSource, x) End Sub

Public Sub GenerateHistogram() Dim ImageData() As Byte Dim iWidth As Long, iHeight As Long Dim fDraw As New FastDrawing iWidth = fDraw.GetImageWidth(frmAdd.Hasil) iHeight = fDraw.GetImageHeight(frmAdd.Hasil) fDraw.GetImageData2D frmAdd.Hasil, ImageData() Dim r As Long, g As Long, b As Long, L As Long For x = 0 To 3 hMax(x) = 0 For y = 0 To 255 hData(x, y) = 0 Next y Next x Dim QuickX As Long For x = 0 To iWidth - 1 QuickX = x * 3 For y = 0 To iHeight - 1 r = ImageData(QuickX + 2, y) g = ImageData(QuickX + 1, y) b = ImageData(QuickX, y) L = (r + g + b) \ 3 hData(0, r) = hData(0, r) + 1 hData(1, g) = hData(1, g) + 1 hData(2, b) = hData(2, b) + 1 hData(3, L) = hData(3, L) + 1 Next y Next x For x = 0 To 255 'merah If hData(0, x) > hMax(0) Then 'hijau If hData(1, x) > hMax(1) Then 'biru If hData(2, x) > hMax(2) Then 'Luminance If hData(3, x) > hMax(3) Then Next x

hMax(0) = hData(0, x) hMax(1) = hData(1, x) hMax(2) = hData(2, x) hMax(3) = hData(3, x)

DrawHistogram lastHistSource, lastHistMethod End Sub

1.1.7 Listing Sub Subprogram Histogram Citra Steganografi hasil modifikasi
Option Explicit Dim hData(0 To 3, 0 To 255) As Single Dim hMax(0 To 3) As Single

Dim x As Long, y As Long Private Sub cmbHistMethod_Click() lastHistMethod = cmbHistMethod.ListIndex DrawHistogram cmbHistSource.ListIndex, cmbHistMethod.ListIndex End Sub Private Sub cmbHistSource_Click() lastHistSource = cmbHistSource.ListIndex DrawHistogram cmbHistSource.ListIndex, cmbHistMethod.ListIndex End Sub Private Sub Form_Load() GenerateHistogram cmbHistSource.Clear cmbHistSource.AddItem cmbHistSource.AddItem cmbHistSource.AddItem cmbHistSource.AddItem

"Merah" "Hijau" "Biru" "Luminance"

cmbHistSource.ListIndex = lastHistSource cmbHistMethod.Clear cmbHistMethod.AddItem "Garis" cmbHistMethod.AddItem "Grafik Penuh" cmbHistMethod.ListIndex = lastHistMethod End Sub

'Subroutine untuk menggambar histogram '0 - merah '1 - hijau '2 - Biru '3 - Luminance 'jenis2 histogram '0 - garis '1 - grafik penuh Private Sub DrawHistogram(ByVal hType As Long, ByVal drawMethod As Long) picH.Cls Dim tHeight As Long tHeight = picH.ScaleHeight - 2 Dim LastX As Long, LastY As Long

Select Case hType Case 0

DrawGradient picH, RGB(0, 0, 0), RGB(255, 0, 0) picH.ForeColor = RGB(255, 255, 255) Case 1 DrawGradient picH, RGB(0, 0, 0), RGB(0, 255, 0) picH.ForeColor = RGB(255, 255, 255) Case 2 DrawGradient picH, RGB(0, 0, 0), RGB(0, 0, 255) picH.ForeColor = RGB(255, 255, 255) Case 3 DrawGradient picH, RGB(0, 0, 0), RGB(255, 255, 255) picH.ForeColor = RGB(255, 0, 0) End Select LastX = 0 LastY = tHeight - (hData(hType, 0) / hMax(hType)) * tHeight For x = 0 To 255 y = tHeight - (hData(hType, x) / hMax(hType)) * tHeight 'untuk garis If drawMethod = 0 Then picH.Line (LastX, LastY)-(x, y) LastX = x LastY = y 'untuk grafik penuh ElseIf drawMethod = 1 Then picH.Line (x, tHeight)-(x, y) End If Next x 'jumlah total pixel Dim fDraw As New FastDrawing Dim iWidth As Long, iHeight As Long iWidth = fDraw.GetImageWidth(frmAdd.ModPicture) iHeight = fDraw.GetImageHeight(frmAdd.ModPicture) lblTotalPixels.Caption = "Total pixel: " & (iWidth * iHeight) 'pixel terbanyak lblMaxCount.Caption = hMax(hType) End Sub Private Sub Form_Terminate() Unload Me End Sub Private Sub picH_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single) lblLevel.Caption = x lblCount.Caption = hData(lastHistSource, x) End Sub

Public Sub GenerateHistogram() Dim ImageData() As Byte Dim iWidth As Long, iHeight As Long Dim fDraw As New FastDrawing iWidth = fDraw.GetImageWidth(frmAdd.ModPicture) iHeight = fDraw.GetImageHeight(frmAdd.ModPicture) fDraw.GetImageData2D frmAdd.ModPicture, ImageData() Dim r As Long, g As Long, b As Long, L As Long For x = 0 To 3 hMax(x) = 0 For y = 0 To 255 hData(x, y) = 0 Next y Next x Dim QuickX As Long For x = 0 To iWidth - 1 QuickX = x * 3 For y = 0 To iHeight - 1 r = ImageData(QuickX + 2, y) g = ImageData(QuickX + 1, y) b = ImageData(QuickX, y) L = (r + g + b) \ 3 hData(0, r) = hData(0, r) + 1 hData(1, g) = hData(1, g) + 1 hData(2, b) = hData(2, b) + 1 hData(3, L) = hData(3, L) + 1 Next y Next x For x = 0 To 255 'merah If hData(0, x) > hMax(0) Then 'hijau If hData(1, x) > hMax(1) Then 'biru If hData(2, x) > hMax(2) Then 'Luminance If hData(3, x) > hMax(3) Then Next x

hMax(0) = hData(0, x) hMax(1) = hData(1, x) hMax(2) = hData(2, x) hMax(3) = hData(3, x)

DrawHistogram lastHistSource, lastHistMethod End Sub

1.1.8 Listing Sub Subprogram Perbandingan Pixel Citra Penampung dengan Citra Hasil Steganografi
Option Explicit

Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim

WarnaPix As Integer mmm As Double nnn As Double pix As Long pix1 As Long r As Integer g As Integer b As Integer r1 As Integer g1 As Integer b1 As Integer gr As Integer gr1 As Integer Mx As Double My As Double Nx As Double Ny As Double L As Double M As Double N As Double Hal

Private Sub ComboWarna_Click() ListRGB.Clear Select Case ComboWarna Case "Merah" Hitung_Merah Case "Hijau" Hitung_Hijau Case "Biru" Hitung_Biru Case "Luminance" Hitung_Luminance End Select End Sub Private Sub Form_Load() ComboWarna.Clear ComboWarna.AddItem ComboWarna.AddItem ComboWarna.AddItem ComboWarna.AddItem End Sub Private Sub Hitung_Merah() L = 0 For mmm = 0 To frmAdd.TheImage.ScaleHeight For nnn = 0 To frmAdd.TheImage.ScaleWidth pix = frmAdd.TheImage.Point(nnn, mmm) pix1 = frmAdd.Hasil.Point(nnn, mmm) r = pix And RGB(255, 0, 0) r1 = pix1 And RGB(255, 0, 0)

"Luminance" "Merah" "Hijau" "Biru"

If r <> r1 Then Hal = "Posisi(x,y) :" & "(" & Str(nnn) & "," & Str(mmm) & ") " & " Citra Asli=" & Str(r) & " Citra Hasil Steganografi = " & Str(r1) ListRGB.AddItem Hal L = L + 1 If L = 100 Then Exit Sub End If Next Next End Sub Private Sub Hitung_Hijau() L = 0 For mmm = 0 To frmAdd.TheImage.ScaleHeight For nnn = 0 To frmAdd.TheImage.ScaleWidth pix = frmAdd.TheImage.Point(nnn, mmm) pix1 = frmAdd.Hasil.Point(nnn, mmm) g = Int((pix And RGB(0, 255, 0)) / 256) g1 = Int((pix1 And RGB(0, 255, 0)) / 256) If g <> g1 Then Hal = "Posisi(x,y) :" & "(" & Str(nnn) & "," & Str(mmm) & ") " & " Citra Asli=" & Str(g) & " Citra Hasil Steganografi = " & Str(g1) ListRGB.AddItem Hal L = L + 1 If L = 100 Then Exit Sub End If Next Next End Sub Private Sub Hitung_Biru() L = 0 For mmm = 0 To frmAdd.TheImage.ScaleHeight For nnn = 0 To frmAdd.TheImage.ScaleWidth pix = frmAdd.TheImage.Point(nnn, mmm) pix1 = frmAdd.Hasil.Point(nnn, mmm) b = Int(Int((pix And RGB(0, 0, 255)) / 256) / 256) b1 = Int(Int((pix1 And RGB(0, 0, 255)) / 256) / 256) If b <> b1 Then Hal = "Posisi(x,y) :" & "(" & Str(nnn) & "," & Str(mmm) & ") " & " Citra Asli=" & Str(b) & " Citra Hasil Steganografi = " & Str(b1) ListRGB.AddItem Hal L = L + 1 If L = 100 Then Exit Sub End If Next

Next End Sub Private Sub Hitung_Luminance() L = 0 For mmm = 0 To frmAdd.TheImage.ScaleHeight For nnn = 0 To frmAdd.TheImage.ScaleWidth pix = frmAdd.TheImage.Point(nnn, mmm) pix1 = frmAdd.Hasil.Point(nnn, mmm) r = pix And RGB(255, 0, 0) g = Int((pix And RGB(0, 255, 0)) / 256) b = Int(Int((pix And RGB(0, 0, 255)) / 256) / 256) r1 = pix1 And RGB(255, 0, 0) g1 = Int((pix1 And RGB(0, 255, 0)) / 256) b1 = Int(Int((pix1 And RGB(0, 0, 255)) / 256) / 256) gr = (r + g + b) / 3 gr1 = (r1 + g1 + b1) / 3 If gr <> gr1 Then Hal = "Posisi(x,y) :" & "(" & Str(nnn) & "," & Str(mmm) & ") " & " Citra Asli=" & Str(gr) & " Citra Hasil Steganografi = " & Str(gr1) ListRGB.AddItem Hal L = L + 1 If L = 100 Then Exit Sub End If Next Next End Sub

1.1.9 Listing Sub Subprogram Perbandingan Pixel Citra Citra Hasil Steganografi dengan Termodifikasi
Option Explicit Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim WarnaPix As Integer mmm As Double nnn As Double pix As Long pix1 As Long r As Integer g As Integer b As Integer r1 As Integer g1 As Integer b1 As Integer gr As Integer gr1 As Integer Mx As Double My As Double Nx As Double Ny As Double

Dim Dim Dim Dim

L As Double M As Double N As Double Hal

Private Sub ComboWarna_Click() ListRGB.Clear Select Case ComboWarna Case "Merah" Hitung_Merah Case "Hijau" Hitung_Hijau Case "Biru" Hitung_Biru Case "Luminance" Hitung_Luminance End Select End Sub Private Sub Form_Load() ComboWarna.Clear ComboWarna.AddItem ComboWarna.AddItem ComboWarna.AddItem ComboWarna.AddItem End Sub Private Sub Hitung_Merah() L = 0 For mmm = 0 To frmAdd.Hasil.ScaleHeight For nnn = 0 To frmAdd.Hasil.ScaleWidth pix = frmAdd.Hasil.Point(nnn, mmm) pix1 = frmAdd.ModPicture.Point(nnn, mmm) r = pix And RGB(255, 0, 0) r1 = pix1 And RGB(255, 0, 0) If r <> r1 Then Hal = "Posisi(x,y) :" & "(" & Str(nnn) & "," & Str(mmm) & ") " & " Citra Asli=" & Str(r) & " Citra Steganografi Termodfikasi= " & Str(r1) ListRGB.AddItem Hal L = L + 1 If L = 100 Then Exit Sub End If Next Next End Sub Private Sub Hitung_Hijau() L = 0 For mmm = 0 To frmAdd.Hasil.ScaleHeight For nnn = 0 To frmAdd.Hasil.ScaleWidth

"Luminance" "Merah" "Hijau" "Biru"

pix = frmAdd.Hasil.Point(nnn, mmm) pix1 = frmAdd.ModPicture.Point(nnn, mmm) g = Int((pix And RGB(0, 255, 0)) / 256) g1 = Int((pix1 And RGB(0, 255, 0)) / 256) If g <> g1 Then Hal = "Posisi(x,y) :" & "(" & Str(nnn) & "," & Str(mmm) & ") " & " Citra Asli=" & Str(g) & " Citra Steganografi Termodfikasi= " & Str(g1) ListRGB.AddItem Hal L = L + 1 If L = 100 Then Exit Sub End If Next Next End Sub Private Sub Hitung_Biru() L = 0 For mmm = 0 To frmAdd.Hasil.ScaleHeight For nnn = 0 To frmAdd.Hasil.ScaleWidth pix = frmAdd.Hasil.Point(nnn, mmm) pix1 = frmAdd.ModPicture.Point(nnn, mmm) b = Int(Int((pix And RGB(0, 0, 255)) / 256) / 256) b1 = Int(Int((pix1 And RGB(0, 0, 255)) / 256) / 256) If b <> b1 Then Hal = "Posisi(x,y) :" & "(" & Str(nnn) & "," & Str(mmm) & ") " & " Citra Asli=" & Str(b) & " Citra Steganografi Termodfikasi= " & Str(b1) ListRGB.AddItem Hal L = L + 1 If L = 100 Then Exit Sub End If Next Next End Sub Private Sub Hitung_Luminance() L = 0 For mmm = 0 To frmAdd.Hasil.ScaleHeight For nnn = 0 To frmAdd.Hasil.ScaleWidth pix = frmAdd.Hasil.Point(nnn, mmm) pix1 = frmAdd.ModPicture.Point(nnn, mmm) r = pix And RGB(255, 0, 0) g = Int((pix And RGB(0, 255, 0)) / 256) b = Int(Int((pix And RGB(0, 0, 255)) / 256) / 256) r1 = pix1 And RGB(255, 0, 0) g1 = Int((pix1 And RGB(0, 255, 0)) / 256)

b1 = Int(Int((pix1 And RGB(0, 0, 255)) / 256) / 256) gr = (r + g + b) / 3 gr1 = (r1 + g1 + b1) / 3 If gr <> gr1 Then Hal = "Posisi(x,y) :" & "(" & Str(nnn) & "," & Str(mmm) & ") " & " Citra Asli=" & Str(gr) & " Citra Steganografi Termodfikasi= " & Str(gr1) ListRGB.AddItem Hal L = L + 1 If L = 100 Then Exit Sub End If Next Next End Sub

1.1.10 Listing Sub Subprogram MES1
Private Sub MSE1_Click() RRR = 0 For MM = 0 To TheImage.Height Step 15 For NN = 0 To TheImage.Width Step 15 Pixel1 = TheImage.Point(MM, NN) Rred1 = Pixel1 And RGB(255, 0, 0) Ggreen1 = Int((Pixel1 And RGB(0, 255, 0)) / 256) Bblue1 = Int(Int((Pixel1 And RGB(0, 0, 255)) / 256) / 256) Pixel12 = Hasil.Point(MM, NN) Rred2 = Pixel12 And RGB(255, 0, 0) Ggreen2 = Int((Pixel12 And RGB(0, 255, 0)) / 256) Bblue2 = Int(Int((Pixel12 And RGB(0, 0, 255)) / 256) / 256) RR1 = (Rred1 - Rred2) ^ 2 GG1 = (Ggreen1 - Ggreen2) ^ 2 BB1 = (Bblue1 - Bblue2) ^ 2 QQQ = (RR1 + GG1 + BB1) / 3 RRR = RRR + QQQ Next Next OOO = TheImage.Height * TheImage.Width PPP = RRR / OOO HslMse1.Text = PPP End Sub

1.1.11 Listing Sub Subprogram MES2
Private Sub MSE2_Click() RRR = 0 For MM = 0 To TheImage.Height Step 15

For NN = 0 To TheImage.Width Step 15 Pixel1 = Hasil.Point(MM, NN) Rred1 = Pixel1 And RGB(255, 0, 0) Ggreen1 = Int((Pixel1 And RGB(0, 255, 0)) / 256) Bblue1 = Int(Int((Pixel1 And RGB(0, 0, 255)) / 256) / 256) Pixel12 = ModPicture.Point(MM, NN) Rred2 = Pixel12 And RGB(255, 0, 0) Ggreen2 = Int((Pixel12 And RGB(0, 255, 0)) / 256) Bblue2 = Int(Int((Pixel12 And RGB(0, 0, 255)) / 256) / 256) RR1 = (Rred1 - Rred2) ^ 2 GG1 = (Ggreen1 - Ggreen2) ^ 2 BB1 = (Bblue1 - Bblue2) ^ 2 QQQ = (RR1 + GG1 + BB1) / 3 RRR = RRR + QQQ Next Next OOO = TheImage.Height * TheImage.Width PPP1 = RRR / OOO HslMse2.Text = PPP1 End Sub

1.1.12 Listing Sub Subprogram PSNR1
Private Sub PSNR1_Click() If PPP > 0 Then HslPSNR1.Text = (10 * Log(255 / Sqr(PPP)) / Log(10)) Else MsgBox "PSNR = Infinitif !", , "Tugas Akhir" Exit Sub End If End Sub

1.1.13 Listing Sub Subprogram PSNR2
Private Sub PSNR2_Click() If PPP1 > 0 Then HslPSNR2.Text = (10 * Log(255 / Sqr(PPP1)) / Log(10)) Else MsgBox "PSNR = Infinitif !", , "Tugas Akhir" Exit Sub End If End Sub

1.1.14 Listing Sub Subprogram Modifikasi Darken
Private Sub Darken_Click() mPad = 2 ModPicture.Picture = LoadPicture(Files.Filename) Label4 = "Nama: " & Files.FileTitle Label3 = "Ukuran: " & clsStega.ImgSize

Label2 = "Resolusi: " & clsStega.ImgRes & " bit" m_Millimeter = ScaleX(100, vbPixels, vbMillimeters) ToW ToH InW InH = = = = Me.ScaleWidth - mPad - mPad Me.ScaleHeight - mPad - mPad ModPicture.Picture.Width / m_Millimeter ModPicture.Picture.Height / m_Millimeter HS2.TOp + mPad VS2.Left + mPad = ToH - HS2.Height = ToW - VS2.Width

VS2.Max = InH HS2.Max = InW VS2.LargeChange HS2.LargeChange

Center3.Enabled = True On Error Resume Next QD = InputBox("Masukkan Nilai Modifikasi darken", "", "30") If QD = "" Then Exit Sub For YYY = 0 To ModPicture.ScaleHeight - 1 For XXX = 0 To ModPicture.ScaleWidth - 1 Pixel = GetPixel(ModPicture.hdc, XXX, YYY) GetRGB Pixel Rred = Rred - QD Ggreen = Ggreen - QD Bblue = Bblue - QD SetPixelV ModPicture.hdc, XXX, YYY, RGB(Rred, Ggreen, Bblue) Next ModPicture.Refresh Next ModPicture.Refresh Hysto3.Enabled = True GoPixel1.Enabled = True MSE2.Enabled = True PSNR2.Enabled = True MsgBox "Modifikasi Citra Selesai!", , "Tugas Akhir" SvModPicture.Enabled = True End Sub

1.1.15 Listing Sub Subprogram Modifikasi Fog
Private Sub Fog_Click() mPad = 2 ModPicture.Picture = LoadPicture(Files.Filename) Label4 = "Nama: " & Files.FileTitle Label3 = "Ukuran: " & clsStega.ImgSize Label2 = "Resolusi: " & clsStega.ImgRes & " bit" m_Millimeter = ScaleX(100, vbPixels, vbMillimeters) ToW = Me.ScaleWidth - mPad - mPad

ToH = Me.ScaleHeight - mPad - mPad InW = ModPicture.Picture.Width / m_Millimeter InH = ModPicture.Picture.Height / m_Millimeter VS2.Max = InH HS2.Max = InW VS2.LargeChange HS2.LargeChange HS2.TOp + mPad VS2.Left + mPad = ToH - HS2.Height = ToW - VS2.Width

Center3.Enabled = True On Error Resume Next QF = InputBox("Masukkan Nilai Modifikasi Fog", "") If QF = "" Then Exit Sub For YYY = 0 To ModPicture.ScaleHeight - 1 For XXX = 0 To ModPicture.ScaleWidth - 1 Pixel = GetPixel(ModPicture.hdc, XXX, YYY) GetRGB Pixel

If Val(Rred) > 127 Then Rred = Rred - QF If Rred < 127 Then Rred = 127 Else Rred = Rred + QF If Rred > 127 Then Rred = 127 End If

If Val(Ggreen) > 127 Then Ggreen = Ggreen - QF If Ggreen < 127 Then Ggreen = 127 Else Ggreen = Ggreen + QF If Ggreen > 127 Then Ggreen = 127 End If

If Val(Bblue) > 127 Then Bblue = Bblue - QF If Bblue < 127 Then Bblue = 127 Else Bblue = Bblue + QF If Bblue > 127 Then Bblue = 127 End If

SetPixelV ModPicture.hdc, XXX, YYY, RGB(Rred, Ggreen, Bblue) Next ModPicture.Refresh Next ModPicture.Refresh Hysto3.Enabled = True GoPixel1.Enabled = True MSE2.Enabled = True

PSNR2.Enabled = True MsgBox "Modifikasi Citra Selesai!", , "Tugas Akhir" SvModPicture.Enabled = True End Sub

1.1.16 Listing Sub Subprogram Modifikasi Invert
Private Sub Invert_Click() mPad = 2 ModPicture.Picture = LoadPicture(Files.Filename) Label4 = "Nama: " & Files.FileTitle Label3 = "Ukuran: " & clsStega.ImgSize Label2 = "Resolusi: " & clsStega.ImgRes & " bit" m_Millimeter = ScaleX(100, vbPixels, vbMillimeters) ToW ToH InW InH = = = = Me.ScaleWidth - mPad - mPad Me.ScaleHeight - mPad - mPad ModPicture.Picture.Width / m_Millimeter ModPicture.Picture.Height / m_Millimeter HS2.TOp + mPad VS2.Left + mPad = ToH - HS2.Height = ToW - VS2.Width

VS2.Max = InH HS2.Max = InW VS2.LargeChange HS2.LargeChange

Center3.Enabled = True On Error Resume Next For YYY = 0 To ModPicture.ScaleHeight - 1 For XXX = 0 To ModPicture.ScaleWidth - 1 Pixel = GetPixel(ModPicture.hdc, XXX, YYY) GetRGB Pixel Rred = 255 - Rred Ggreen = 255 - Ggreen Bblue = 255 - Bblue

SetPixelV ModPicture.hdc, XXX, YYY, RGB(Rred, Ggreen, Bblue) Next ModPicture.Refresh Next ModPicture.Refresh Hysto3.Enabled = True GoPixel1.Enabled = True MSE2.Enabled = True PSNR2.Enabled = True MsgBox "Modifikasi Citra Selesai!", , "Tugas Akhir" SvModPicture.Enabled = True End Sub

1.1.17 Listing Sub Subprogram Modifikasi Lighten
Private Sub Lighten_Click() mPad = 2 ModPicture.Picture = LoadPicture(Files.Filename) Label4 = "Nama: " & Files.FileTitle Label3 = "Ukuran: " & clsStega.ImgSize Label2 = "Resolusi: " & clsStega.ImgRes & " bit" m_Millimeter = ScaleX(100, vbPixels, vbMillimeters) ToW ToH InW InH = = = = Me.ScaleWidth - mPad - mPad Me.ScaleHeight - mPad - mPad ModPicture.Picture.Width / m_Millimeter ModPicture.Picture.Height / m_Millimeter HS2.TOp + mPad VS2.Left + mPad = ToH - HS2.Height = ToW - VS2.Width

VS2.Max = InH HS2.Max = InW VS2.LargeChange HS2.LargeChange

Center3.Enabled = True On Error Resume Next QL = InputBox("Masukkan Nilai Modifikasi lighten", "") If QL = "" Then Exit Sub For YYY = 0 To ModPicture.ScaleHeight - 1 For XXX = 0 To ModPicture.ScaleWidth - 1 Pixel = GetPixel(ModPicture.hdc, XXX, YYY) GetRGB Pixel Rred = Rred + QL Ggreen = Ggreen + QL Bblue = Bblue + QL SetPixelV ModPicture.hdc, XXX, YYY, RGB(Rred, Ggreen, Bblue) Next ModPicture.Refresh Next ModPicture.Refresh Hysto3.Enabled = True GoPixel1.Enabled = True MSE2.Enabled = True PSNR2.Enabled = True MsgBox "Modifikasi Citra Selesai!", , "Tugas Akhir" SvModPicture.Enabled = True End Sub

1.1.18 Listing Sub Subprogram Modifikasi Mirror Horizontal
Private Sub MirrorH_Click() mPad = 2 ModPicture.Picture = LoadPicture(Files.Filename)

Label4 = "Nama: " & Files.FileTitle Label3 = "Ukuran: " & clsStega.ImgSize Label2 = "Resolusi: " & clsStega.ImgRes & " bit" m_Millimeter = ScaleX(100, vbPixels, vbMillimeters) ToW ToH InW InH = = = = Me.ScaleWidth - mPad - mPad Me.ScaleHeight - mPad - mPad ModPicture.Picture.Width / m_Millimeter ModPicture.Picture.Height / m_Millimeter HS2.TOp + mPad VS2.Left + mPad = ToH - HS2.Height = ToW - VS2.Width

VS2.Max = InH HS2.Max = InW VS2.LargeChange HS2.LargeChange

Center3.Enabled = True On Error Resume Next TempPic.Width = ModPicture.Width TempPic.Height = ModPicture.Height For YYY = 0 To ModPicture.ScaleHeight - 1 For XXX = 0 To ModPicture.ScaleWidth - 1 Pixel = GetPixel(ModPicture.hdc, XXX, YYY) SetPixelV TempPic.hdc, ModPicture.ScaleWidth - (XXX + 1), YYY, Pixel Next ModPicture.Refresh Next BitBlt ModPicture.hdc, 0, 0, TempPic.ScaleWidth - 1, TempPic.ScaleHeight - 1, TempPic.hdc, 0, 0, &HCC0020 ModPicture.Refresh Hysto3.Enabled = True GoPixel1.Enabled = True MSE2.Enabled = True PSNR2.Enabled = True MsgBox "Modifikasi Citra Selesai!", , "Tugas Akhir" SvModPicture.Enabled = True End Sub

1.1.19 Listing Sub Subprogram Modifikasi Mirror Vertical
Private Sub MirrorV_Click() mPad = 2 ModPicture.Picture = LoadPicture(Files.Filename) Label4 = "Nama: " & Files.FileTitle Label3 = "Ukuran: " & clsStega.ImgSize Label2 = "Resolusi: " & clsStega.ImgRes & " bit" m_Millimeter = ScaleX(100, vbPixels, vbMillimeters)

ToW ToH InW InH

= = = =

Me.ScaleWidth - mPad - mPad Me.ScaleHeight - mPad - mPad ModPicture.Picture.Width / m_Millimeter ModPicture.Picture.Height / m_Millimeter HS2.TOp + mPad VS2.Left + mPad = ToH - HS2.Height = ToW - VS2.Width

VS2.Max = InH HS2.Max = InW VS2.LargeChange HS2.LargeChange

Center3.Enabled = True On Error Resume Next TempPic.Width = ModPicture.Width TempPic.Height = ModPicture.Height For YYY = 0 To ModPicture.ScaleHeight - 1 For XXX = 0 To ModPicture.ScaleWidth - 1 Pixel = GetPixel(ModPicture.hdc, XXX, YYY) SetPixelV TempPic.hdc, XXX, ModPicture.ScaleHeight - (YYY + 1), Pixel Next ModPicture.Refresh Next BitBlt ModPicture.hdc, 0, 0, TempPic.ScaleWidth - 1, TempPic.ScaleHeight - 1, TempPic.hdc, 0, 0, &HCC0020 ModPicture.Refresh Hysto3.Enabled = True GoPixel1.Enabled = True MSE2.Enabled = True PSNR2.Enabled = True MsgBox "Modifikasi Citra Selesai!", , "Tugas Akhir" SvModPicture.Enabled = True End Sub

1.1.20 Listing Sub Subprogram Simpan Citra Termodifikasi
Private Sub SvModPicture_Click() CD.CancelError = True On Error GoTo ja CD.Filter = "Bitmap|*.bmp" CD.ShowSave SavePicture ModPicture.Image, CD.Filename Label4 = "Nama: " & CD.FileTitle Label3 = "Ukuran: " & clsStega.ImgSize Label2 = "Resolusi: " & clsStega.ImgRes & " bit" MsgBox "Menyimpan Citra Hasil Steganografi Termodifikasi Sukses!", , "Tugas Akhir" Exit Sub ja: Exit Sub End Sub

1.2 LISTING SUBPROGRAM DEKRIPSI
Option Explicit Dim ToW&, ToH&, InW&, InH&, mPad& Dim DSImageFile$ Dim strImageFile$ 'Gambar utama dimana file rahasia telah ditambahkan Dim m_Millimeter& Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim mmm As Double nnn As Double OOO As Double PPP As Double PPP1 As Double RRR As Double MseSteg As Double MseFog As Double MseInv As Double MseLight As Double MseDark As Double MseRot As Double MseMirV As Double MseMirH As Double QQQ As Double Htng As Byte

Dim Rred As Double Dim Ggreen As Double Dim Bblue As Double Dim Rred0 As Integer Dim Ggreen0 As Integer Dim Bblue0 As Integer Dim Rred1 As Integer Dim Ggreen1 As Integer Dim Bblue1 As Integer Dim Rred2 As Integer Dim Ggreen2 As Integer Dim Bblue2 As Integer Dim RR1 As Double Dim GG1 As Double Dim BB1 As Double Dim Dim Dim Dim Pixel As Long Pixel0 As Long Pixel1 As Long Pixel12 As Long

Dim Q As String Dim Qnap As Byte

Dim Qnjl As Byte Dim Temp As Integer Dim XXX As Integer Dim YYY As Integer Const MAX_STEPS = 2 Dim currentStep& Dim imgIco% Dim WithEvents clsStegaRead As ClsStegano 'class stegano Private Sub Center_Click() HS.Value = HS.Max / 2 VS.Value = VS.Max / 2 End Sub Private Sub Center1_Click() HS1.Value = HS1.Max / 2 VS1.Value = VS1.Max / 2 End Sub Private Sub clsStegaRead_SomeError(strDescription As String) MsgBox strDescription, , "Tugas Akhir" End Sub Private Sub clsStegaRead_StatusChanged(prcDone As Long, strStatus As String) frmLoad.ProgBar.Value = prcDone frmLoad.lbStatus = strStatus End Sub Private Sub VS_Change() TheImage.Move TheImage.Left, -VS.Value End Sub Private Sub VS_Scroll() TheImage.Move TheImage.Left, -VS.Value End Sub Private Sub VS1_Scroll() DSAsli.Move DSAsli.Left, -VS1.Value End Sub

Private Sub VS1_Change() DSAsli.Move DSAsli.Left, -VS1.Value End Sub

Private Sub VS2_Scroll() DSDeskip.Move DSDeskip.Left, -VS2.Value End Sub

Private Sub VS2_Change()

DSDeskip.Move DSDeskip.Left, -VS2.Value End Sub Private Sub GetRGB(ByVal Col As String) On Error Resume Next Bblue = Col \ (256 ^ 2) Ggreen = (Col - Bblue * 256 ^ 2) \ 256 Rred = (Col - Bblue * 256 ^ 2 - Ggreen * 256) '\ 256 End Sub Private Sub GetRGB0(ByVal Col As String) On Error Resume Next Bblue0 = Col \ (256 ^ 2) Ggreen0 = (Col - Bblue0 * 256 ^ 2) \ 256 Rred0 = (Col - Bblue0 * 256 ^ 2 - Ggreen0 * 256) '\ 256 End Sub Private Sub cmdFinish_Click() Unload Me End Sub Private Sub Center2_Click() HS2.Value = HS2.Max / 2 VS2.Value = VS2.Max / 2 End Sub Private Sub Form_Load() currentStep = 0 Set clsStegaRead = New ClsStegano m_Millimeter = ScaleX(100, vbPixels, vbMillimeters) End Sub Private Sub Form_Unload(Cancel As Integer) Dim It As ListItem For Each It In lvwFilesAdded.ListItems Kill clsStegaRead(It.Key).FileName Next Set clsStegaRead = Nothing frmMain.Show End Sub Private Sub Gopixel_Click() FormPixel2.Show vbModeless, Me End Sub Private Sub HS_Change() TheImage.Move -HS.Value End Sub Private Sub HS_Scroll() TheImage.Move -HS.Value End Sub Private Sub HS1_Scroll() DSAsli.Move -HS1.Value End Sub

Private Sub HS1_Change() DSAsli.Move -HS1.Value End Sub Private Sub HS2_Scroll() DSDeskip.Move -HS2.Value End Sub Private Sub HS2_Change() DSDeskip.Move -HS2.Value End Sub

Private Sub HslPSNR1_Change() End Sub Private Sub Hysto_Click() frmHistogram3.Show vbModeless, Me End Sub Private Sub Hysto2_Click() frmHistogram4.Show vbModeless, Me End Sub Private Sub MyButton1_Click() CD.Filter = "Image File|*.bmp" CD.ShowOpen DSImageFile = CD.FileName DSDeskip.Picture = LoadPicture(DSImageFile) clsStegaRead.ImageFile1 = DSImageFile Label3 = "Nama: " & CD.FileTitle Label2 = "Ukuran: " & clsStegaRead.ImgSize Label1 = "Resolusi: " & clsStegaRead.ImgRes & " bit" ToW ToH InW InH = = = = Me.ScaleWidth - mPad - mPad Me.ScaleHeight - mPad - mPad DSDeskip.Picture.Width / m_Millimeter DSDeskip.Picture.Height / m_Millimeter HS2.TOp + mPad VS2.Left + mPad = ToH - HS2.Height = ToW - VS2.Width

VS2.Max = InH HS2.Max = InW VS2.LargeChange HS2.LargeChange End Sub

2.1.1 Listing Subprogram Buka Citra Steganografi
Private Sub cmdTarget_Click() Dim ToW&, ToH&, InW&, InH&, mPad& mPad = 2 Files.Filter = "Image File|*.bmp"

Files.ShowOpen strImageFile = Files.FileName If strImageFile <> "" And VBA.Right$(strImageFile, 4) = ".bmp" Then TheImage.Picture = LoadPicture(strImageFile) clsStegaRead.ImageFile = strImageFile lbImgName = "Nama: " & Files.FileTitle lbImgSize = "Ukuran: " & clsStegaRead.ImgSize lbImgRes = "Resolusi: " & clsStegaRead.ImgRes & " bit" ToW ToH InW InH = = = = Me.ScaleWidth - mPad - mPad Me.ScaleHeight - mPad - mPad TheImage.Picture.Width / m_Millimeter TheImage.Picture.Height / m_Millimeter HS.TOp + mPad VS.Left + mPad = ToH - HS.Height = ToW - VS.Width

VS.Max = InH HS.Max = InW VS.LargeChange HS.LargeChange

cmdTarget.Caption = "Buka Citra Lain" lbStep.Caption = "" Center.Enabled = True Detect1.Enabled = True Else MsgBox "Tidak Memilih Gambar", vbCritical, "Kesalahan" Exit Sub End If End Sub

2.1.2 Listing Sub Subprogram Deteksi Modifikasi
Private Sub Detect1_click() Pixel1 = TempPic2.Point(0, 0) Rred1 = Pixel1 And RGB(255, 0, 0)

Pixel12 = TheImage.Point(0, 0) Rred2 = Pixel12 And RGB(255, 0, 0)

If Rred2 = 255 - Rred1 Then MsgBox "Citra Termodifikasi dengan Invert !", , "Tugas Akhir" Invert.Enabled = True Detect1.Enabled = False cmdTarget.Enabled = False Exit Sub End If Pixel1 = TempPic2.Point(1, 0) Rred1 = Pixel1 And RGB(255, 0, 0)

Pixel12 = TheImage.Point(1, 0) Rred2 = Pixel12 And RGB(255, 0, 0)

If Rred2 = 127 Then MsgBox "Citra Termodifikasi dengan Fog!", , "Tugas Akhir" Fog.Enabled = True Detect1.Enabled = False cmdTarget.Enabled = False Exit Sub End If If Rred2 = (11 ^ 2) - 5 Then MsgBox "Citra Termodifikasi dengan Mirror Horizontal!", , "Tugas Akhir" MirrorH.Enabled = True Detect1.Enabled = False cmdTarget.Enabled = False Exit Sub End If If Rred2 = (4 ^ 2) + 3 Then MsgBox "Citra Termodifikasi dengan Mirror Vertikal!", , "Tugas Akhir" MirrorV.Enabled = True Detect1.Enabled = False cmdTarget.Enabled = False Exit Sub End If

If Rred2 < Rred1 Then MsgBox "Citra Termodifikasi dengan Darken !", , "Tugas Akhir" Darken.Enabled = True Detect1.Enabled = False cmdTarget.Enabled = False Exit Sub End If

If Rred2 > Rred1 Then MsgBox "Citra Termodifikasi dengan Lighten !", , "Tugas Akhir" Lighten.Enabled = True Detect1.Enabled = False cmdTarget.Enabled = False Exit Sub End If

If Rred2 = Rred1 Then MsgBox "Citra tidak Termodifikasi!", , "Tugas Akhir"

Detect.Enabled = True Detect1.Enabled = False cmdTarget.Enabled = False Exit Sub End If End Sub

2.1.3 Listing Sub Subprogram Re-Modifikasi
Private Sub Darken_Click() On Error Resume Next Qnap = 0 Qnjl = 1 Pixel = GetPixel(TheImage.HDC, 0, 0) GetRGB Pixel Pixel0 = GetPixel(TempPic2.HDC, 0, 0) GetRGB0 Pixel0 If Abs(Rred0 - Rred) Mod 2 = 0 Then For YYY = 0 To TheImage.ScaleHeight - 1 For XXX = 0 To TheImage.ScaleWidth - 1 Pixel = GetPixel(TheImage.HDC, XXX, YYY) GetRGB Pixel Rred = Abs(Rred - Qnap) Ggreen = Abs(Ggreen - Qnap) Bblue = Abs(Bblue - Qnap) SetPixelV TheImage.HDC, XXX, YYY, RGB(Rred, Ggreen, Bblue) Next TheImage.Refresh Next TheImage.Refresh Else For YYY = 0 To TheImage.ScaleHeight - 1 For XXX = 0 To TheImage.ScaleWidth - 1 Pixel = GetPixel(TheImage.HDC, XXX, YYY) GetRGB Pixel Rred = Abs(Rred - Qnjl) Ggreen = Abs(Ggreen - Qnjl) Bblue = Abs(Bblue - Qnjl) SetPixelV TheImage.HDC, XXX, YYY, RGB(Rred, Ggreen, Bblue) Next TheImage.Refresh Next TheImage.Refresh End If SavePicture TheImage.Image, Files.FileName

strImageFile = Files.FileName clsStegaRead.ImageFile = strImageFile lbImgName = "Nama: " & Files.FileTitle lbImgSize = "Ukuran: " & clsStegaRead.ImgSize lbImgRes = "Resolusi: " & clsStegaRead.ImgRes & " bit" MsgBox "Re-Modifikasi Citra Selesai!", , "Tugas Akhir" Detect.Enabled = True Darken.Enabled = False End Sub Private Sub Fog_Click() On Error Resume Next Qnap = 0 Qnjl = 1

Pixel = GetPixel(TheImage.HDC, 0, 0) GetRGB Pixel Pixel0 = GetPixel(TempPic2.HDC, 0, 0) GetRGB0 Pixel0 If Abs(Bblue0 - Bblue) Mod 2 = 0 Then For YYY = 0 To TheImage.ScaleHeight - 1 For XXX = 0 To TheImage.ScaleWidth - 1 Pixel = GetPixel(TheImage.HDC, XXX, YYY) GetRGB Pixel

If Val(Rred) > 127 Then Rred = Abs(Rred - Qnap) If Rred < 127 Then Rred = 127 Else Rred = Rred + Qnap If Rred > 127 Then Rred = 127 End If

If Val(Ggreen) > 127 Then Ggreen = Abs(Ggreen - Qnap) If Ggreen < 127 Then Ggreen = 127 Else Ggreen = Ggreen + Qnap If Ggreen > 127 Then Ggreen = 127 End If

If Val(Bblue) > 127 Then Bblue = Abs(Bblue - Qnap) If Bblue < 127 Then Bblue = 127 Else

Bblue = Bblue + Qnap If Bblue > 127 Then Bblue = 127 End If SetPixelV TheImage.HDC, XXX, YYY, RGB(Rred, Ggreen, Bblue) Next TheImage.Refresh Next TheImage.Refresh

Else For YYY = 0 To TheImage.ScaleHeight - 1 For XXX = 0 To TheImage.ScaleWidth - 1 Pixel = GetPixel(TheImage.HDC, XXX, YYY) GetRGB Pixel

If Val(Rred) > 127 Then Rred = Abs(Rred - Qnjl) If Rred < 127 Then Rred = 127 Else Rred = Rred + Qnjl If Rred > 127 Then Rred = 127 End If

If Val(Ggreen) > 127 Then Ggreen = Abs(Ggreen - Qnjl) If Ggreen < 127 Then Ggreen = 127 Else Ggreen = Ggreen + Qnjl If Ggreen > 127 Then Ggreen = 127 End If

If Val(Bblue) > 127 Then Bblue = Abs(Bblue - Qnjl) If Bblue < 127 Then Bblue = 127 Else Bblue = Bblue + Qnjl If Bblue > 127 Then Bblue = 127 End If SetPixelV TheImage.HDC, XXX, YYY, RGB(Rred, Ggreen, Bblue) Next TheImage.Refresh Next TheImage.Refresh End If

SavePicture TheImage.Image, Files.FileName

strImageFile = Files.FileName clsStegaRead.ImageFile = strImageFile lbImgName = "Nama: " & Files.FileTitle lbImgSize = "Ukuran: " & clsStegaRead.ImgSize lbImgRes = "Resolusi: " & clsStegaRead.ImgRes & " bit" Q = 0 MsgBox "Re-Modifikasi Citra Selesai!", , "Tugas Akhir" Detect.Enabled = True Fog.Enabled = False End Sub Private Sub Invert_Click() On Error Resume Next For YYY = 0 To TheImage.ScaleHeight - 1 For XXX = 0 To TheImage.ScaleWidth - 1 Pixel = GetPixel(TheImage.HDC, XXX, YYY) GetRGB Pixel Rred = 255 - Rred Ggreen = 255 - Ggreen Bblue = 255 - Bblue

SetPixelV TheImage.HDC, XXX, YYY, RGB(Rred, Ggreen, Bblue) Next TheImage.Refresh Next TheImage.Refresh

SavePicture TheImage.Image, Files.FileName strImageFile = Files.FileName clsStegaRead.ImageFile = strImageFile lbImgName = "Nama: " & Files.FileTitle lbImgSize = "Ukuran: " & clsStegaRead.ImgSize lbImgRes = "Resolusi: " & clsStegaRead.ImgRes & " bit" MsgBox "Re-Modifikasi Citra Selesai!", , "Tugas Akhir" Detect.Enabled = True Invert.Enabled = False

Exit Sub ja: Exit Sub End Sub Private Sub Lighten_Click() On Error Resume Next

Qnap = 0 Qnjl = 1 Pixel = GetPixel(TheImage.HDC, 0, 0) GetRGB Pixel Pixel0 = GetPixel(TempPic2.HDC, 0, 0) GetRGB0 Pixel0 If Abs(Bblue0 - Bblue) Mod 2 = 0 Then For YYY = 0 To TheImage.ScaleHeight - 1 For XXX = 0 To TheImage.ScaleWidth - 1 Pixel = GetPixel(TheImage.HDC, XXX, YYY) GetRGB Pixel Rred = Rred - Qnap Ggreen = Ggreen - Qnap Bblue = Bblue - Qnap SetPixelV TheImage.HDC, XXX, YYY, RGB(Rred, Ggreen, Bblue) Next TheImage.Refresh Next TheImage.Refresh Else For YYY = 0 To TheImage.ScaleHeight - 1 For XXX = 0 To TheImage.ScaleWidth - 1 Pixel = GetPixel(TheImage.HDC, XXX, YYY) GetRGB Pixel Rred = Rred - Qnjl Ggreen = Ggreen - Qnjl Bblue = Bblue - Qnjl SetPixelV TheImage.HDC, XXX, YYY, RGB(Rred, Ggreen, Bblue) Next TheImage.Refresh Next TheImage.Refresh End If SavePicture TheImage.Image, Files.FileName strImageFile = Files.FileName clsStegaRead.ImageFile = strImageFile lbImgName = "Nama: " & Files.FileTitle lbImgSize = "Ukuran: " & clsStegaRead.ImgSize lbImgRes = "Resolusi: " & clsStegaRead.ImgRes & " bit" Q = 0 MsgBox "Re-Modifikasi Citra Selesai!", , "Tugas Akhir" Detect.Enabled = True

Lighten.Enabled = False End Sub Private Sub MirrorH_Click() On Error Resume Next TempPic.Width = TheImage.Width TempPic.Height = TheImage.Height For YYY = 0 To TheImage.ScaleHeight - 1 For XXX = 0 To TheImage.ScaleWidth - 1 Pixel = GetPixel(TheImage.HDC, XXX, YYY) SetPixelV TempPic.HDC, TheImage.ScaleWidth - (XXX + 1), YYY, Pixel Next TheImage.Refresh Next BitBlt TheImage.HDC, 0, 0, TempPic.ScaleWidth - 1, TempPic.ScaleHeight - 1, TempPic.HDC, 0, 0, &HCC0020 TheImage.Refresh SavePicture TheImage.Image, Files.FileName strImageFile = Files.FileName clsStegaRead.ImageFile = strImageFile lbImgName = "Nama: " & Files.FileTitle lbImgSize = "Ukuran: " & clsStegaRead.ImgSize lbImgRes = "Resolusi: " & clsStegaRead.ImgRes & " bit" MsgBox "Re-Modifikasi Citra Selesai!", , "Tugas Akhir" Detect.Enabled = True MirrorH.Enabled = False End Sub Private Sub MirrorV_Click() On Error Resume Next TempPic.Width = TheImage.Width TempPic.Height = TheImage.Height For YYY = 0 To TheImage.ScaleHeight - 1 For XXX = 0 To TheImage.ScaleWidth - 1 Pixel = GetPixel(TheImage.HDC, XXX, YYY) SetPixelV TempPic.HDC, XXX, TheImage.ScaleHeight - (YYY + 1), Pixel Next TheImage.Refresh Next BitBlt TheImage.HDC, 0, 0, TempPic.ScaleWidth - 1, TempPic.ScaleHeight - 1, TempPic.HDC, 0, 0, &HCC0020 TheImage.Refresh SavePicture TheImage.Image, Files.FileName

strImageFile = Files.FileName clsStegaRead.ImageFile = strImageFile lbImgName = "Nama: " & Files.FileTitle lbImgSize = "Ukuran: " & clsStegaRead.ImgSize lbImgRes = "Resolusi: " & clsStegaRead.ImgRes & " bit" MsgBox "Re-Modifikasi Citra Selesai!", , "Tugas Akhir" Detect.Enabled = True MirrorV.Enabled = False End Sub

2.1.4 Listing Sub Subprogram Ekstrak Pesan
Private Sub Detect_Click()

currentStep = currentStep + 1 If currentStep = 2 Then 'Extract Data If clsStegaRead.areLock Then frLock.Visible = True imgIco = 1 End If End If If currentStep = 1 Then frmLoad.Show vbModeless, Me If Not clsStegaRead.Decodeit Then Unload frmLoad currentStep = MAX_STEPS - 1 currentStep = 0 Else imgIco = 2 Detect_Click Unload frmLoad 'menampilkan list citra pesan Dim ItTmp As ClsFile, Itlvw As ListItem Dim i& i = 1 For Each ItTmp In clsStegaRead Set Itlvw = lvwFilesAdded.ListItems.Add(, ItTmp.KeyFile, ItTmp.TypeFile, , imgIco) Itlvw.SubItems(1) = ItTmp.FileTitle Itlvw.SubItems(2) = ItTmp.LenBytes i = i + 1 Next lbRema = "Ukuran File Yang Disisipkan: " & clsStegaRead.BytesAdded Extract End If End If

cmdTarget.Enabled = False Detect.Enabled = False End Sub Private Sub Extract() Dim ItSel As ListItem Dim OutFile&, tmpFile& Dim dataOut() As Byte On Error GoTo errExtrac mPad = 2 Set ItSel = lvwFilesAdded.SelectedItem If Not ItSel Is Nothing Then Files.FileName = "" Files.Filter = "File|*." & ItSel.Text Files.ShowSave If Files.FileName <> "" Then Dim ItFile As ClsFile tmpFile = FreeFile Set ItFile = clsStegaRead.GetFile(ItSel.Key) 'mengeskstrak If Len(Trim(txtLock)) > 0 Then clsStegaRead.Pwd = Trim(txtLock) clsStegaRead.UnLockMe ItFile.FileName, Files.FileName Else Open ItFile.FileName For Binary As tmpFile dataOut() = InputB(LOF(tmpFile), tmpFile) Close tmpFile OutFile = FreeFile Open Files.FileName For Binary As OutFile Put OutFile, , dataOut() Close OutFile End If DSDeskip.Picture = LoadPicture(Files.FileName) clsStegaRead.ImageFile1 = Files.FileName Label3 = "Nama: " & Files.FileTitle Label2 = "Ukuran: " & clsStegaRead.ImgSize Label1 = "Resolusi: " & clsStegaRead.ImgRes & " bit" m_Millimeter = ScaleX(100, vbPixels, vbMillimeters) ToW ToH InW InH = = = = Me.ScaleWidth - mPad - mPad Me.ScaleHeight - mPad - mPad DSDeskip.Picture.Width / m_Millimeter DSDeskip.Picture.Height / m_Millimeter

VS2.Max = InH - HS2.TOp + mPad

HS2.Max = InW - VS2.Left + mPad VS2.LargeChange = ToH - HS2.Height HS2.LargeChange = ToW - VS2.Width MsgBox "Dekripsi data Sukses!", , "Tugas Akhir" cmdFinish.Enabled = True OpenDS.Enabled = True Center2.Enabled = True Hysto2.Enabled = True Else MsgBox "Tidak Menyimpan Gambar", vbCritical, "Kesalahan" Extract End If End If Exit Sub errExtrac: MsgBox Err.Description, , "Tugas Akhir" End Sub

2.1.5 Listing Sub Subprogram Buka Citra Pesan Asli
Private Sub OpenDS_Click() Files.Filter = "Image File|*.bmp" Files.ShowOpen DSImageFile = Files.FileName DSAsli.Picture = LoadPicture(DSImageFile) clsStegaRead.ImageFile1 = DSImageFile Label6 = "Nama: " & Files.FileTitle Label5 = "Ukuran: " & clsStegaRead.ImgSize Label4 = "Resolusi: " & clsStegaRead.ImgRes & " bit" ToW ToH InW InH = = = = Me.ScaleWidth - mPad - mPad Me.ScaleHeight - mPad - mPad DSAsli.Picture.Width / m_Millimeter DSAsli.Picture.Height / m_Millimeter HS1.TOp + mPad VS1.Left + mPad = ToH - HS1.Height = ToW - VS1.Width

VS1.Max = InH HS1.Max = InW VS1.LargeChange HS1.LargeChange

Center1.Enabled = True Gopixel.Enabled = True Hysto.Enabled = True MSE.Enabled = True PSNR.Enabled = True End Sub

2.1.4 Listing Sub Subprogram MSE
Private Sub MSE_Click() RRR = 0 For mmm = 0 To DSAsli.Height Step 15 For nnn = 0 To DSAsli.Width Step 15 Pixel1 = DSAsli.Point(mmm, nnn) Rred1 = Pixel1 And RGB(255, 0, 0) Ggreen1 = Int((Pixel1 And RGB(0, 255, 0)) / 256) Bblue1 = Int(Int((Pixel1 And RGB(0, 0, 255)) / 256) / 256) Pixel12 = DSDeskip.Point(mmm, nnn) Rred2 = Pixel12 And RGB(255, 0, 0) Ggreen2 = Int((Pixel12 And RGB(0, 255, 0)) / 256) Bblue2 = Int(Int((Pixel12 And RGB(0, 0, 255)) / 256) / 256) RR1 = (Rred1 - Rred2) ^ 2 GG1 = (Ggreen1 - Ggreen2) ^ 2 BB1 = (Bblue1 - Bblue2) ^ 2 QQQ = (RR1 + GG1 + BB1) / 3 RRR = RRR + QQQ Next Next OOO = DSAsli.Height * DSAsli.Width PPP = RRR / OOO HslMSE.Text = PPP End Sub

2.1.4 Listing Sub Subprogram PSNR
Private Sub PSNR_Click() If PPP > 0 Then HslPSNR.Text = (10 * Log(255 / Sqr(PPP)) / Log(10)) Else MsgBox "PSNR = Infinitif !", , "Tugas Akhir" Exit Sub End If End Sub

2.1.5 Listing Sub Subprogram Histogram Citra Asli Yang Disisipkan
Option Explicit

Dim hData(0 To 3, 0 To 255) As Single Dim hMax(0 To 3) As Single Dim x As Long, y As Long Private Sub cmbHistMethod_Click() lastHistMethod = cmbHistMethod.ListIndex DrawHistogram cmbHistSource.ListIndex, cmbHistMethod.ListIndex End Sub

Private Sub cmbHistSource_Click() lastHistSource = cmbHistSource.ListIndex DrawHistogram cmbHistSource.ListIndex, cmbHistMethod.ListIndex End Sub Private Sub Form_Load() GenerateHistogram cmbHistSource.Clear cmbHistSource.AddItem cmbHistSource.AddItem cmbHistSource.AddItem cmbHistSource.AddItem

"Merah" "Hijau" "Biru" "Luminance"

cmbHistSource.ListIndex = lastHistSource cmbHistMethod.Clear cmbHistMethod.AddItem "Garis" cmbHistMethod.AddItem "Grafik Penuh" cmbHistMethod.ListIndex = lastHistMethod End Sub 'Subroutine untuk menggambar histogram '0 - merah '1 - hijau '2 - Biru '3 - Luminance 'jenis2 histogram '0 - garis '1 - grafik penuh Private Sub DrawHistogram(ByVal hType As Long, ByVal drawMethod As Long) picH.Cls Dim tHeight As Long tHeight = picH.ScaleHeight - 2 Dim LastX As Long, LastY As Long Select Case hType Case 0 DrawGradient picH, RGB(0, 0, 0), RGB(255, 0, 0) picH.ForeColor = RGB(255, 255, 255) Case 1 DrawGradient picH, RGB(0, 0, 0), RGB(0, 255, 0) picH.ForeColor = RGB(255, 255, 255) Case 2 DrawGradient picH, RGB(0, 0, 0), RGB(0, 0, 255) picH.ForeColor = RGB(255, 255, 255)

Case 3 DrawGradient picH, RGB(0, 0, 0), RGB(255, 255, 255) picH.ForeColor = RGB(255, 0, 0) End Select LastX = 0 LastY = tHeight - (hData(hType, 0) / hMax(hType)) * tHeight

For x = 0 To 255 y = tHeight - (hData(hType, x) / hMax(hType)) * tHeight 'untuk garis If drawMethod = 0 Then picH.Line (LastX, LastY)-(x, y) LastX = x LastY = y 'untuk grafik penuh ElseIf drawMethod = 1 Then picH.Line (x, tHeight)-(x, y) End If Next x 'jumlah total pixel Dim fDraw As New FastDrawing Dim iWidth As Long, iHeight As Long iWidth = fDraw.GetImageWidth(frmRead.DSAsli) iHeight = fDraw.GetImageHeight(frmRead.DSAsli) lblTotalPixels.Caption = "Total pixel: " & (iWidth * iHeight) 'pixel terbanyak lblMaxCount.Caption = hMax(hType) End Sub Private Sub Form_Terminate() Unload Me End Sub Private Sub picH_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single) lblLevel.Caption = x lblCount.Caption = hData(lastHistSource, x) End Sub Public Sub GenerateHistogram() Dim ImageData() As Byte Dim iWidth As Long, iHeight As Long Dim fDraw As New FastDrawing iWidth = fDraw.GetImageWidth(frmRead.DSAsli) iHeight = fDraw.GetImageHeight(frmRead.DSAsli) fDraw.GetImageData2D frmRead.DSAsli, ImageData() Dim r As Long, g As Long, b As Long, L As Long

For x = 0 To 3 hMax(x) = 0 For y = 0 To 255 hData(x, y) = 0 Next y Next x

Dim QuickX As Long For x = 0 To iWidth - 1 QuickX = x * 3 For y = 0 To iHeight - 1 r = ImageData(QuickX + 2, g = ImageData(QuickX + 1, b = ImageData(QuickX, y) L = (r + g + b) \ 3 hData(0, r) = hData(0, r) hData(1, g) = hData(1, g) hData(2, b) = hData(2, b) hData(3, L) = hData(3, L) Next y Next x For x = 0 To 255 'merah If hData(0, x) 'hijau If hData(1, x) 'biru If hData(2, x) 'Luminance If hData(3, x) Next x

y) y)

+ + + +

1 1 1 1

> hMax(0) Then hMax(0) = hData(0, x) > hMax(1) Then hMax(1) = hData(1, x) > hMax(2) Then hMax(2) = hData(2, x) > hMax(3) Then hMax(3) = hData(3, x)

DrawHistogram lastHistSource, lastHistMethod End Sub

2.1.6 Listing Sub Subprogram Histogram Citra pesan Hasil Ekstrak
Option Explicit

Dim hData(0 To 3, 0 To 255) As Single Dim hMax(0 To 3) As Single Dim x As Long, y As Long Private Sub cmbHistMethod_Click() lastHistMethod = cmbHistMethod.ListIndex DrawHistogram cmbHistSource.ListIndex, cmbHistMethod.ListIndex End Sub Private Sub cmbHistSource_Click() lastHistSource = cmbHistSource.ListIndex DrawHistogram cmbHistSource.ListIndex, cmbHistMethod.ListIndex End Sub

Private Sub Form_Load() GenerateHistogram cmbHistSource.Clear cmbHistSource.AddItem cmbHistSource.AddItem cmbHistSource.AddItem cmbHistSource.AddItem

"Merah" "Hijau" "Biru" "Luminance"

cmbHistSource.ListIndex = lastHistSource cmbHistMethod.Clear cmbHistMethod.AddItem "Garis" cmbHistMethod.AddItem "Grafik Penuh" cmbHistMethod.ListIndex = lastHistMethod End Sub 'Subroutine untuk menggambar histogram '0 - merah '1 - hijau '2 - Biru '3 - Luminance 'jenis2 histogram '0 - garis '1 - grafik penuh Private Sub DrawHistogram(ByVal hType As Long, ByVal drawMethod As Long) picH.Cls Dim tHeight As Long tHeight = picH.ScaleHeight - 2 Dim LastX As Long, LastY As Long Select Case hType Case 0 DrawGradient picH, RGB(0, 0, 0), RGB(255, 0, 0) picH.ForeColor = RGB(255, 255, 255) Case 1 DrawGradient picH, RGB(0, 0, 0), RGB(0, 255, 0) picH.ForeColor = RGB(255, 255, 255) Case 2 DrawGradient picH, RGB(0, 0, 0), RGB(0, 0, 255) picH.ForeColor = RGB(255, 255, 255) Case 3 DrawGradient picH, RGB(0, 0, 0), RGB(255, 255, 255) picH.ForeColor = RGB(255, 0, 0) End Select

LastX = 0 LastY = tHeight - (hData(hType, 0) / hMax(hType)) * tHeight For x = 0 To 255 y = tHeight - (hData(hType, x) / hMax(hType)) * tHeight 'untuk garis If drawMethod = 0 Then picH.Line (LastX, LastY)-(x, y) LastX = x LastY = y 'untuk grafik penuh ElseIf drawMethod = 1 Then picH.Line (x, tHeight)-(x, y) End If Next x 'jumlah total pixel Dim fDraw As New FastDrawing Dim iWidth As Long, iHeight As Long iWidth = fDraw.GetImageWidth(frmRead.DSDeskip) iHeight = fDraw.GetImageHeight(frmRead.DSDeskip) lblTotalPixels.Caption = "Total pixel: " & (iWidth * iHeight) 'pixel terbanyak lblMaxCount.Caption = hMax(hType) End Sub Private Sub Form_Terminate() Unload Me End Sub Private Sub picH_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single) lblLevel.Caption = x lblCount.Caption = hData(lastHistSource, x) End Sub Public Sub GenerateHistogram() Dim ImageData() As Byte Dim iWidth As Long, iHeight As Long Dim fDraw As New FastDrawing iWidth = fDraw.GetImageWidth(frmRead.DSDeskip) iHeight = fDraw.GetImageHeight(frmRead.DSDeskip) fDraw.GetImageData2D frmRead.DSDeskip, ImageData() Dim r As Long, g As Long, b As Long, L As Long For x = 0 To 3 hMax(x) = 0 For y = 0 To 255

hData(x, y) = 0 Next y Next x

Dim QuickX As Long For x = 0 To iWidth - 1 QuickX = x * 3 For y = 0 To iHeight - 1 r = ImageData(QuickX + 2, g = ImageData(QuickX + 1, b = ImageData(QuickX, y) L = (r + g + b) \ 3 hData(0, r) = hData(0, r) hData(1, g) = hData(1, g) hData(2, b) = hData(2, b) hData(3, L) = hData(3, L) Next y Next x

y) y)

+ + + +

1 1 1 1

For x = 0 To 255 'merah If hData(0, x) > hMax(0) Then hMax(0) = hData(0, 'hijau If hData(1, x) > hMax(1) Then hMax(1) = hData(1, 'biru If hData(2, x) > hMax(2) Then hMax(2) = hData(2, 'Luminance If hData(3, x) > hMax(3) Then hMax(3) = hData(3, Next x DrawHistogram lastHistSource, lastHistMethod End Sub

x) x) x) x)

2.1.7 Listing Sub Subprogram Perbandingan Pixel Citra Asli Yang Disisipkan dan Citra Data Hasil Ekstrak
Option Explicit Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim WarnaPix As Integer mmm As Double nnn As Double pix As Long pix1 As Long r As Integer g As Integer b As Integer r1 As Integer g1 As Integer b1 As Integer gr As Integer gr1 As Integer Mx As Double My As Double Nx As Double Ny As Double L As Double

Dim M As Double Dim N As Double Dim Hal Private Sub ComboWarna_Click() ListRGB.Clear Select Case ComboWarna Case "Merah" Hitung_Merah Case "Hijau" Hitung_Hijau Case "Biru" Hitung_Biru Case "Luminance" Hitung_Luminance End Select End Sub Private Sub Form_Load() ComboWarna.Clear ComboWarna.AddItem ComboWarna.AddItem ComboWarna.AddItem ComboWarna.AddItem End Sub Private Sub Hitung_Merah() L = 0 For mmm = 0 To frmRead.DSAsli.ScaleHeight For nnn = 0 To frmRead.DSAsli.ScaleWidth pix = frmRead.DSAsli.Point(nnn, mmm) pix1 = frmRead.DSDeskip.Point(nnn, mmm) r = pix And RGB(255, 0, 0) r1 = pix1 And RGB(255, 0, 0) If r <> r1 Then Hal = "Posisi(x,y) :" & "(" & Str(nnn) & "," & Str(mmm) & ") " & " Citra Asli=" & Str(r) & " Citra Hasil Recovery = " & Str(r1) ListRGB.AddItem Hal L = L + 1 If L = 100 Then Exit Sub End If Next Next End Sub Private Sub Hitung_Hijau() L = 0 For mmm = 0 To frmRead.DSAsli.ScaleHeight For nnn = 0 To frmRead.DSAsli.ScaleWidth pix = frmRead.DSAsli.Point(nnn, mmm) pix1 = frmRead.DSDeskip.Point(nnn, mmm)

"Luminance" "Merah" "Hijau" "Biru"

g = Int((pix And RGB(0, 255, 0)) / 256) g1 = Int((pix1 And RGB(0, 255, 0)) / 256) If g <> g1 Then Hal = "Posisi(x,y) :" & "(" & Str(nnn) & "," & Str(mmm) & ") " & " Citra Asli=" & Str(g) & " Citra Hasil Recovery = " & Str(g1) ListRGB.AddItem Hal L = L + 1 If L = 100 Then Exit Sub End If Next Next End Sub Private Sub Hitung_Biru() L = 0 For mmm = 0 To frmRead.DSAsli.ScaleHeight For nnn = 0 To frmRead.DSAsli.ScaleWidth pix = frmRead.DSAsli.Point(nnn, mmm) pix1 = frmRead.DSDeskip.Point(nnn, mmm) b = Int(Int((pix And RGB(0, 0, 255)) / 256) / 256) b1 = Int(Int((pix1 And RGB(0, 0, 255)) / 256) / 256) If b <> b1 Then Hal = "Posisi(x,y) :" & "(" & Str(nnn) & "," & Str(mmm) & ") " & " Citra Asli=" & Str(b) & " Citra Hasil Recovery = " & Str(b1) ListRGB.AddItem Hal L = L + 1 If L = 100 Then Exit Sub End If Next Next End Sub Private Sub Hitung_Luminance() L = 0 For mmm = 0 To frmRead.DSAsli.ScaleHeight For nnn = 0 To frmRead.DSAsli.ScaleWidth pix = frmRead.DSAsli.Point(nnn, mmm) pix1 = frmRead.DSDeskip.Point(nnn, mmm) r = pix And RGB(255, 0, 0) g = Int((pix And RGB(0, 255, 0)) / 256) b = Int(Int((pix And RGB(0, 0, 255)) / 256) / 256) r1 = pix1 And RGB(255, 0, 0) g1 = Int((pix1 And RGB(0, 255, 0)) / 256) b1 = Int(Int((pix1 And RGB(0, 0, 255)) / 256) / 256) gr = (r + g + b) / 3 gr1 = (r1 + g1 + b1) / 3

If gr <> gr1 Then Hal = "Posisi(x,y) :" & "(" & Str(nnn) & "," & Str(mmm) & ") " & " Citra Asli=" & Str(gr) & " Citra Hasil Recovery = " & Str(gr1) ListRGB.AddItem Hal L = L + 1 If L = 100 Then Exit Sub End If Next Next End Sub

2. MODUL 2.1 Modul Untuk Modifikasi
Declare Function GetPixel Lib "gdi32" (ByVal HDC As Long, ByVal x As Long, ByVal y As Long) As Long Declare Function SetPixelV Lib "gdi32" (ByVal HDC As Long, ByVal x As Long, ByVal y As Long, ByVal crColor As Long) As Long Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal XSrc As Long, ByVal YSrc As Long, ByVal dwRop As Long) As Long

2.2 Modul Untuk Enkripsi dan Dekripsi
Option Explicit '------------------------------------------------------' ' Tugas Akhir '------------------------------------------------------' ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ' Fungsi Untuk Mengendalikan Penyedia enkripsi ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Public Declare Function CryptAcquireContext Lib "advapi32.dll" Alias "CryptAcquireContextA" ( _ phProv As Long, pszContainer As String, pszProvider As String, _ ByVal dwProvType As Long, ByVal dwFlags As Long) As Long

Public Declare Function CryptReleaseContext Lib "advapi32.dll" _ (ByVal hProv As Long, _ ByVal dwFlags As Long) As Long ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ' Fungsi Untuk Mengendalikan dan mengoperasikan obyek Hash ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Public Declare Function CryptCreateHash Lib "advapi32.dll" (ByVal hProv As Long, _

ByVal Algid As Long, ByVal hKey As Long, ByVal dwFlags As Long, phHash As Long) As Long Public Declare Function CryptDestroyHash Lib "advapi32.dll" (ByVal hHash As Long) As Long Public Declare Function CryptHashData Lib "advapi32.dll" ( _ ByVal hHash As Long, ByVal pbdata As String, _ ByVal dwDataLen As Long, ByVal dwFlags As Long) As Long Public Declare Function CryptBinHashData Lib "advapi32.dll" Alias "CryptHashData" ( _ ByVal hHash As Long, pbdata As Any, _ ByVal dwDataLen As Long, ByVal dwFlags As Long) As Long Public Declare Function CryptGetHashParam Lib "advapi32.dll" _ (ByVal hHash As Long, ByVal dwParam As Long, pbdata As Any, _ pdwDataLen As Long, ByVal dwFlags As Long) As Long ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ' fungsi Kunci ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ' Public Declare Function CryptGenKey Lib "advapi32.dll" ( _ ByVal hProv As Long, ByVal Algid As Long, ByVal dwFlags As Long, phKey As Long) As Long Public Declare Function CryptDeriveKey Lib "advapi32.dll" ( _ ByVal hProv As Long, ByVal Algid As Long, ByVal hBaseData As Long, ByVal dwFlags As Long, _ phKey As Long) As Long Public Declare Function CryptExportKey Lib "advapi32.dll" (ByVal hKey As Long, _ ByVal hExpKey As Long, ByVal dwBlobType As Long, ByVal dwFlags As Long, _ pbdata As Any, pdwDataLen As Long) As Long Public Declare Function CryptImportKey Lib "advapi32.dll" ( _ ByVal hProv As Long, pbdata As Any, _ ByVal dwDataLen As Long, ByVal hImpKey As Long, ByVal dwFlags As Long, _ phKey As Long) As Long Public Declare Function CryptDestroyKey Lib "advapi32.dll" (ByVal hKey As Long) As Long ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ' fungsi enkripsi dan dekripsi ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Public Declare Function CryptEncrypt Lib "advapi32.dll" (ByVal hKey As Long, _ ByVal hHash As Long, ByVal Final As Long, ByVal dwFlags As Long, pbdata As Any, _ pdwDataLen As Long, ByVal dwBufLen As Long) As Long Public Declare Function CryptStringEncrypt Lib "advapi32.dll" Alias "CryptEncrypt" (ByVal hKey As Long, _

ByVal hHash As Long, ByVal Final As Long, ByVal dwFlags As Long, ByVal pbdata As String, _ pdwDataLen As Long, ByVal dwBufLen As Long) As Long

Public Declare Function CryptDecrypt Lib "advapi32.dll" (ByVal hKey As Long, _ ByVal hHash As Long, ByVal Final As Long, ByVal dwFlags As Long, pbdata As Any, _ pdwDataLen As Long) As Long Public Declare Function CryptStringDecrypt Lib "advapi32.dll" Alias "CryptDecrypt" (ByVal hKey As Long, _ ByVal hHash As Long, ByVal Final As Long, ByVal dwFlags As Long, ByVal pbdata As String, _ pdwDataLen As Long) As Long ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ' fungsi untuk menggunakan folder sementara ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Public Declare Function WriteFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, ByVal lpOverlapped As Any) As Long Public Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, ByVal lpOverlapped As Any) As Long Public Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByVal lpSecurityAttributes As Any, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Public Declare Function SetFilePointer Lib "kernel32" (ByVal hFile As Long, ByVal lDistanceToMove As Long, lpDistanceToMoveHigh As Long, ByVal dwMoveMethod As Long) As Long Public Declare Function SetFileAttributes Lib "kernel32" Alias "SetFileAttributesA" (ByVal lpFileName As String, ByVal dwFileAttributes As Long) As Long Public Declare Function GetFileAttributes Lib "kernel32" Alias "GetFileAttributesA" (ByVal lpFileName As String) As Long Public Declare Function GetFileSize Lib "kernel32" (ByVal hFile As Long, lpFileSizeHigh As Long) As Long Public Declare Function GetTempFileName Lib "kernel32" Alias "GetTempFileNameA" (ByVal lpszPath As String, ByVal lpPrefixString As String, ByVal wUnique As Long, ByVal lpTempFileName As String) As Long Public Declare Function GetTempPath Lib "kernel32" Alias "GetTempPathA" (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long Public Declare Function DeleteFile Lib "kernel32" Alias "DeleteFileA" (ByVal lpFileName As String) As Long ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ' fungsi untuk menyusun gambar ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Public Declare Function DrawEdge Lib "user32" (ByVal HDC As Long, qrc As RECT, ByVal edge As Long, ByVal grfFlags As Long) As Long Public Declare Function SetRect Lib "user32" (lpRect As RECT, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ' konstanta gambar ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Public Const BDR_RAISEDINNER = &H4 Public Const BDR_RAISEDOUTER = &H1 Public Const EDGE_RAISED = (BDR_RAISEDOUTER Or BDR_RAISEDINNER) Public Const BF_BOTTOM = &H8 Public Const BF_LEFT = &H1 Public Const BF_RIGHT = &H4 Public Const BF_TOP = &H2 Public Const BF_RECT = (BF_LEFT Or BF_TOP Or BF_RIGHT Or BF_BOTTOM) Public Const BF_ADJUST = &H2000 Public Type RECT Left As Long TOp As Long Right As Long Bottom As Long End Type ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ' kontanta data ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Public Const MOVEFILE_REPLACE_EXISTING = &H1 Public Const MOVEFILE_COPY_ALLOWED = &H2 Public Const FILE_BEGIN = 0 Public Const FILE_SHARE_READ = &H1 Public Const FILE_SHARE_WRITE = &H2 Public Const CREATE_ALWAYS = 2 Public Const OPEN_ALWAYS = 4 Public Const TRUNCATE_EXISTING = 5 Public Const CREATE_NEW = 1 Public Const OPEN_EXISTING = 3 Public Const GENERIC_READ = &H80000000 Public Const GENERIC_WRITE = &H40000000 Public Const INVALID_HANDLE_VALUE = -1 Public Const FILE_ATTRIBUTE_ARCHIVE = &H20 Public Const FILE_ATTRIBUTE_DIRECTORY = &H10 Public Const FILE_ATTRIBUTE_HIDDEN = &H2 Public Const FILE_ATTRIBUTE_NORMAL = &H80 Public Const FILE_ATTRIBUTE_READONLY = &H1 Public Const FILE_ATTRIBUTE_SYSTEM = &H4 Public Const FILE_ATTRIBUTE_TEMPORARY = &H100 Public Const FILE_POINTER_FAIL = &HFFFFFFFF ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ' konstanta kesalahan ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Public Const ERROR_ILLEGAL_PROPERTY& = 1001& Public Const ERROR_NO_HASH_CREATE& = 1002& Public Const ERROR_NO_KEY_CONTAINER& = 1003&

Public Public Public Public Public Public Public Public Public Public Public Public Public Public Public Public Public Public Public Public

Const Const Const Const Const Const Const Const Const Const Const Const Const Const Const Const Const Const Const Const

ERROR_NO_HASH_CREATED& = 1004& ERROR_NO_DIGEST& = 1005& ERROR_NO_HASH_DATA& = 1006& ERROR_FILE_NOT_FOUND& = 1007& ERROR_NO_HASH_DESTROY& = 1008& ERROR_NO_HASH_PASSW& = 1010& ERROR_NO_KEY_DERIVED& = 1011& ERROR_NO_DECRYPT& = 1012& ERROR_NO_ENCRYPT& = 1009 ERROR_TMPPTH_NOT_FOUND& = 1013& ERROR_ALGO_NOT_SUPP& = 1014& ERROR_NO_TMP_FILE& = 1015& ERROR_NO_FILE_OPEN& = 1016& ERROR_NO_READ& = 1017& ERROR_NO_WRITE& = 1018& ERROR_NO_TMP_OPEN& = 1019& ERROR_NOTHING_DIGESTED& = 1020& ERROR_IS_DIR& = 1021& NO_DATASET& = 0& ERROR_FILE_SIZE& = 1022&

' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ' nama penyedia yang terintegrasi pada windows ' keduanya endukung fugnsi hash ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Public Const MS_DEF_PROV = "Microsoft Base Cryptographic Provider v1.0" Public Const MS_ENHANCED_PROV = "Microsoft Enhanced Cryptographic Provider v1.0" Public Const PROV_RSA_FULL = 1 Public Const CRYPT_NEWKEYSET = &H8 'nilai parameter hash Public Const HP_HASHVAL = 2 ' 'ukuran block untuk Membaca data/Menulis data/enkripsi/dekripsi Public Const HP_FILE_RW_BLOCKSIZE_1k = 1000& '[1kb tiap detik] Public Const HP_FILE_RW_BLOCKSIZE_16k = 16000& '[16kb tiap detik] Public Const HP_FILE_RW_BLOCKSIZE_50k = &HC350 '[50kb tiap detik] Public Const HP_FILE_RW_BLOCKSIZE_100k& = &H186A0 '[100kb tiap detik] Public Const HP_FILE_RW_BLOCKSIZE_500k& = &H7A120 '[500kb tiap detik] Public Const HP_FILE_RW_BLOCKSIZE_1m& = &HF4240 '[1Mb tiap detik] 'tingkatan algoritma Public Const ALG_CLASS_DATA_ENCRYPT = 24576 Public Const ALG_CLASS_HASH = 32768 'tipe algoritma Public Const ALG_TYPE_ANY = 0 Public Const ALG_TYPE_BLOCK = 1536

Public Const ALG_TYPE_STREAM = 2048 'Block Public Public Public Public cipher sub ids Const ALG_SID_DES = 1 Const ALG_SID_3DES = 3 Const ALG_SID_3DES_112 = 9 Const ALG_SID_RC2 = 2

'Stream cipher sub-ids Public Const ALG_SID_RC4 = 1 'Hash sub ids Public Const ALG_SID_MD2 = 1 Public Const ALG_SID_MD4 = 2 Public Const ALG_SID_MD5 = 3 Public Const ALG_SID_SHA = 4 Public Declare Sub CopyMem Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

' Hashing algorithms Public Const CALG_MD2 ALG_SID_MD2) Public Const CALG_MD4 ALG_SID_MD4) Public Const CALG_MD5 ALG_SID_MD5) Public Const CALG_SHA ALG_SID_SHA)

= (ALG_CLASS_HASH Or ALG_TYPE_ANY Or = (ALG_CLASS_HASH Or ALG_TYPE_ANY Or = ((ALG_CLASS_HASH Or ALG_TYPE_ANY) Or = (ALG_CLASS_HASH Or ALG_TYPE_ANY Or

' Encryption/Decryption algorithms ' Block ciphers Public Const CALG_DES = (ALG_CLASS_DATA_ENCRYPT Or ALG_TYPE_BLOCK Or ALG_SID_DES) Public Const CALG_3DES = (ALG_CLASS_DATA_ENCRYPT Or ALG_TYPE_BLOCK Or ALG_SID_3DES) Public Const CALG_3DES_112 = (ALG_CLASS_DATA_ENCRYPT Or ALG_TYPE_BLOCK Or ALG_SID_3DES_112) Public Const CALG_RC2 = ((ALG_CLASS_DATA_ENCRYPT Or ALG_TYPE_BLOCK) Or ALG_SID_RC2) ' Stream ciphers Public Const CALG_RC4 = ((ALG_CLASS_DATA_ENCRYPT Or ALG_TYPE_STREAM) Or ALG_SID_RC4) ' Temp File Public Const TEMP_FILE = "ECA" Public Const TEMP_SIZE = 255& ' Default size Public Const DEF_WIDTH = 930& Public Const DEF_HEIGHT = 1080& Public Const DEF_MAX_FILE_SIZE& = &H2710

Option Explicit Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Public Type tBits Bits(0 To 7) As Single End Type

'file header, total 14 byte Type winBMPFileHeader strFileType As String * 2 ' tipe file selalu 4D42h atau "BMP" lngFileSize As Long 'ukuran dalam byte biasanya 0 untuk file yang tidak dikompresi bytReserved1 As Integer ' selalu 0 bytReserved2 As Integer ' selalu 0 lngBitmapOffset As Long 'Posisi awal data citra dalam satuan byte End Type

'image header, total 40 bytes Type BITMAPINFOHEADER biSize As Long 'Ukuran Header biWidth As Long 'Lebar gambar biHeight As Long 'Panjang gambar biPlanes As Integer 'selalu 1 byBitCount As Integer 'Nomor bit per pixel 1, 4, 8, or 24 biCompression As Long 'Data 0 tidak dikompresi biSizeImage As Long 'Ukuran bitmap dalam byte, biasanya 0 untuk file yang tidak dikompresi biXPelsPerMeter As Long 'pilihan resolusi dalam piksel per meter biYPelsPerMeter As Long 'pilihan resolusi dalam piksel per meter biClrUsed As Long 'jumlah warna yang benar-benar digunakan (bisa 0) biClrImportant As Long 'yang warnanya paling penting (0 berarti semuanya) End Type 'palette, 4 byte * 256 = 1024 Type BITMAPPalette lngBlue As Byte lngGreen As Byte lngRed As Byte lngReserved As Byte End Type

Private Type POINTAPI x As Long y As Long

End Type Private Type MSG hwnd As Long Message As Long wParam As Long lParam As Long time As Long pt As POINTAPI End Type

'jendela di mana pesan muncul 'pesan id sendiri 'lebih lanjut mendefinisikan pesan 'lebih lanjut mendefinisikan pesan 'waktu kemunculan pesan 'posisi mouse

Public Message As MSG 'memasukkan pesan yang diterima dalam antrian Declare Function PeekMessage Lib "user32" Alias "PeekMessageA" (lpMsg As MSG, ByVal hwnd As Long, ByVal wMsgFilterMin As Long, ByVal wMsgFilterMax As Long, ByVal wRemoveMsg As Long) As Long Declare Function TranslateMessage Lib "user32" (lpMsg As MSG) As Long Declare Function DispatchMessage Lib "user32" Alias "DispatchMessageA" (lpMsg As MSG) As Long Public Const PM_REMOVE = &H1 'parameter dalam peekmessage untuk menghapus atau meninggalkan pesan dalam antrian 'myDoEvents() 43% lebih cepat dibandingkan Vb-DoEvents Public Function myDoEvents() As Boolean If PeekMessage(Message, 0, 0, 0, PM_REMOVE) Then 'memeriksa pesan dalam antrian dan menghapus jika ada hanya ada satu TranslateMessage Message 'menerjemahkan pesan (tidak perlu jika tidak ada menu) DispatchMessage Message 'kiriman pesan yang akan ditangani myDoEvents = True End If End Function Function Binary2String(laData() As tBits) Dim ArrEnd() As Byte Dim strEnd$, i& ReDim ArrEnd(0 To UBound(laData())) strEnd$ = "" For i = 0 To UBound(laData()) strEnd = strEnd & Chr(Bin2Asc(laData(i))) Next i strEnd = VBA.Left$(strEnd, Len(strEnd) - 1) Binary2String = strEnd End Function Function AscChar(ByVal MyMot As String) As String Dim J As Integer Dim K Dim TmpMot As String For J = 1 To Len(MyMot) K = Mid(MyMot, J, 1)

If Asc(K) >= 20 Then TmpMot = TmpMot & K End If Next J If TmpMot = VBA.Space(Len(TmpMot)) Then TmpMot = "" AscChar = TmpMot End Function

Function Bin2Asc(Bin As tBits) As Integer Dim num As Integer Dim Fact%, i& num = 0 Fact = 128 For i = 0 To 7 num = num + Bin.Bits(i) * Fact Fact = Fact / 2 Next i Bin2Asc = num End Function Function ByteToBinary(ByVal Data As Byte) As tBits Dim tmpBit As tBits Dim i As Long, J& i = &H80 '10000000 While i tmpBit.Bits(J) = IIf(Data And i, "1", "0") i = i \ 2 J = J + 1 Wend ByteToBinary = tmpBit End Function

2.3 Modul Untuk Histogram
'penentuan sumber warna dan jebis grafik pada histogram Public Const DRAWMETHOD_LUMINANCE As Long = 3 Public Const DRAWMETHOD_BARS As Long = 0 'untuk mengetahui pilihan terakhir yang digunakan Public lastHistSource As Long, lastHistMethod As Long

Public Sub DrawGradient(ByRef DstObject As PictureBox, ByVal Color1 As Long, ByVal Color2 As Long) Dim r As Long, g As Long, b As Long Dim R2 As Long, G2 As Long, B2 As Long 'mengambil nilai r,g,b r = Color1 Mod 256 g = (Color1 \ 256) And 255 b = (Color1 \ 65536) And 255

R2 = Color2 Mod 256 G2 = (Color2 \ 256) And 255 B2 = (Color2 \ 65536) And 255 'variabel perhitungan gradien Dim VR As Single, VG As Single, VB As Single 'ukuran gambar yang akan disusun Dim iWidth As Long, iHeight As Long iWidth = DstObject.ScaleWidth iHeight = DstObject.ScaleHeight

VR = Abs(r - R2) / iWidth VG = Abs(g - G2) / iWidth VB = Abs(b - B2) / iWidth If R2 < r Then VR = -VR If G2 < g Then VG = -VG If B2 < b Then VB = -VB Dim x As Long For x = 0 To iWidth R2 = r + VR * x G2 = g + VG * x B2 = b + VB * x DstObject.Line (x, 0)-(x, iHeight), RGB(R2, G2, B2) Next x End Sub

3.

CLASS MODUL

3.1 CLASS MODUL Untuk Enkripsi dan Dekripsi
“Class Stegano” Option Explicit Private Private Private Private BmpHead As winBMPFileHeader BmpInfo As BITMAPINFOHEADER bmpPalette() As BITMAPPalette DeepColor&

Dim BinaryAttach() As tBits, BinaryImg() As tBits Dim bImg2Conv() As Byte, bImgData() As Byte, bAttachData() As Byte

Dim Dim Dim Dim Dim Dim Dim Dim Dim

mImageFile$ 'Nama file gambar mOutputImageFile$ 'Nama baru file gambar mFilesAdded& 'jumlah file yg ditambahkan OutFile& 'Pointer untuk file mBytesLimit& 'Batas jumlah byte yang akan ditambahkan mBytesAdded& 'Jumlah byte yang akan ditambahkan mImgSize$ 'Ukuran gambar(width x height) mImgRes& 'Resolusi Gambar 8,16,24 bit mEncrypMe As Boolean 'Enkripsi data

Dim mAreLock As Boolean Dim mBytesExtra& Dim mImageFile1$ Dim colFiles As Collection 'koleksi file Dim cTAG() As Byte 'tag utama untuk mengidentifikasi file yang dilampirkan Dim myEncryp As clsEncryp 'Pointer untuk Encryp class

Event StatusChanged(prcDone As Long, strStatus As String) 'tampilkan pesan ini untuk memberitahu langkah yang sedang dilakukan Event SomeError(strDescription As String) 'tampilkan pesan ini untuk memberitahu jika terjadi error

Public Function NewEnum() As IUnknown Set NewEnum = colFiles.[_NewEnum] End Function Public Property Get ImageFile() As String ImageFile = mImageFile End Property Public Property Let ImageFile(ByVal vNewValue As String) Dim tmpFil& mImageFile = vNewValue mBytesLimit = (FileLen(mImageFile) \ 8) - 1024 'untuk mencegah file rusak tmpFil = FreeFile Open mImageFile For Binary As tmpFil ReadHeadImg_ tmpFil mImgSize = BmpInfo.biWidth & " x " & BmpInfo.biHeight mImgRes = BmpInfo.byBitCount Close tmpFil End Property Public Property Get ImageFile1() As String ImageFile1 = mImageFile1 End Property Public Property Let ImageFile1(ByVal vNewValue As String) Dim tmpFil& mImageFile1 = vNewValue tmpFil = FreeFile Open mImageFile1 For Binary As tmpFil ReadHeadImg_ tmpFil mImgSize = BmpInfo.biWidth & " x " & BmpInfo.biHeight mImgRes = BmpInfo.byBitCount Close tmpFil End Property Public Property Get FilesAdded() As Long FilesAdded = mFilesAdded

End Property 'menambahkan file 'strFile:nama file yang akan ditambahkan 'strTitle : title file 'Key:kunci identifikasi Public Function AddFile(strFile As String, strTitle As String, Key As String) As Boolean Dim tmpFile As ClsFile On Local Error GoTo AddErr Set tmpFile = New ClsFile 'mengisi data If FileExist(strFile) Then With tmpFile .KeyFile = Key .FileName = strFile .FileTitle = strTitle .LenBytes = FileLen(strFile) 'get len in bytes .TypeFile = VBA.Right$(strFile, 3) 'tipe file. (.exe,.txt,.bmp...) mBytesAdded = mBytesAdded + .LenBytes If mBytesAdded > mBytesLimit Then 'file tidak bisa ditambahkan jika melebihi batas mBytesAdded = mBytesAdded - .LenBytes Err.Raise 9001, "Menambah Citra Pesan", "Citra Pesan tidak bisa ditambahkan. Ukuran file terlalu besar!" End If End With End If colFiles.Add tmpFile, Key mFilesAdded = mFilesAdded + 1 AddFile = True Exit Function AddErr: RaiseEvent SomeError(Err.Description & " dalam " & Err.Source) End Function Public Function RemoveFile(Key As String) As Boolean On Local Error GoTo AddErr Dim tmpFile As ClsFile Set tmpFile = colFiles(Key) 'menghapus file yang ditambahkan mBytesAdded = mBytesAdded - tmpFile.LenBytes 'sisa byte Set tmpFile = Nothing 'memori sisa colFiles.Remove Key 'menghapus item RemoveFile = True mFilesAdded = mFilesAdded - 1 Exit Function AddErr: RaiseEvent SomeError(Err.Description) Err.Clear End Function Public Function GetFile(Key As String) As ClsFile On Local Error GoTo GetErr

Set GetFile = colFiles(Key) 'kembali ke info tentang semua file yg ditambahkan Exit Function GetErr: RaiseEvent SomeError(Err.Description) Err.Clear End Function Private Sub Class_Initialize() Set colFiles = New Collection Set myEncryp = New clsEncryp myEncryp.EncryptionAlgorithm = DES myEncryp.HashAlgorithm = MD5 myEncryp.Speed = [1MB] cTAG() = StrConv("TAG:Int21", vbFromUnicode) End Sub Public Function Encodeit() As Boolean Dim strFile$ Dim It As ClsFile On Local Error GoTo EncodeErr If FileExist(mImageFile) Then 'mamastikan adanya nama file

Dim tmpPalette As BITMAPPalette ' To calculate len of struct If mEncrypMe Then EncrypFiles 'Proses data citra Call ReadImg_ 'Mengkonversi citra ke binary Call Convert2BinaryArray_(bImg2Conv(), BinaryImg()) RaiseEvent StatusChanged(0, "Mempersiapkan Citra Pesan Untuk Disisipkan...") OutFile = FreeFile 'Buffer file utama 'dalam file ini akan diisi semua data,TAG, dan semua data yg ditambahkan Open "c:\tmp_C23F41AA.dat" For Binary As #OutFile Put #OutFile, , cTAG() 'TAG identifier Put #OutFile, , mFilesAdded 'jumlah file yg ditambahkan Put #OutFile, , mBytesAdded 'jumlah byte yg ditambahkan Put #OutFile, , CLng(mAreLock) 'terenkripsi RaiseEvent StatusChanged(0, "Silahkan Tunggu...") ReadAttach_

Close #OutFile ConvertAttach_ Join_Img_Files_ Kill "c:\tmp_C23F41AA.dat" 'menghapus buffer file RaiseEvent StatusChanged(100, "Proses Selesai!") Else RaiseEvent SomeError("File tidak ditemukan") End If Exit Function EncodeErr: RaiseEvent SomeError(Err.Description) Err.Clear Close End Function Public Function Decodeit() As Boolean If Not ReadTag_ Then 'mencari tag RaiseEvent SomeError(" Citra Yang Dipilih Tidak Mengandung Pesan! ") Else ExtractData_ Decodeit = True 'proses dekode (ekstrak) End If End Function Public Sub Save2Image() Dim strDone$ If mOutputImageFile <> "" Then RaiseEvent StatusChanged(0, "Menyimpan File...") If Not SaveImg_() Then strDone = "Kesalahan Dalam Menyimpan Citra Baru" Else strDone = "Citra telah disimpan!" RaiseEvent StatusChanged(100, strDone) Else RaiseEvent StatusChanged(0, "Citra Tidak Ditemukan!") End If End Sub Private Function SaveImg_() As Boolean Dim i&, J&, xFil&, lngCounter& Dim maxArr& On Local Error GoTo SaveImgErr 'menyimpan citra baru yang telah ditambahkan file rahasia maxArr = UBound(bImg2Conv()) 'data citra maksimal For J = 0 To UBound(BinaryImg()) 'Len image in binary format, must be equal LenImageInBytes * 8

bImg2Conv(i) = Bin2Asc(BinaryImg(J)) 'mengkonversi binary ke dalam byte, 11111111 = 255 i = i + 1 If i > maxArr Then Exit For End If If myDoEvents Then RaiseEvent StatusChanged(J * 100 / maxArr, "Menyimpan Citra Baru...") Next J

xFil = FreeFile 'mempersiapkan file yang akan diisi Open mOutputImageFile For Binary As #xFil Put #xFil, , BmpHead 'mengisi header Put #xFil, , BmpInfo 'mengisi info 'mengisi citra dengan file yg akan disembunyikan For lngCounter = 1 To DeepColor 'mengisi palet data Put #1, , bmpPalette(lngCounter) Next lngCounter Put #xFil, , bImg2Conv() 'mengisi data baru dengan data yang akan disembunyikan Put #xFil, , bImgData() 'sisa data Close #xFil 'end SaveImg_ = True 'membaca setiap info byte RGB Exit Function SaveImgErr: RaiseEvent SomeError(Err.Description) Err.Clear End Function Private Function EncrypFiles() Dim It As ClsFile Dim strFile$ For Each It In colFiles 'membaca file yang akan ditambahkan dalam citra strFile = "C:###BOT_TEXT###quot; & It.FileTitle & ".enc" myEncryp.EncryptToDestFile It.FileName, strFile, 23 It.FileName = strFile 'when we encryp, the len file changed, we must update that mBytesAdded = mBytesAdded - It.LenBytes It.LenBytes = FileLen(strFile) mBytesAdded = mBytesAdded + It.LenBytes Next mBytesExtra = 4 End Function Private Sub ReadAttach_() Dim xFil&, i&, lenBy& Dim It As ClsFile Dim vData() As Byte, strOut() As Byte

Dim Str3 As String * 3, Str10 As String * 10 Dim strShort$ On Local Error GoTo ReadAttachErr xFil = FreeFile 'membaca data yang akan ditampilkan RaiseEvent StatusChanged(0, "Membaca Data Untuk Disisipkan...") i = 0 For Each It In colFiles 'membaca data yang akan ditambahkan dalam citra Open It.FileName For Binary As #xFil ' untuk setiap file yg akan ditambahkan, akan dibuat file sementara yang tersimpan dalam memori vData = InputB(LOF(xFil), #xFil) Str3 = It.TypeFile 'txt, bmp, jpg, gif, png Str10 = It.FileTitle 'title i = i + 1 If myDoEvents Then RaiseEvent StatusChanged((i * 100 / mFilesAdded), "Membaca Citra Pesan Untuk Disisipkan..." & Str10) strOut() = StrConv(Str3, vbFromUnicode) Put #OutFile, , strOut() Put #OutFile, , It.LenBytes strOut() = StrConv(Str10, vbFromUnicode) Put #OutFile, , strOut() Put #OutFile, , vData() Close #xFil Next Exit Sub ReadAttachErr: RaiseEvent SomeError(Err.Description) Err.Clear End Sub Private Sub ReadHeadImg_(pFile&) Dim tmpPalette As BITMAPPalette Dim i& 'langkah pertama adalah membaca header dari gambar bitmap, 'kemudian langsung membaca data citra Get #pFile, , BmpHead 'fill head struct Get #pFile, , BmpInfo 'fill info struct 'menghitung kedalaman gambar (resolusi) DeepColor = ((BmpHead.lngBitmapOffset - 54) / Len(tmpPalette)) If DeepColor > 0 Then ReDim bmpPalette(1 To DeepColor) 'resize For i = 1 To DeepColor Get #pFile, , bmpPalette(i)

Next i End Sub Private Sub ReadImg_() Dim xFil&, Bytes2Hide&, RestBytes&, lngCounter& Dim bytColor As Byte 'membaca file citra xFil = FreeFile Open mImageFile For Binary As #xFil RaiseEvent StatusChanged(0, "Membaca Header...") ReadHeadImg_ xFil

Bytes2Hide = (mBytesAdded + 17 + (17 * mFilesAdded) + mBytesExtra) * 8 'LOF(ImgFile) - Loc(ImgFile) ReDim bImg2Conv(0 To Bytes2Hide) '1 byte yang disembunyikan = 8 byte data RestBytes = (BmpHead.lngFileSize - BmpHead.lngBitmapOffset) Bytes2Hide ReDim bImgData(0 To RestBytes) RaiseEvent StatusChanged(0, "Membaca Data Citra...") For lngCounter = 0 To Bytes2Hide ' data tempat file akan disembunyikan If Not EOF(xFil) Then Get #xFil, , bytColor 'membaca setiap info byte RGB bImg2Conv(lngCounter) = bytColor End If If myDoEvents Then RaiseEvent StatusChanged(lngCounter * 100 / Bytes2Hide, "Membaca Data Citra...") Next lngCounter For lngCounter = 0 To RestBytes ' sisa data If Not EOF(xFil) Then Get #xFil, , bytColor 'membaca setiap info byte RGB bImgData(lngCounter) = bytColor End If If myDoEvents Then RaiseEvent StatusChanged(lngCounter * 100 / RestBytes, "Membaca Data Citra...") Next lngCounter Close #xFil End Sub 'mencari tag dalam gambar, jika tidak ada maka akan di-skip Private Function ReadTag_() As Boolean Dim binData() As tBits, binTag() As tBits

Dim Dim Dim Dim

i&, J&, Cur&, bytColor As Byte, Ret& strMyTag As String * 9 lenStruct&, xFil& bBytes() As Byte RaiseEvent StatusChanged(0, "Mencari Header...") lenStruct = 17 ReDim binTag(0 To lenStruct) xFil = FreeFile Open mImageFile For Binary As #xFil ReadHeadImg_ xFil 'membaca header bitmap

lenStruct = 168 '8 byte = 1 extra-byte, TAG= 21 byte * 8 byte = 168 byte ReDim bImgData(0 To lenStruct) For i = 0 To lenStruct If Not EOF(xFil) Then Get #xFil, , bytColor bImgData(i) = bytColor End If Next i Close #xFil Call Convert2BinaryArray_(bImgData(), binData()) lenStruct = UBound(binTag()) 'len data in binary Cur = 0 lenStruct = 9 'the len tag is alway 9bytes For i = 0 To lenStruct For J = 0 To 7 binTag(i).Bits(J) = binData(Cur).Bits(7) Cur = Cur + 1 Next J If Cur >= 72 Then Exit For Next i strMyTag = Binary2String(binTag) If strMyTag = "TAG:Int21" Then ReDim binTag(0 To 4) ReDim bBytes(0 To 4) Cur = 72 For i = 0 To 4 For J = 0 To 7 binTag(i).Bits(J) = binData(Cur).Bits(7) Cur = Cur + 1 Next J If Cur >= 104 Then Exit For

bBytes(i) = Bin2Asc(binTag(i)) Next i CopyMemory mFilesAdded, bBytes(0), Len(mFilesAdded) Cur = 104 For i = 0 To 4 For J = 0 To 7 binTag(i).Bits(J) = binData(Cur).Bits(7) Cur = Cur + 1 Next J If Cur >= 136 Then Exit For bBytes(i) = Bin2Asc(binTag(i)) Next i CopyMemory mBytesAdded, bBytes(0), Len(mBytesAdded)

Cur = 136 For i = 0 To 4 For J = 0 To 7 binTag(i).Bits(J) = binData(Cur).Bits(7) Cur = Cur + 1 Next J If Cur >= 168 Then Exit For bBytes(i) = Bin2Asc(binTag(i)) Next i CopyMemory Ret, bBytes(0), Len(Ret) mAreLock = Ret If mAreLock Then mBytesExtra = 4 ReadTag_ = True End If 'ReadTag_ = (strMyTag = "TAG:Int21") End Function Private Sub ExtractData_() Dim OutFile&, ImgFile& Dim tmpFile& Dim dataOut() As Byte Dim BinOut() As tBits Dim Bytes2Read&, Cur&, i&, J& Dim bytColor As Byte Dim sTAg$, lFA&, lBA&, sTF$, lLF&, sNF$ ImgFile& = FreeFile Open mImageFile$ For Binary As #ImgFile 'membuka citra utama 'men-skip header bitmap, untuk memperoleh data citra asli Call ReadHeadImg_(ImgFile) Bytes2Read = (mBytesAdded + 17 + (17 * mFilesAdded) + mBytesExtra) * 8 ReDim dataOut(0 To Bytes2Read)

For i = 0 To (Bytes2Read) If Not EOF(ImgFile) Then Get #ImgFile, , bytColor dataOut(i) = bytColor End If Next i Close #ImgFile Call Convert2BinaryArray_(dataOut(), BinaryImg()) Bytes2Read = UBound(BinaryImg()) 'len image in binary mBytesAdded = (mBytesAdded + 17 + (17 * mFilesAdded) + mBytesExtra) ReDim dataOut(0 To mBytesAdded) ReDim BinOut(0 To Bytes2Read)

Cur = 0 'membaca byte ke 7 dalam setiap byte yang terdapat dalam citra 'dan memasukkannya dalam array untuk mengekstrak data yg tersembunyi For i = 0 To mBytesAdded For J = 0 To 7 If Cur >= Bytes2Read Then Exit For BinOut(i).Bits(J) = BinaryImg(Cur).Bits(7) Cur = Cur + 1 Next J dataOut(i) = Bin2Asc(BinOut(i)) 'mengkonversi kode biner yg tersembunyi dalam byte myDoEvents Next i OutFile = FreeFile Open "c:\tmp_DD2741C.dat" For Binary As #OutFile 'tmp file Put #OutFile, , dataOut() Close OutFile OutFile = FreeFile mBytesAdded = 0 mFilesAdded = 0 Open "c:\tmp_DD2741C.dat" For Binary As #OutFile 'tmp file sTAg = ExtractItem_(OutFile, 9, 0, 1) 'membaca tag utama lFA = ExtractItem_(OutFile, 4, 0, 0) 'membaca jumlah file yang ditambahkan lBA = ExtractItem_(OutFile, 4, 0, 0) 'read the len of bytes added mAreLock = ExtractItem_(OutFile, 4, 0, 0) 'ekstrak Dim strFile$ Dim It As ClsFile For i = 1 To lFA

sTF = ExtractItem_(OutFile, 3, 0, 1) 'tipe file yang dibaca(txt,bmp,gif,jpg,png) lLF = ExtractItem_(OutFile, 4, 0, 0) 'read the len in bytes for this file sNF = ExtractItem_(OutFile, 10, 0, 1) 'membaca title file strFile = "c:###BOT_TEXT###quot; & sNF & "DD2741C." & sTF 'build buffer filename tmpFile = FreeFile Open strFile For Binary As tmpFile dataOut() = InputB(lLF, OutFile) 'read nbytes, the len for this file Put tmpFile, , dataOut() 'menyimpan dalam memori Close tmpFile

AddFile strFile, sNF, CStr("c0" & i) 'menambahkan dalam class module 'mBytesAdded = mBytesAdded + lLF 'menghitung jumlah byte yang ditambahkan dalam gambar Next Close OutFile Kill "c:\tmp_DD2741C.dat"

End Sub Private Function ExtractItem_(pFile As Long, Bytes2Read As Long, Bytes2Look As Long, RetType As Integer) Dim Memo() As Byte Dim lLong& Dim strEnd$ Memo() = InputB(Bytes2Read, pFile) 'membaca n-bytes dari memori If RetType = 0 Then 'Numerik CopyMemory lLong, Memo(0), Len(lLong) ExtractItem_ = lLong ElseIf RetType = 1 Then 'String strEnd = Memo() ExtractItem_ = StrConv(strEnd, vbUnicode) End If End Function Private Sub ConvertAttach_() Dim byt As Byte Dim LenF&, i& On Local Error GoTo ErrConvert 'membaca file dan mengkonversi ke binary

OutFile = FreeFile Open "c:\tmp_C23F41AA.dat" For Binary As #OutFile LenF = LOF(OutFile) - 1 ReDim bAttachData(0 To LenF) For i = 0 To LenF If Not EOF(OutFile) Then Get OutFile, , byt bAttachData(i) = byt End If Next Close #OutFile Call Convert2BinaryArray_(bAttachData(), BinaryAttach()) Exit Sub ErrConvert: RaiseEvent SomeError(Err.Description) Err.Clear End Sub 'menggabungkan gambar dan file rahasia menjadi 1 file steganografi Private Sub Join_Img_Files_() Dim i&, J&, K&, LenImg&, LenF& LenImg = UBound(BinaryImg()) 'len in binary of image LenF = UBound(BinaryAttach()) 'len in binary for files to attach i = 0 For J = 0 To LenF For K = 0 To 7 BinaryImg(i).Bits(7) = BinaryAttach(J).Bits(K) 'memasukkan 1 bit dari data binary untuk disembunyikan dalam 7 bit i = i + 1 Next K If i >= LenImg Then Exit For If myDoEvents Then RaiseEvent StatusChanged((i * 100 / LenImg), "Menggabung Data Pesan Dengan Citra...") Next J End Sub 'array untuk mengkonversi ke binary 'Source(): data file dalam byte 'retArray(): data biner yang akan di ekstrak kembali Private Sub Convert2BinaryArray_(Source() As Byte, RetArray() As tBits) Dim LenArray&, i& Dim arrBinary() As tBits Dim Bits8 As tBits LenArray = UBound(Source()) ReDim arrBinary(0 To LenArray)

For i = 0 To LenArray Bits8 = ByteToBinary(Source(i)) 'mengkonversi 1 byte ke biner arrBinary(i) = Bits8 If myDoEvents Then RaiseEvent StatusChanged((i * 100 / LenArray), "Konversi Hexadesimal Ke Biner...") Next i RetArray = arrBinary End Sub Private Function FileExist(strFile As String) As Boolean Dim Rs$, Tama As Boolean Dim tm& Rs = Dir(strFile) FileExist = (Len(Rs)) End Function Public Property Get OutputImageFile() As String OutputImageFile = mOutputImageFile End Property Public Property Let OutputImageFile(ByVal sNewFile As String) mOutputImageFile = sNewFile End Property Private Sub Class_Terminate() Dim tmpClass As ClsFile For Each tmpClass In colFiles Set tmpClass = Nothing Next Set colFiles = Nothing If myEncryp.IsHashReady Then myEncryp.DestroyHash Set myEncryp = Nothing 'memori yang tersisa Erase BinaryAttach() Erase BinaryImg() Erase bImgData() Erase bImg2Conv() Erase bAttachData() End Sub Public Property Get BytesAdded() As Long BytesAdded = mBytesAdded End Property

Public Property Get BytesTotal() As Variant BytesTotal = mBytesLimit End Property

Public Property Get ImgSize() As String ImgSize = mImgSize End Property Public Property Get ImgRes() As Long ImgRes = mImgRes End Property Public Property Get EncrypMe() As Boolean EncrypMe = mEncrypMe End Property Public Property Let EncrypMe(ByVal bNewEncryp As Boolean) mEncrypMe = bNewEncryp mAreLock = mEncrypMe End Property Public Property Get EncryptionAlgorithm() As EC_CRYPT_ALGO_ID EncryptionAlgorithm = myEncryp.EncryptionAlgorithm End Property Public Property Let EncryptionAlgorithm(ByVal ecEncryptID As EC_CRYPT_ALGO_ID) myEncryp.EncryptionAlgorithm = ecEncryptID End Property Public Property Get HashAlgorithm() As EC_HASH_ALG_ID HashAlgorithm = myEncryp.HashAlgorithm End Property Public Property Let HashAlgorithm(ByVal hAlgoId As EC_HASH_ALG_ID) myEncryp.HashAlgorithm = hAlgoId End Property Public Property Get Pwd() As String Pwd = myEncryp.Password End Property Public Property Let Pwd(ByVal sPassword As String) myEncryp.Password = sPassword End Property Public Property Get areLock() As Boolean areLock = mAreLock End Property Public Property Let areLock(ByVal bNewLock As Boolean) mAreLock = bNewLock End Property Public Function UnLockMe(strLockFile As String, DestFile As String) If mAreLock Then myEncryp.DecryptToDestFile strLockFile, DestFile, 23

End Function “Class En/Decrypt” Option Explicit 'Enumerators Public Enum EC_HASH_ALG_ID MD2 MD4 MD5 SHA End Enum Public Enum EC_HASH_DATAFORMAT EC_HF_HEXADECIMAL EC_HF_NUMERIC EC_HF_ASCII End Enum Private Enum EC_HASH_STATUS EC_HASH_NONE EC_HASH_BUSY EC_HASH_READY End Enum Private Enum EC_CRYPT_STATUS EC_CRYPT_NONE EC_CRYPT_BUSY EC_CRYPT_READY End Enum Private Enum EC_PROVIDER [No Providers] [Microsoft Base Cryptographic Provider v.1] [Microsoft Enhanced Cryptographic Provider] End Enum Public Enum EC_CRYPT_ALGO_ID RC2 RC4 DES [Triple DES] [Triple DES 112] End Enum Public Enum EC_CRYPT_SPEED [1KB] [2KB] [4KB] [8KB] [16KB] [30KB] [40KB] [50KB] [60KB] [80KB] [100KB] [500KB] [1MB] End Enum

Private m_CSP_Provider As Long Private m_Provider_Name As EC_PROVIDER ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ' Hash Properties ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Private m_Hash_Object As Long Private m_Hash_Data(20) As Byte 'Nilai ini biasanya akan menjadi 16 atau 20, tergantung pada algoritma hash. Private m_Hash_DataLen As Long Private m_Hash_Algo_Id As EC_HASH_ALG_ID Private m_Hash_Algorithm As Long Private m_Hash_Status As EC_HASH_STATUS Private m_Hash_DataReady As Boolean ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ' property enkripsi dan dekripsi ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Private m_EncDec_Password As String Private m_EncDec_InBuffer As String Private m_EncDec_Algo_Id As EC_CRYPT_ALGO_ID Private m_EncDec_Status As EC_CRYPT_STATUS Private m_EncDec_Algorithm As Long ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ' property ukuran blok ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Private HP_FILE_RW_BLOCKSIZE As Long Private m_Speed As EC_CRYPT_SPEED ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ' Events ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Event EncryptionFileStart() Event EncryptionFileStatus(ByVal lBytesProcessed As Long, ByVal lTotalBytes As Long) Event EncryptionFileComplete() Event DecryptionFileStart() Event DecryptionFileStatus(ByVal lBytesProcessed As Long, ByVal lTotalBytes As Long) Event DecryptionFileComplete() Event HashFileStart() Event HashFileStatus(ByVal lBytesProcessed As Long, ByVal lTotalBytes As Long) Event HashFileComplete() Event EncryptionDataStart() Event EncryptionDataComplete() Event DecryptionDataStart()

Event DecryptionDataComplete() Event HashDataStart() Event HashDataComplete() ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 'property penyedia ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Public Property Get Provider() As String If m_Provider_Name = [Microsoft Base Cryptographic Provider v.1] Then Provider = MS_DEF_PROV Else Provider = MS_ENHANCED_PROV End If End Property ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ' Kembali true Jika Hash objek Siap Digunakan ' False Flase Jika Tidak ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Public Property Get IsHashReady() As Boolean IsHashReady = False If m_Hash_Status = EC_HASH_READY Then IsHashReady = True End Property Public Property Get IsHashDataReady() As Boolean IsHashDataReady = m_Hash_DataReady End Property Public Property Get Speed() As EC_CRYPT_SPEED Speed = m_Speed End Property Public Property Let Speed(ByVal newSpeed As EC_CRYPT_SPEED) If newSpeed < [1KB] Or newSpeed > [1MB] Then MsgBox "Nilai properti tidak dikenali", vbCritical, "Kesalahan" Exit Property End If m_Speed = newSpeed Select Case m_Speed Case [1KB]: HP_FILE_RW_BLOCKSIZE = HP_FILE_RW_BLOCKSIZE_1k Case [16KB]: HP_FILE_RW_BLOCKSIZE = HP_FILE_RW_BLOCKSIZE_16k Case [50KB]: HP_FILE_RW_BLOCKSIZE = HP_FILE_RW_BLOCKSIZE_50k Case [100KB]: HP_FILE_RW_BLOCKSIZE = HP_FILE_RW_BLOCKSIZE_100k Case [500KB]: HP_FILE_RW_BLOCKSIZE = HP_FILE_RW_BLOCKSIZE_500k Case [1MB]: HP_FILE_RW_BLOCKSIZE = HP_FILE_RW_BLOCKSIZE_1m End Select End Property ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ' Hash Algorithm property

' ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Public Property Let HashAlgorithm(ByVal hAlgoId As EC_HASH_ALG_ID) If hAlgoId < 0 Or hAlgoId > 3 Then MsgBox "Illegal property value", vbCritical, "Error" Exit Property End If m_Hash_Algo_Id = hAlgoId Select Case m_Hash_Algo_Id Case MD2: m_Hash_Algorithm = CALG_MD2 Case MD4: m_Hash_Algorithm = CALG_MD4 Case MD5: m_Hash_Algorithm = CALG_MD5 Case SHA: m_Hash_Algorithm = CALG_SHA End Select End Property Public Property Get HashAlgorithm() As EC_HASH_ALG_ID HashAlgorithm = m_Hash_Algo_Id End Property Public Property Get Password() As String Password = m_EncDec_Password End Property Public Property Let Password(ByVal sPassword As String) m_EncDec_Password = sPassword End Property ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ' properti algoritma enkripsi ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Public Property Get EncryptionAlgorithm() As EC_CRYPT_ALGO_ID EncryptionAlgorithm = m_EncDec_Algo_Id End Property Public Property Let EncryptionAlgorithm(ByVal ecEncryptID As EC_CRYPT_ALGO_ID) If ecEncryptID < RC2 Or ecEncryptID > [Triple DES 112] Then Err.Raise vbObjectError + ERROR_ILLEGAL_PROPERTY, , "Illegal property value" Exit Property End If If m_Provider_Name = [No Providers] Then MsgBox "EzCryptoApi Gagal mengendalikan key" & vbCrLf & _ "cek kembali Cryptographic Providers terpasang dengan benar!", vbCritical, "Fatal Error [EzCryptoApi]" Exit Property End If

If m_Provider_Name = [Microsoft Base Cryptographic Provider v.1] And _ (ecEncryptID = [Triple DES] Or ecEncryptID = [Triple DES 112]) Then MsgBox "Cryptographic Service Provider tidak mendukung algoritma program ini" & _ "pastikan [Microsoft Enhanced Cryptographic Provider]enhsig.dll-rsaenh.dll telah teregister", vbExclamation, "Error" Exit Property End If m_EncDec_Algo_Id = ecEncryptID Select Case m_EncDec_Algo_Id Case RC2: m_EncDec_Algorithm = CALG_RC2 Case RC4: m_EncDec_Algorithm = CALG_RC4 Case DES: m_EncDec_Algorithm = CALG_DES Case [Triple DES]: m_EncDec_Algorithm = CALG_3DES Case [Triple DES 112]: m_EncDec_Algorithm = CALG_3DES_112 End Select End Property ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ' Inisialisasi obyek Hash ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Public Sub CreateHash() Dim lError As Long On Error GoTo ErrCreateHash ' lReturn: menampung nilai ya g diberi oleh penyedia Dim lReturn As Long ' jika obyek hash telah dibuat ' maka akan dihapus If m_Hash_Status = EC_HASH_READY Then Call DestroyHash End If ' mengendalikan penyedia lReturn = InitProvider() ' tidak berhasil mengendalikan penyedia If lReturn = 0 Then lError = ERROR_NO_KEY_CONTAINER Err.Raise vbObjectError End If 'mencoba mengendalikan obyek hash If Not CBool(CryptCreateHash(m_CSP_Provider, m_Hash_Algorithm, _ 0, 0, m_Hash_Object)) Then lError = ERROR_NO_HASH_CREATE Err.Raise vbObjectError End If ' obyek Hash Status siap m_Hash_Status = EC_HASH_READY Exit Sub ErrCreateHash:

Dim sMsg As String Select Case lError Case ERROR_NO_KEY_CONTAINER: sMsg = "Kesalahan dalam MengHandle Kunci Wadah" Case ERROR_NO_HASH_CREATE: sMsg = "tidak dapat menginisialisasi Hash Objek" Case Else: Err.Raise Err.Number, "EzCryptoApi", Err.Description End Select Err.Raise Number:=(vbObjectError + lError), Source:="EzCryptoApi", Description:=sMsg End Sub Public Sub HashDigestData(ByVal sData As String) Dim lError As Long On Error GoTo ErrDigest If m_Hash_Status = EC_HASH_BUSY Then Exit Sub m_Hash_DataReady = False ' data belum siap m_Hash_DataLen = NO_DATASET ' obyek hash belum dibuat If m_Hash_Status <> EC_HASH_READY Then lError = ERROR_NO_HASH_CREATED GoTo ErrNoCreated End If ' memunculkan HashDataStart event RaiseEvent HashDataStart m_Hash_Status = EC_HASH_BUSY Dim lDataLen As Long ' mempertahankan panjang data lDataLen = Len(sData) ' Digest data If Not CBool(CryptHashData(m_Hash_Object, sData, lDataLen, 0)) Then lError = ERROR_NO_DIGEST Err.Raise vbObjectError End If Call SetHashData If m_Hash_DataLen = NO_DATASET Then lError = ERROR_NO_HASH_DATA Err.Raise vbObjectError ' End If m_Hash_DataReady = True ' data siap m_Hash_Status = EC_HASH_READY ' mulai bekerja ' memunculkan event HashDataComplete RaiseEvent HashDataComplete Exit Sub ErrNoCreated: Err.Raise vbObjectError + lError, "EzCryptoApi", "Hash Object Belum Dibuat" ErrDigest: Dim sMsg As String m_Hash_Status = EC_HASH_READY Select Case lError Case ERROR_NO_DIGEST: sMsg = "Kesalahan 'Mengolah'data"

Case ERROR_NO_HASH_DATA: sMsg = "Kesalahan Menyetel/Mendapat data yang sudah diolah" Case Else: Err.Raise Err.Number, "EzCryptoApi", Err.Description End Select Err.Raise vbObjectError + Error, "EzCryptoApi", sMsg End Sub ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ' membuat digest data ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Public Sub HashDigestFile(ByVal sSourceFile As String) Dim lError As Long On Error GoTo ErrDigestFile ' jika obyek hash masih terpakai maka keluar If m_Hash_Status = EC_HASH_BUSY Then Exit Sub m_Hash_DataReady = False ' data belum siap m_Hash_DataLen = NO_DATASET If m_Hash_Status <> EC_HASH_READY Then lError = ERROR_NO_HASH_CREATE GoTo ErrNoCreated End If RaiseEvent HashFileStart m_Hash_Status = EC_HASH_BUSY Dim fNum As Long Dim fLen As Long Dim fBlockBytes As Long Dim fLostBytes As Long Dim fDat() As Byte Dim icounter As Integer, jCounter As Integer Dim lResult As Long Dim lBytesProcessed ' mengecek file citra If Trim(Dir(sSourceFile)) = "" Then lError = ERROR_FILE_NOT_FOUND Err.Raise vbObjectError End If If GetFileAttributes(sSourceFile) And FILE_ATTRIBUTE_DIRECTORY Then lError = ERROR_IS_DIR Err.Raise vbObjectError End If fNum = CreateFile(sSourceFile, GENERIC_READ, FILE_SHARE_READ Or FILE_SHARE_WRITE, ByVal 0&, OPEN_EXISTING, 0, 0) If fNum = INVALID_HANDLE_VALUE Then lError = ERROR_NO_FILE_OPEN Err.Raise vbObjectError End If lBytesProcessed = 0

fLen = GetFileSize(fNum, 0) SetFilePointer fNum, 0, 0, FILE_BEGIN RaiseEvent HashFileStatus(lBytesProcessed, fLen) ' lebih besar dari spesifikasi ukuran If fLen < HP_FILE_RW_BLOCKSIZE Then ' Resize ReDim fDat(1 To fLen) ReadFile fNum, fDat(1), fLen, lResult, ByVal 0& If lResult <> fLen Then lError = ERROR_NO_READ Err.Raise vbObjectError End If ' membuat data digest If Not CBool(CryptBinHashData(m_Hash_Object, fDat(1), fLen, 0)) Then lError = ERROR_NO_DIGEST Err.Raise vbObjectError End If RaiseEvent HashFileStatus(fLen, fLen) Else fBlockBytes = fLen \ HP_FILE_RW_BLOCKSIZE fLostBytes = fLen Mod HP_FILE_RW_BLOCKSIZE ReDim fDat(1 To HP_FILE_RW_BLOCKSIZE) For icounter = 1 To fBlockBytes ReadFile fNum, fDat(1), HP_FILE_RW_BLOCKSIZE, lResult, ByVal 0& If lResult <> HP_FILE_RW_BLOCKSIZE Then lError = ERROR_NO_READ Err.Raise vbObjectError End If If Not CBool(CryptBinHashData(m_Hash_Object, fDat(1), HP_FILE_RW_BLOCKSIZE, 0)) Then lError = ERROR_NO_DIGEST Err.Raise vbObjectError End If lBytesProcessed = lBytesProcessed + HP_FILE_RW_BLOCKSIZE RaiseEvent HashFileStatus(lBytesProcessed, fLen) Next If fLostBytes <> 0 Then ReDim fDat(1 To fLostBytes)

ReadFile fNum, fDat(1), fLostBytes, lResult, ByVal 0& If lResult <> fLostBytes Then lError = ERROR_NO_READ Err.Raise vbObjectError End If If Not CBool(CryptBinHashData(m_Hash_Object, fDat(1), fLostBytes, 0)) Then lError = ERROR_NO_DIGEST Err.Raise vbObjectError End If lBytesProcessed = lBytesProcessed + fLostBytes RaiseEvent HashFileStatus(lBytesProcessed, fLen) End If End If CloseHandle fNum Erase fDat() ' menyetel data hash ke variabel Call SetHashData If m_Hash_DataLen = NO_DATASET Then lError = ERROR_NO_HASH_DATA Err.Raise vbObjectError ' Pengendali kesalahan proses End If m_Hash_DataReady = True m_Hash_Status = EC_HASH_READY ' Siap untuk Bekerja Lagi! RaiseEvent HashFileComplete Exit Sub ErrNoCreated: Err.Raise vbObject + lError, "EzCryptoApi", "Hash objek belum dibuat" Exit Sub ErrDigestFile: m_Hash_Status = EC_HASH_READY Dim sMsg As String If (fNum) Then CloseHandle fNum Select Case lError Case ERROR_NO_DIGEST: sMsg = "Kesalahan Mengolah Data" Case ERROR_FILE_NOT_FOUND: sMsg = "File Tidak Ditemukan" Case ERROR_NO_READ: sMsg = "Kesalahan Membaca data" Case ERROR_NO_HASH_DATA: sMsg = "Kesalahan Mendapat/menyetel data yang diolah" Case ERROR_IS_DIR: sMsg = "EzCryptApi tidak mengolah direktori" Case Else: Err.Raise Err.Number, "EzCryptoApi", Err.Description End Select Err.Raise vbObject + lError, "EzCryptoApi", sMsg End Sub Public Function GetDigestedData(ByVal echfFormat As EC_HASH_DATAFORMAT) As String

Dim lError As Long On Error GoTo errHandler If echfFormat < EC_HF_HEXADECIMAL Or echfFormat > EC_HF_ASCII Then lError = ERROR_ILLEGAL_PROPERTY Err.Raise vbObjectError End If 'mengambil data digest Dim sData As String, sHex As String Dim icounter As Integer If m_Hash_Status = EC_HASH_NONE Then lError = ERROR_NO_HASH_CREATE Err.Raise vbObjectError End If If m_Hash_DataLen = NO_DATASET Or m_Hash_DataReady = False Then lError = ERROR_NOTHING_DIGESTED Err.Raise vbObjectError End If ' memformat data Select Case echfFormat Case EC_HF_HEXADECIMAL For icounter = 0 To m_Hash_DataLen - 1 sHex = Hex(m_Hash_Data(icounter)) If Len(sHex) > 1 Then sData = sData & sHex & vbTab Else sData = sData & "0" & sHex & vbTab End If sHex = "" Next Case EC_HF_NUMERIC For icounter = 0 To m_Hash_DataLen - 1 sData = sData & CStr(m_Hash_Data(icounter)) Next Case EC_HF_ASCII For icounter = 0 To m_Hash_DataLen - 1 sData = sData & Chr(m_Hash_Data(icounter)) Next End Select GetDigestedData = sData Exit Function errHandler: Dim sMsg As String Select Case lError Case ERROR_NO_HASH_CREATE: sMsg = "Hash objek belum dibuat" Case ERROR_NOTHING_DIGESTED: sMsg = "Tidak Ada Yang Diolah" Case Else: Err.Raise Err.Number, "EzCryptoApi", Err.Description End Select Err.Raise vbObjectError + lError, "EzCryptoApi", sMsg End Function

Public Sub DestroyHash() Dim lError As Long On Error GoTo ErrDestroyHash If m_Hash_Status = EC_HASH_READY Then If Not CBool(CryptDestroyHash(m_Hash_Object)) Then lError = ERROR_NO_HASH_CREATE Err.Raise vbObjectError End If m_Hash_DataLen = 0 m_Hash_DataReady = False m_Hash_Status = EC_HASH_NONE End If Exit Sub ErrDestroyHash: If lError = ERROR_NO_HASH_CREATE Then Err.Raise vbObjectError + lError, "EzCryptoApi", "Tidak Dapat Menghacurkan Hash objek" Else: Err.Raise Err.Number, "EzCryptoApi", Err.Description End If End Sub Private Sub SetHashData() Dim lLength As Long lLength = 20& ' menyimpan panjang asli data If Not CBool(CryptGetHashParam(m_Hash_Object, HP_HASHVAL, m_Hash_Data(0), _ lLength, 0)) Then m_Hash_DataLen = 0 Exit Sub End If ' menyetel variabel modul untuk panjang asli data m_Hash_DataLen = lLength End Sub Public Sub EncryptFile(ByVal sSourceFile As String, Optional ReadWriteOffset As Long = 0) ' sebelum melakukan enkripsi, cek apa tidak terpakai If m_EncDec_Status = EC_CRYPT_BUSY Then Exit Sub End If Dim lKey As Long ' kunci enkripsi Dim lBuffLen As Long ' panjang penyangga Dim lFileLen As Long ' panjang citra pesa Dim lFileNum As Long ' nomor data Dim lBlockBytes As Long ' hasil blok citra pesan Dim lLostBytes As Long ' sisa Dim icounter As Long ' penghitung Dim lBytesProcessed As Long ' byte yang diproses Dim bFileData() As Byte ' byte penyangga enkripsi Dim btempFileData() As Byte ' penyangga sementara Dim lLength As Long ' panjang byte enkripsi Dim lResult As Long ' panjang hasil enkripsi

Dim lFileAttrib As Long Dim lError As Long

' atribut data ' nilai-nilai kesalahan

m_EncDec_Status = EC_CRYPT_BUSY On Error GoTo ErrEncrypt If Trim(Dir$(sSourceFile)) = "" Then lError = ERROR_FILE_NOT_FOUND Err.Raise vbObjectError End If If GetFileAttributes(sSourceFile) And FILE_ATTRIBUTE_NORMAL Then lFileAttrib = FILE_ATTRIBUTE_NORMAL ElseIf GetFileAttributes(sSourceFile) And FILE_ATTRIBUTE_SYSTEM Then lFileAttrib = FILE_ATTRIBUTE_SYSTEM ElseIf GetFileAttributes(sSourceFile) And FILE_ATTRIBUTE_HIDDEN Then lFileAttrib = FILE_ATTRIBUTE_SYSTEM ElseIf GetFileAttributes(sSourceFile) And FILE_ATTRIBUTE_READONLY Then lFileAttrib = FILE_ATTRIBUTE_READONLY ElseIf GetFileAttributes(sSourceFile) And FILE_ATTRIBUTE_TEMPORARY Then lFileAttrib = FILE_ATTRIBUTE_TEMPORARY ElseIf GetFileAttributes(sSourceFile) And FILE_ATTRIBUTE_DIRECTORY Then lError = ERROR_IS_DIR Err.Raise vbObjectError ' End If If Not lFileAttrib = FILE_ATTRIBUTE_NORMAL Then SetFileAttributes sSourceFile, FILE_ATTRIBUTE_NORMAL End If ' inisialisai kunci enkripsi lKey = InitKey If lKey = 0 Then lError = ERROR_NO_KEY_DERIVED Err.Raise vbObjectError End If

' sumber data untuk pembacaan dan penulisan data lFileNum = CreateFile(sSourceFile, GENERIC_READ Or GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, ByVal 0&, OPEN_EXISTING, 0, 0) If lFileNum = INVALID_HANDLE_VALUE Then lError = ERROR_NO_FILE_OPEN Err.Raise vbObjectError End If ' menyetel pointer data pada ReadFromOffset point SetFilePointer lFileNum, ReadWriteOffset, 0, FILE_BEGIN ' mengambil panjang citra penampung

lFileLen = GetFileSize(lFileNum, 0) - ReadWriteOffset ReDim bFileData(1 To (lFileLen * 2)) ' membaca data ReadFile lFileNum, bFileData(1), lFileLen, lResult, ByVal 0& If lResult <> lFileLen Then lError = ERROR_NO_READ Err.Raise vbObjectError End If ' menyetel pointer data pada ReadFromOffset point untuk menulis data tanpa error SetFilePointer lFileNum, ReadWriteOffset, 0, FILE_BEGIN RaiseEvent EncryptionFileStart If lFileLen <= HP_FILE_RW_BLOCKSIZE Then ' ' enkripsi blok lLength = lFileLen lBuffLen = UBound(bFileData) If Not CBool(CryptEncrypt(lKey, 0, 1, 0, bFileData(1), lLength, lBuffLen)) Then lError = ERROR_NO_ENCRYPT Err.Raise vbObjectError End If ' menulis hasil pada data WriteFile lFileNum, bFileData(1), lLength, lResult, ByVal 0& If lResult <> lLength Then lError = ERROR_NO_WRITE Err.Raise vbObjectError End If RaiseEvent EncryptionFileStatus(lFileLen, lFileLen) Else ' mencari panjang blok lBlockBytes = lFileLen \ HP_FILE_RW_BLOCKSIZE 'dan sisa byte lLostBytes = lFileLen Mod HP_FILE_RW_BLOCKSIZE ' alokasi ruang ReDim btempFileData(1 To (HP_FILE_RW_BLOCKSIZE * 2)) Dim Offset As Currency Offset = 1 lLength = HP_FILE_RW_BLOCKSIZE For icounter = 1 To lBlockBytes ' membaca dari sumber ke tujuan sementara CopyMem btempFileData(1), bFileData(Offset), HP_FILE_RW_BLOCKSIZE ' persiapan penyangga lBuffLen = UBound(btempFileData) ' enkripsi data! If Not CBool(CryptEncrypt(lKey, 0, 0, 0, btempFileData(1), lLength, lBuffLen)) Then lError = ERROR_NO_ENCRYPT Err.Raise vbObjectError End If ' menulis ke data WriteFile lFileNum, btempFileData(1), lLength, lResult, ByVal 0&

If lResult <> lLength Then lError = ERROR_NO_WRITE Err.Raise vbObjectError ' Fire error handler End If ' memperbaharui offset Offset = Offset + HP_FILE_RW_BLOCKSIZE DoEvents lBytesProcessed = (lBytesProcessed + HP_FILE_RW_BLOCKSIZE) RaiseEvent EncryptionFileStatus(lBytesProcessed, lFileLen) ' Next ' mengambil sisa byte If lLostBytes <> 0 Then

ReDim btempFileData(1 To (lLostBytes * 2)) CopyMem btempFileData(1), bFileData(Offset), lLostBytes ' persiapan enkripsi lLength = lLostBytes lBuffLen = UBound(btempFileData) 'Enkripsi data! If Not CBool(CryptEncrypt(lKey, 0, 1, 0, btempFileData(1), lLength, lBuffLen)) Then lError = ERROR_NO_ENCRYPT Err.Raise vbObjectError End If ' menulis ke data WriteFile lFileNum, btempFileData(1), lLength, lResult, ByVal 0& If lResult <> lLength Then lError = ERROR_NO_WRITE Err.Raise vbObjectError End If lBytesProcessed = (lBytesProcessed + (lLostBytes)) RaiseEvent EncryptionFileStatus(lBytesProcessed, lFileLen) End If End If ' menhilangkan kunci If (lKey) Then CryptDestroyKey lKey lKey = 0 'tutup data If (lFileNum) Then CloseHandle lFileNum ' mengosongkan sumber Erase bFileData Erase btempFileData ' menyetel ulang atribut If lFileAttrib <> FILE_ATTRIBUTE_NORMAL Then SetFileAttributes sSourceFile, lFileAttrib End If m_EncDec_Status = EC_CRYPT_READY RaiseEvent EncryptionFileComplete Exit Sub ErrEncrypt: m_EncDec_Status = EC_CRYPT_READY

Dim sMsg As String 'tutup data If (lFileNum) Then ' menyetel ulang atribut If lFileAttrib <> FILE_ATTRIBUTE_NORMAL And lError <> ERROR_IS_DIR Then SetFileAttributes sSourceFile, lFileAttrib End If CloseHandle lFileNum End If ' menghilangkan kunci If (lKey) Then CryptDestroyKey lKey ' mengahpus data sementara Select Case lError Case ERROR_FILE_NOT_FOUND: sMsg = "File Tidak Ditemukan" Case ERROR_TMPPTH_NOT_FOUND: sMsg = "Folder Sementara Tidak Ditemukan" Case ERROR_NO_TMP_FILE: sMsg = "Kesalahan dalam membuat File Sementara" Case ERROR_NO_READ: sMsg = "Kesalahan Membaca File" Case ERROR_NO_WRITE: sMsg = "Kesalahan Mengisi File" Case ERROR_NO_FILE_OPEN: sMsg = "Kesalahan Membuka Sumber File" Case ERROR_NO_TMP_OPEN: sMsg = "Kesalahan Membuat File Sementara" Case ERROR_NO_ENCRYPT: sMsg = "Kesalahan Mengenkripsi File" Case ERROR_NO_KEY_DERIVED: sMsg = "Kesalahan dalam mendapat kunci untuk enkripsi" Case ERROR_IS_DIR: sMsg = "EzCryptApi Tidak Mengenkripsi direktori" Case Else: Err.Raise Err.Number, "EzCryptoApi", Err.Description End Select Err.Raise vbObjectError + lError, "EzCryptoApi", sMsg End Sub Public Sub EncryptToDestFile(ByVal sSourceFile As String, ByVal sDestFile As String, Optional WriteToOffset As Long = 0) ' pengecekan sebelum enkripsi If m_EncDec_Status = EC_CRYPT_BUSY Then Exit Sub End If Dim lKey As Long ' kunci enkripsi Dim lBuffLen As Long ' panjang penyangga Dim lFileLen As Long ' panjang citra penampung Dim lFileNum As Long ' nomor data Dim lDestFileNum As Long ' nomor data tujuan Dim lBlockBytes As Long ' hasil blok citra penampung Dim lLostBytes As Long ' berapa tersisa Dim icounter As Long ' penghitung Dim lBytesProcessed As Long ' byte yang diproses Dim bFileData() As Byte ' penyangga byte untuk enkripsi Dim lLength As Long ' panjang byte enkripsi Dim lResult As Long ' panjang hasil enkripsi Dim lFileAttrib As Long ' atribut data Dim lError As Long ' nilai kesalahan

m_EncDec_Status = EC_CRYPT_BUSY On Error GoTo ErrEncrypt ' pengecekan data If Trim(Dir$(sSourceFile)) = "" Then lError = ERROR_FILE_NOT_FOUND Err.Raise vbObjectError End If ' mencari atribut data If GetFileAttributes(sSourceFile) And FILE_ATTRIBUTE_NORMAL Then lFileAttrib = FILE_ATTRIBUTE_NORMAL ElseIf GetFileAttributes(sSourceFile) And FILE_ATTRIBUTE_SYSTEM Then lFileAttrib = FILE_ATTRIBUTE_SYSTEM ElseIf GetFileAttributes(sSourceFile) And FILE_ATTRIBUTE_HIDDEN Then lFileAttrib = FILE_ATTRIBUTE_SYSTEM ElseIf GetFileAttributes(sSourceFile) And FILE_ATTRIBUTE_READONLY Then lFileAttrib = FILE_ATTRIBUTE_READONLY ElseIf GetFileAttributes(sSourceFile) And FILE_ATTRIBUTE_TEMPORARY Then lFileAttrib = FILE_ATTRIBUTE_TEMPORARY ElseIf GetFileAttributes(sSourceFile) And FILE_ATTRIBUTE_DIRECTORY Then lError = ERROR_IS_DIR Err.Raise vbObjectError End If ' menyetel atribut ke normal If Not lFileAttrib = FILE_ATTRIBUTE_NORMAL Then SetFileAttributes sSourceFile, FILE_ATTRIBUTE_NORMAL End If ' inilisasi kunci enkrpsi lKey = InitKey If lKey = 0 Then lError = ERROR_NO_KEY_DERIVED Err.Raise vbObjectError End If ' membuka kembali fdata lFileNum = CreateFile(sSourceFile, GENERIC_READ Or GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, ByVal 0&, OPEN_EXISTING, 0, 0) If lFileNum = INVALID_HANDLE_VALUE Then lError = ERROR_NO_FILE_OPEN Err.Raise vbObjectError End If ' mengambil panjang data sumber lFileLen = GetFileSize(lFileNum, 0) ' membuka data tujuan lDestFileNum = CreateFile(sDestFile, GENERIC_WRITE, 0, ByVal 0&, OPEN_ALWAYS, ByVal 0&, 0) If lDestFileNum = INVALID_HANDLE_VALUE Then

lError = ERROR_NO_FILE_OPEN Err.Raise vbObjectError End If ' menyetel pointer data pada permulaan data SetFilePointer lFileNum, 0, 0, FILE_BEGIN SetFilePointer lDestFileNum, WriteToOffset, 0, FILE_BEGIN RaiseEvent EncryptionFileStart If lFileLen <= HP_FILE_RW_BLOCKSIZE Then RaiseEvent EncryptionFileStart ' menyiapkan ruang penyangga ReDim bFileData(1 To (lFileLen * 2)) ReadFile lFileNum, bFileData(1), lFileLen, lResult, ByVal 0& If lResult <> lFileLen Then lError = ERROR_NO_READ Err.Raise vbObjectError End If RaiseEvent EncryptionFileStatus((lFileLen * 0.25), lFileLen) ' enkripsi blok lLength = lFileLen lBuffLen = UBound(bFileData) If Not CBool(CryptEncrypt(lKey, 0, 1, 0, bFileData(1), lLength, lBuffLen)) Then lError = ERROR_NO_ENCRYPT Err.Raise vbObjectError End If RaiseEvent EncryptionFileStatus(lFileLen * 0.5, lFileLen) ' menulis ke data tujuan WriteFile lDestFileNum, bFileData(1), lLength, lResult, ByVal 0& If lResult <> lLength Then lError = ERROR_NO_WRITE Err.Raise vbObjectError End If RaiseEvent EncryptionFileStatus(lFileLen, lFileLen) Else ' jika lebih besar dari HP_FILE_RW_BLOCKSIZE lBlockBytes = lFileLen \ HP_FILE_RW_BLOCKSIZE ' sisa byte lLostBytes = lFileLen Mod HP_FILE_RW_BLOCKSIZE ' alokasi ruang ' enkripsi blok dan menulis ke data tujuan ReDim bFileData(1 To (HP_FILE_RW_BLOCKSIZE * 2)) lLength = HP_FILE_RW_BLOCKSIZE For icounter = 1 To lBlockBytes ' membaca dari sumber ReadFile lFileNum, bFileData(1), HP_FILE_RW_BLOCKSIZE, lResult, ByVal 0& If lResult <> HP_FILE_RW_BLOCKSIZE Then lError = ERROR_NO_READ Err.Raise vbObjectError End If

' menyiapkan penyangga lBuffLen = UBound(bFileData) ' Enkripsi data! If Not CBool(CryptEncrypt(lKey, 0, 0, 0, bFileData(1), lLength, lBuffLen)) Then lError = ERROR_NO_ENCRYPT Err.Raise vbObjectError End If ' menulis ke data tujuan WriteFile lDestFileNum, bFileData(1), lLength, lResult, ByVal 0& If lResult <> lLength Then lError = ERROR_NO_WRITE Err.Raise vbObjectError End If DoEvents lBytesProcessed = (lBytesProcessed + HP_FILE_RW_BLOCKSIZE) RaiseEvent EncryptionFileStatus(lBytesProcessed, lFileLen) ' Next ' hitung sisa If lLostBytes <> 0 Then ReDim bFileData(1 To (lLostBytes * 2)) ReadFile lFileNum, bFileData(1), lLostBytes, lResult, ByVal 0& If lResult <> lLostBytes Then lError = ERROR_NO_READ Err.Raise vbObjectError End If ' menyiapakan enkripsi lLength = lLostBytes lBuffLen = UBound(bFileData) 'Enkripsi data! If Not CBool(CryptEncrypt(lKey, 0, 1, 0, bFileData(1), lLength, lBuffLen)) Then lError = ERROR_NO_ENCRYPT Err.Raise vbObjectError End If ' menulis hasil ke data tujuan WriteFile lDestFileNum, bFileData(1), lLength, lResult, ByVal 0& If lResult <> lLength Then lError = ERROR_NO_WRITE Err.Raise vbObjectError End If lBytesProcessed = (lBytesProcessed + (lLostBytes)) RaiseEvent EncryptionFileStatus(lBytesProcessed, lFileLen) End If End If ' menghilangkan kunci If (lKey) Then CryptDestroyKey lKey lKey = 0 'menutup data If (lFileNum) Then CloseHandle lFileNum

'menutup data tujuan If (lDestFileNum) Then CloseHandle lDestFileNum ' mengosongkan data sumber Erase bFileData 'menghapus data sementara If Not lFileAttrib = FILE_ATTRIBUTE_NORMAL Then SetFileAttributes sSourceFile, FILE_ATTRIBUTE_NORMAL End If ' menyetel kermbali atribut SetFileAttributes sDestFile, lFileAttrib

m_EncDec_Status = EC_CRYPT_READY RaiseEvent EncryptionFileComplete Exit Sub ErrEncrypt: m_EncDec_Status = EC_CRYPT_READY Dim sMsg As String If (lFileNum) Then If lFileAttrib <> FILE_ATTRIBUTE_NORMAL And lError <> ERROR_IS_DIR Then SetFileAttributes sSourceFile, lFileAttrib End If CloseHandle lFileNum End If If (lDestFileNum) Then CloseHandle lDestFileNum ' menghapus kunci If (lKey) Then CryptDestroyKey lKey ' menghapus data sementara Select Case lError Case ERROR_FILE_NOT_FOUND: sMsg = "File Tidak Ditemukan" Case ERROR_TMPPTH_NOT_FOUND: sMsg = "Folder Sementara Tidak Ditemukan" Case ERROR_NO_TMP_FILE: sMsg = "Kesalahan dalam membuat File Sementara" Case ERROR_NO_READ: sMsg = "Kesalahan Membaca File" Case ERROR_NO_WRITE: sMsg = "Kesalahan Mengisi File" Case ERROR_NO_FILE_OPEN: sMsg = "Kesalahan Membuka Sumber File" Case ERROR_NO_TMP_OPEN: sMsg = "Kesalahan Membuat File Sementara" Case ERROR_NO_ENCRYPT: sMsg = "Kesalahan Mengenkripsi File" Case ERROR_NO_KEY_DERIVED: sMsg = "Kesalahan dalam mendapat kunci Untuk enkripsi" Case ERROR_IS_DIR: sMsg = "EzCryptApi Tidak Mengenkripsi direktori" Case Else: Err.Raise Err.Number, "EzCryptoApi", Err.Description End Select Err.Raise vbObjectError + lError, "EzCryptoApi", sMsg End Sub

' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ' prosedur dekripsi ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Public Sub DecryptFile(ByVal sSourceFile As String, Optional ReadWriteOffset As Long = 0) If m_EncDec_Status = EC_CRYPT_BUSY Then Exit Sub End If Dim sTempPath As String ' alamat folder sementara Dim sTempFilename As String ' nama sementara data Dim lFileTempNum As Long ' nomor sementara data Dim lTempPathLen As Long ' panjang alamat sementara Dim lKey As Long ' kunci enkripsi Dim lFileLen As Long ' panjang citra yang akan di dekripsi Dim lFileNum As Long ' nomor data Dim lBlockBytes As Long ' blok byte citra yang akan di dekripsi Dim lLostBytes As Long ' sisa byte Dim icounter As Long ' penghitung i Dim jCounter As Long ' penghitung j Dim lBytesProcessed As Long ' byte yang diproses Dim bBufflen As Byte ' panjang penyangga Dim bFileData() As Byte ' penampung berkas data Dim btempFileData() As Byte ' penampung berkas data untuk penulisan Dim lResult As Long ' nilai yang di dekripsi Dim lLength As Long ' panjang penyangga Dim lFileAttrib As Long ' atribut data Dim lError As Long ' nilai kesalahan On Error GoTo ErrDecryptFile m_EncDec_Status = EC_CRYPT_BUSY ' pengecekan data If Trim(Dir$(sSourceFile)) = "" Then lError = ERROR_FILE_NOT_FOUND Err.Raise vbObjectError End If ' inisialisasi kunci lKey = InitKey If lKey = 0 Then lError = ERROR_NO_KEY_DERIVED Err.Raise vbObjectError End If ' mencari atribut data If GetFileAttributes(sSourceFile) And FILE_ATTRIBUTE_NORMAL Then lFileAttrib = FILE_ATTRIBUTE_NORMAL ElseIf GetFileAttributes(sSourceFile) And FILE_ATTRIBUTE_SYSTEM Then lFileAttrib = FILE_ATTRIBUTE_SYSTEM ElseIf GetFileAttributes(sSourceFile) And FILE_ATTRIBUTE_HIDDEN Then lFileAttrib = FILE_ATTRIBUTE_SYSTEM ElseIf GetFileAttributes(sSourceFile) And FILE_ATTRIBUTE_READONLY Then lFileAttrib = FILE_ATTRIBUTE_READONLY

ElseIf GetFileAttributes(sSourceFile) And FILE_ATTRIBUTE_TEMPORARY Then lFileAttrib = FILE_ATTRIBUTE_TEMPORARY ElseIf GetFileAttributes(sSourceFile) And FILE_ATTRIBUTE_DIRECTORY Then lError = ERROR_IS_DIR Err.Raise vbObjectError End If ' menyetel atribut data ke normal If lFileAttrib <> FILE_ATTRIBUTE_NORMAL Then SetFileAttributes sSourceFile, FILE_ATTRIBUTE_NORMAL End If ' membaca sumber lFileNum = CreateFile(sSourceFile, GENERIC_READ, FILE_SHARE_READ Or FILE_SHARE_WRITE, ByVal 0&, OPEN_EXISTING, 0, 0) If lFileNum = INVALID_HANDLE_VALUE Then lError = ERROR_NO_FILE_OPEN Err.Raise vbObjectError End If ' menyetel pointer SetFilePointer lFileNum, ReadWriteOffset, 0, FILE_BEGIN ' mengambil panjang sumber lFileLen = GetFileSize(lFileNum, 0) - ReadWriteOffset ReDim bFileData(1 To lFileLen) ' ReadFile lFileNum, bFileData(1), UBound(bFileData), lResult, ByVal 0& If lResult <> UBound(bFileData) Then lError = ERROR_NO_READ Err.Raise vbObjectError End If CloseHandle lFileNum lFileNum = CreateFile(sSourceFile, GENERIC_WRITE, FILE_SHARE_READ, ByVal 0&, TRUNCATE_EXISTING, 0, 0) If lFileNum = INVALID_HANDLE_VALUE Then lError = ERROR_NO_FILE_OPEN Err.Raise vbObjectError ' End If 'menyetel pointer di awal SetFilePointer lFileNum, 0, 0, FILE_BEGIN RaiseEvent DecryptionFileStart If lFileLen <= HP_FILE_RW_BLOCKSIZE Then 'menyiapkan penyangga enkripsi lLength = UBound(bFileData) 'dekripsi data! [Full file Size] If Not CBool(CryptDecrypt(lKey, 0, 1, 0, bFileData(1), lLength)) Then lError = ERROR_NO_DECRYPT Err.Raise vbObjectError End If ' tulis hasil ke data tujuan WriteFile lFileNum, bFileData(1), lLength, lResult, ByVal 0&

If lResult <> lLength Then lError = ERROR_NO_WRITE Err.Raise vbObjectError End If lBytesProcessed = (lBytesProcessed + lLength) RaiseEvent DecryptionFileStatus(lBytesProcessed, lFileLen) Else ' mencari berapa blok pesan lBlockBytes = lFileLen \ HP_FILE_RW_BLOCKSIZE lLostBytes = lFileLen Mod HP_FILE_RW_BLOCKSIZE ' melakukan dekripsi ReDim btempFileData(1 To HP_FILE_RW_BLOCKSIZE) Dim Offset As Currency Offset = 1 lLength = HP_FILE_RW_BLOCKSIZE For icounter = 1 To lBlockBytes ' CopyMem btempFileData(1), bFileData(Offset), HP_FILE_RW_BLOCKSIZE 'Deckripsi data! If Not CBool(CryptDecrypt(lKey, 0, 0, 0, btempFileData(1), lLength)) Then lError = ERROR_NO_DECRYPT Err.Raise vbObjectError End If ' menulis ke data sementara WriteFile lFileNum, btempFileData(1), lLength, lResult, ByVal 0& If lResult <> lLength Then lError = ERROR_NO_WRITE Err.Raise vbObjectError End If ' memperbaharui offset Offset = Offset + HP_FILE_RW_BLOCKSIZE lBytesProcessed = (lBytesProcessed + HP_FILE_RW_BLOCKSIZE) RaiseEvent DecryptionFileStatus(lBytesProcessed, lFileLen) DoEvents Next ' mencari sisa byte[jika ada] If lLostBytes <> 0 Then ReDim btempFileData(1 To lLostBytes) CopyMem btempFileData(1), bFileData(Offset), lLostBytes 'jika ada lLength = lLostBytes 'Dekripsi data! If Not CBool(CryptDecrypt(lKey, 0, 1, 0, btempFileData(1), lLength)) Then lError = ERROR_NO_DECRYPT Err.Raise vbObjectError End If

WriteFile lFileNum, btempFileData(1), lLostBytes, lResult, ByVal 0& If lResult <> lLostBytes Then lError = ERROR_NO_WRITE Err.Raise vbObjectError End If lBytesProcessed = (lBytesProcessed + lLostBytes) RaiseEvent DecryptionFileStatus(lBytesProcessed, lFileLen) End If End If If (lKey) Then CryptDestroyKey lKey CloseHandle lFileNum lFileNum = 0 ' melepas sumber If (lKey) Then CryptDestroyKey lKey ' tutup berkas If (lFileNum) Then CloseHandle lFileNum Erase bFileData Erase btempFileData ' menyetel ulang atribut berkas If lFileAttrib <> FILE_ATTRIBUTE_NORMAL Then SetFileAttributes sSourceFile, lFileAttrib End If m_EncDec_Status = EC_CRYPT_READY RaiseEvent DecryptionFileComplete Exit Sub ErrDecryptFile: m_EncDec_Status = EC_CRYPT_NONE Dim sMsg As String If (lKey) Then CryptDestroyKey lKey If (lFileNum) Then ' If lFileAttrib <> FILE_ATTRIBUTE_NORMAL And lError <> ERROR_IS_DIR Then SetFileAttributes sSourceFile, lFileAttrib End If CloseHandle lFileNum End If Select Case lError Case ERROR_FILE_NOT_FOUND: sMsg = "File Tidak Ditemukan" Case ERROR_TMPPTH_NOT_FOUND: sMsg = "Folder Sementara Tidak Ditemukan" Case ERROR_NO_TMP_FILE: sMsg = "Kesalahan dalam membuat File Sementara" Case ERROR_NO_READ: sMsg = "Kesalahan Membaca File" Case ERROR_NO_WRITE: sMsg = "Kesalahan Mengisi File" Case ERROR_NO_FILE_OPEN: sMsg = "Kesalahan Membuka Sumber File" Case ERROR_NO_TMP_OPEN: sMsg = "Kesalahan Membuat File Sementara" Case ERROR_NO_DECRYPT: sMsg = "Kesalahan Mendeskripsi File"

Case ERROR_NO_KEY_DERIVED: sMsg = "Kesalahan dalam Mendapat kunci untuk deskripsi" Case ERROR_IS_DIR: sMsg = "EzCryptApi Tidak Mendeskripsi direktori" Case Else: Err.Raise Err.Number, "EzCryptoApi", Err.Description End Select Err.Raise vbObjectError + lError, "EzCryptoApi", sMsg End Sub ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ' Prosedur DecryptToDestFile ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Public Sub DecryptToDestFile(ByVal sSourceFile As String, ByVal sDestFile As String, Optional ReadFromOffset As Long = 0) If m_EncDec_Status = EC_CRYPT_BUSY Then Exit Sub End If Dim lKey As Long ' kunci enkripsi Dim lFileLen As Long ' panjang data yang akan didekripsi Dim lFileNum As Long ' pengontrol berkas Dim lDestFileNum As Long ' tujuan pengontrol berkas Dim lBlockBytes As Long ' panjang blok byte data Dim lLostBytes As Long ' sisa byte Dim icounter As Long ' penghitung Dim lBytesProcessed As Long ' byte yang diproses Dim bBufflen As Byte ' panjang penyangga dekripsi Dim bFileData() As Byte ' penampung berkas data Dim btempFileData() As Byte ' penampung penulisan berkas data Dim lResult As Long ' nilai pengembalian Dim lLength As Long ' Panjang penyangga Dim lFileAttrib As Long ' atribut berkas Dim lError As Long ' nilai kesalahan On Error GoTo ErrDecryptFile m_EncDec_Status = EC_CRYPT_BUSY ' pengecekan berkas data If Trim(Dir$(sSourceFile)) = "" Then lError = ERROR_FILE_NOT_FOUND Err.Raise vbObjectError End If ' inisialisasi kunci lKey = InitKey If lKey = 0 Then lError = ERROR_NO_KEY_DERIVED Err.Raise vbObjectError End If ' mencari jenis atribut berkas If GetFileAttributes(sSourceFile) And FILE_ATTRIBUTE_NORMAL Then lFileAttrib = FILE_ATTRIBUTE_NORMAL ElseIf GetFileAttributes(sSourceFile) And FILE_ATTRIBUTE_SYSTEM Then lFileAttrib = FILE_ATTRIBUTE_SYSTEM ElseIf GetFileAttributes(sSourceFile) And FILE_ATTRIBUTE_HIDDEN Then lFileAttrib = FILE_ATTRIBUTE_SYSTEM

ElseIf GetFileAttributes(sSourceFile) And FILE_ATTRIBUTE_READONLY Then lFileAttrib = FILE_ATTRIBUTE_READONLY ElseIf GetFileAttributes(sSourceFile) And FILE_ATTRIBUTE_TEMPORARY Then lFileAttrib = FILE_ATTRIBUTE_TEMPORARY ElseIf GetFileAttributes(sSourceFile) And FILE_ATTRIBUTE_DIRECTORY Then lError = ERROR_IS_DIR End If ' menyetel atribut ke normal If lFileAttrib <> FILE_ATTRIBUTE_NORMAL Then SetFileAttributes sSourceFile, FILE_ATTRIBUTE_NORMAL End If ' sumber berkas lFileNum = CreateFile(sSourceFile, GENERIC_READ, FILE_SHARE_READ, ByVal 0&, OPEN_EXISTING, 0, 0) If lFileNum = INVALID_HANDLE_VALUE Then lError = ERROR_NO_FILE_OPEN Err.Raise vbObjectError End If ' membuka berkas tujuan penulisan lDestFileNum = CreateFile(sDestFile, GENERIC_WRITE, FILE_SHARE_READ, ByVal 0&, OPEN_ALWAYS, 0, 0) If lDestFileNum = INVALID_HANDLE_VALUE Then lError = ERROR_NO_FILE_OPEN Err.Raise vbObjectError End If ' menyetel pointer ke awal berkas SetFilePointer lFileNum, ReadFromOffset, 0, FILE_BEGIN SetFilePointer lDestFileNum, 0, 0, FILE_BEGIN ' mengambil panjang beraks sumber lFileLen = GetFileSize(lFileNum, 0) - ReadFromOffset RaiseEvent DecryptionFileStart If lFileLen <= HP_FILE_RW_BLOCKSIZE Then ReDim bFileData(1 To lFileLen) lLength = UBound(bFileData) ReadFile lFileNum, bFileData(1), lLength, lResult, ByVal 0& If lResult <> lLength Then lError = ERROR_NO_READ Err.Raise vbObjectError End If RaiseEvent DecryptionFileStatus(lFileLen * 0.25, lFileLen) ' menyiapkan penyangga 'Dekripsi data! [Full file Size] If Not CBool(CryptDecrypt(lKey, 0, 1, 0, bFileData(1), lResult)) Then lError = ERROR_NO_DECRYPT Err.Raise vbObjectError End If RaiseEvent DecryptionFileStatus(lFileLen * 0.5, lFileLen)

' menulis hasil ke berkas tujuan WriteFile lDestFileNum, bFileData(1), lLength, lResult, ByVal 0& If lResult <> lLength Then lError = ERROR_NO_WRITE Err.Raise vbObjectError End If RaiseEvent DecryptionFileStatus(lFileLen, lFileLen) Else ' mencari tahu panjang blok lBlockBytes = lFileLen \ HP_FILE_RW_BLOCKSIZE lLostBytes = lFileLen Mod HP_FILE_RW_BLOCKSIZE ' mengulang sebanyak blok dan melakukan dekripsi ReDim bFileData(1 To HP_FILE_RW_BLOCKSIZE) For icounter = 1 To lBlockBytes ReadFile lFileNum, bFileData(1), HP_FILE_RW_BLOCKSIZE, lResult, ByVal 0& If lResult <> HP_FILE_RW_BLOCKSIZE Then lError = ERROR_NO_READ Err.Raise vbObjectError End If If Not CBool(CryptDecrypt(lKey, 0, 0, 0, bFileData(1), HP_FILE_RW_BLOCKSIZE)) Then lError = ERROR_NO_DECRYPT Err.Raise vbObjectError End If ' menulis ke berkas tujuan WriteFile lDestFileNum, bFileData(1), HP_FILE_RW_BLOCKSIZE, lResult, ByVal 0& If lResult <> HP_FILE_RW_BLOCKSIZE Then lError = ERROR_NO_WRITE Err.Raise vbObjectError End If lBytesProcessed = (lBytesProcessed + HP_FILE_RW_BLOCKSIZE) RaiseEvent DecryptionFileStatus(lBytesProcessed, lFileLen) DoEvents Next If lLostBytes <> 0 Then ReDim bFileData(1 To lLostBytes) ReadFile lFileNum, bFileData(1), lLostBytes, lResult, ByVal 0& If lResult <> lLostBytes Then lError = ERROR_NO_READ Err.Raise vbObjectError End If

If Not CBool(CryptDecrypt(lKey, 0, 1, 0, bFileData(1), lLostBytes)) Then lError = ERROR_NO_DECRYPT Err.Raise vbObjectError End If WriteFile lDestFileNum, bFileData(1), lLostBytes, lResult, ByVal 0& If lResult <> lLostBytes Then lError = ERROR_NO_WRITE Err.Raise vbObjectError End If lBytesProcessed = (lBytesProcessed + lLostBytes) RaiseEvent DecryptionFileStatus(lBytesProcessed, lFileLen) End If End If ' melepas sumber If (lKey) Then CryptDestroyKey lKey ' menyetel kembali atribut CloseHandle lFileNum lFileNum = 0 If lFileAttrib <> FILE_ATTRIBUTE_NORMAL Then SetFileAttributes sSourceFile, FILE_ATTRIBUTE_NORMAL End If CloseHandle lDestFileNum lDestFileNum = 0 ' menyetel kembali atribut SetFileAttributes sDestFile, lFileAttrib Erase bFileData m_EncDec_Status = EC_CRYPT_READY RaiseEvent DecryptionFileComplete Exit Sub ErrDecryptFile: m_EncDec_Status = EC_CRYPT_NONE Dim sMsg As String If (lKey) Then CryptDestroyKey lKey If (lFileNum) Then ' menyetel kembali atribut If lFileAttrib <> FILE_ATTRIBUTE_NORMAL And lError <> ERROR_IS_DIR Then SetFileAttributes sSourceFile, lFileAttrib End If CloseHandle lFileNum End If If (lDestFileNum) Then CloseHandle lDestFileNum If IsArray(bFileData) Then Erase bFileData Select Case lError Case ERROR_FILE_NOT_FOUND: sMsg = "File Tidak Ditemukan" Case ERROR_TMPPTH_NOT_FOUND: sMsg = "Folder Sementara Tidak Ditemukan" Case ERROR_NO_TMP_FILE: sMsg = "Kesalahan dalam membuat File Sementara" Case ERROR_NO_READ: sMsg = "Kesalahan Membaca File"

Case ERROR_NO_WRITE: sMsg = "Kesalahan Mengisi File" Case ERROR_NO_FILE_OPEN: sMsg = "Kesalahan Membuka Sumber File" Case ERROR_NO_TMP_OPEN: sMsg = "Kesalahan Membuat File Sementara" Case ERROR_NO_DECRYPT: sMsg = "Kesalahan Mendeskripsi File" Case ERROR_NO_KEY_DERIVED: sMsg = "Kesalahan dalam Mendapat kunci untuk deskripsi" Case ERROR_IS_DIR: sMsg = "EzCryptApi Tidak Mendeskripsi direktori" Case Else: Err.Raise Err.Number, "EzCryptoApi", Err.Description End Select Err.Raise vbObjectError + lError, "EzCryptoApi", sMsg End Sub ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ' Inisialisasi kunci enkripsi/dekripsi ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Private Function InitKey() As Long Dim lHash As Long Dim lKey As Long InitKey = 0 lKey = 0 ' If Not CBool(InitProvider()) Then GoTo Done End If If Not CBool(CryptCreateHash(m_CSP_Provider, m_Hash_Algorithm, 0, 0, lHash)) Then GoTo Done End If If Not CBool(CryptHashData(lHash, m_EncDec_Password, Len(m_EncDec_Password), 0)) Then GoTo Done End If If Not CBool(CryptDeriveKey(m_CSP_Provider, m_EncDec_Algorithm, lHash, 0, lKey)) Then GoTo Done End If CryptDestroyHash (lHash) lHash = 0 Done: InitKey = lKey End Function ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ' Inisialsasi Service Provider ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Private Function InitProvider() As Long Dim sProvider As String Dim sContainer As String InitProvider = 1 If m_CSP_Provider = 0 Then sProvider = MS_ENHANCED_PROV & vbNullChar m_Provider_Name = [Microsoft Enhanced Cryptographic Provider] sContainer = vbNullChar If Not CBool(CryptAcquireContext(m_CSP_Provider, ByVal sContainer, ByVal sProvider, PROV_RSA_FULL, 0)) Then If Not CBool(CryptAcquireContext(m_CSP_Provider, ByVal sContainer, ByVal sProvider, PROV_RSA_FULL, CRYPT_NEWKEYSET)) Then sProvider = MS_DEF_PROV & vbNullChar m_Provider_Name = [Microsoft Base Cryptographic Provider v.1] If Not CBool(CryptAcquireContext(m_CSP_Provider, ByVal sContainer, ByVal sProvider, PROV_RSA_FULL, 0)) Then If Not CBool(CryptAcquireContext(m_CSP_Provider, ByVal sContainer, ByVal sProvider, PROV_RSA_FULL, CRYPT_NEWKEYSET)) Then MsgBox "Unable to get a handle to key containers..." & vbCrLf & "Check your registry for the following names:" & _ vbCrLf & "Microsoft Base Cryptographic Provider v1.0" & vbCrLf & _ "Microsoft Enhanced Cryptographic Provider v1.0" & vbCrLf & "Without them, EzCryptoApi won't work.", vbCritical, "Fatal Error [EzCryptoApi]" m_Provider_Name = [No Providers] InitProvider = 0 End If End If End If End If End If End Function Public Function EncryptData(ByVal sData As String) As String If m_EncDec_Status = EC_CRYPT_BUSY Then Exit Function Dim lKey As Long Dim sBuffer As String Dim lLength As Long Dim lBufLen As Long Dim lError As Long On Error GoTo ErrEncrypt m_EncDec_Status = EC_CRYPT_BUSY lKey = InitKey If lKey = 0 Then lError = ERROR_NO_KEY_DERIVED

Err.Raise vbObjectError End If RaiseEvent EncryptionDataStart lLength = Len(sData) lBufLen = lLength * 2 sBuffer = String(lBufLen, vbNullChar) LSet sBuffer = sData If Not CBool(CryptStringEncrypt(lKey, 0, 1, 0, sBuffer, lLength, lBufLen)) Then lError = ERROR_NO_ENCRYPT Err.Raise vbObjectError End If EncryptData = Left$(sBuffer, lLength) If (lKey) Then CryptDestroyKey lKey RaiseEvent EncryptionDataComplete m_EncDec_Status = EC_CRYPT_READY Exit Function ErrEncrypt: m_EncDec_Status = EC_CRYPT_NONE Dim sMsg As String If (lKey) Then CryptDestroyKey lKey Select Case lError Case ERROR_NO_KEY_DERIVED: sMsg = "Kesalahan dalam Mendapat kunci untuk enkripsi" Case ERROR_NO_ENCRYPT: sMsg = "Kesalahan mengenkripsi data" Case Else: Err.Raise Err.Number, "EzCryptoApi", Err.Description End Select Err.Raise vbObjectError + lError, "EzCryptoApi", sMsg End Function Public Function DecryptData(ByVal sData As String) As String If m_EncDec_Status = EC_CRYPT_BUSY Then Exit Function Dim lError As Long ' untuk memunculkan peringatan kesalahan Dim lKey As Long ' kunci untuk algoritma enkripsi 'Dim lResult As Long Dim lBufLen As Long ' panjang data On Error GoTo ErrDecrypt m_EncDec_Status = EC_CRYPT_BUSY RaiseEvent DecryptionDataStart lKey = InitKey() If lKey = 0 Then lError = ERROR_NO_KEY_DERIVED Err.Raise vbObjectError End If

lBufLen = Len(sData) If Not CBool(CryptStringDecrypt(lKey, 0, 1, 0, sData, lBufLen)) Then lError = ERROR_NO_DECRYPT Err.Raise vbObjectError End If

DecryptData = Mid$(sData, 1, lBufLen)

If lKey Then CryptDestroyKey lKey RaiseEvent DecryptionDataComplete m_EncDec_Status = EC_CRYPT_READY Exit Function ErrDecrypt: m_EncDec_Status = EC_CRYPT_NONE Dim sMsg As String Select Case lError Case ERROR_NO_KEY_DERIVED: sMsg = "Kesalahan dalam Mendapat kunci untuk deskripsi" Case ERROR_NO_DECRYPT: sMsg = "Kesalahan mendeskripsi data" Case Else: Err.Raise Err.Number, "EzCryptoApi", Err.Description End Select Err.Raise vbObjectError + lError, "Ezcryptoapi", sMsg End Function Private Sub Class_Initialize() Dim lResult As Long lResult = InitProvider If lResult = 1 Then CryptReleaseContext m_CSP_Provider, 0 m_CSP_Provider = 0

HP_FILE_RW_BLOCKSIZE = HP_FILE_RW_BLOCKSIZE_1m m_Hash_Status = EC_HASH_NONE End Sub

Private Sub Class_Terminate() If m_Hash_Status = EC_HASH_READY Then CryptDestroyHash m_Hash_Object End Sub

3.2 CLASS MODUL Identifikasi File dan Icon Gambar
Option Explicit Dim mbFileName() As Byte 'nama file Dim mbFileTitle() As Byte 'title untuk nama file Dim mbType() As Byte 'tipe file yaitu: txt, bmp, jpg, gif, png Dim msKey As String * 3 'unique key Dim mlLenFile& 'ukuran file ini hanya dalam byte

Public Property Get KeyFile() As String KeyFile = msKey End Property Public Property Let KeyFile(ByVal sNewKey As String) msKey = sNewKey End Property Public Property Get TypeFile() As String TypeFile = StrConv(mbType(), vbUnicode) End Property Public Property Let TypeFile(ByVal sNewType As String) mbType() = StrConv(sNewType, vbFromUnicode) End Property Public Property Get LenBytes() As Long LenBytes = mlLenFile End Property Public Property Let LenBytes(ByVal lNewLen As Long) mlLenFile = lNewLen End Property Public Property Get FileName() As String FileName = StrConv(mbFileName(), vbUnicode) End Property Public Property Let FileName(ByVal sNewFile As String) mbFileName() = StrConv(sNewFile, vbFromUnicode) End Property Public Property Get FileTitle() As String FileTitle = StrConv(mbFileTitle(), vbUnicode) End Property Public Property Let FileTitle(ByVal sNewTitle As String) mbFileTitle() = StrConv(sNewTitle, vbFromUnicode) End Property Option Explicit Private Type TypeIcon cbSize As Long picType As PictureTypeConstants hIcon As Long End Type Private Type CLSID id((123)) As Byte End Type Private Const MAX_PATH = 260 Private Type SHFILEINFO hIcon As Long iIcon As Long dwAttributes As Long szDisplayName As String * MAX_PATH

szTypeName As String * 80 End Type Private Declare Function OleCreatePictureIndirect Lib "oleaut32.dll" (pDicDesc As TypeIcon, riid As CLSID, ByVal fown As Long, lpUnk As Object) As Long Private Declare Function SHGetFileInfo Lib "shell32.dll" Alias "SHGetFileInfoA" (ByVal pszPath As String, ByVal dwFileAttributes As Long, psfi As SHFILEINFO, ByVal cbFileInfo As Long, ByVal uFlags As Long) As Long Private Const SHGFI_ICON = &H100 Private Const SHGFI_LARGEICON = &H0 Private Const SHGFI_SMALLICON = &H1 Public Function SetIcon(ByVal aFileName As String) As IPictureDisp Dim fName As String Dim Index As Integer Dim hIcon As Long Dim item_num As Long Dim icon_pic As IPictureDisp Dim sh_info As SHFILEINFO Dim cls_id As CLSID Dim hRes As Long Dim new_icon As TypeIcon Dim lpUnk As IUnknown fName = Trim(aFileName) If fName = "" Then Exit Function End If SHGetFileInfo fName, 0, sh_info, Len(sh_info), SHGFI_ICON + SHGFI_SMALLICON 'SHGFI_LARGEICON hIcon = sh_info.hIcon With new_icon .cbSize = Len(new_icon) .picType = vbPicTypeIcon .hIcon = hIcon End With With cls_id .id(8) = &HC0 .id(15) = &H46 End With hRes = OleCreatePictureIndirect(new_icon, cls_id, 1, lpUnk) If hRes = 0 Then Set icon_pic = lpUnk Set SetIcon = icon_pic End Function

3.3 CLASS MODUL Untuk Histogram
Option Explicit Private Type Bitmap bmType As Long bmWidth As Long

bmHeight As Long bmWidthBytes As Long bmPlanes As Integer bmBitsPixel As Integer bmBits As Long End Type

Private Declare Function GetObject Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, ByRef lpObject As Any) As Long

Private Type RGBQUAD rgbBlue As Byte rgbGreen As Byte rgbRed As Byte rgbAlpha As Byte End Type Private Type BITMAPINFOHEADER bmSize As Long bmWidth As Long bmHeight As Long bmPlanes As Integer bmBitCount As Integer bmCompression As Long bmSizeImage As Long bmXPelsPerMeter As Long bmYPelsPerMeter As Long bmClrUsed As Long bmClrImportant As Long End Type

Private Type BITMAPINFO bmHeader As BITMAPINFOHEADER bmColors(0 To 255) As RGBQUAD End Type

Private Declare Function SetStretchBltMode Lib "gdi32" (ByVal HDC As Long, ByVal nStretchMode As Long) As Long

Private Declare Function GetDIBits Lib "gdi32" (ByVal HDC As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Any, lpBI As BITMAPINFO, ByVal wUsage As Long) As Long Private Declare Function StretchDIBits Lib "gdi32" (ByVal HDC As Long, ByVal x As Long, ByVal y As Long, ByVal dX As Long, ByVal dy As Long, ByVal SrcX As Long, ByVal SrcY As Long, ByVal SrcWidth As Long, ByVal SrcHeight As Long, lpBits As Any, lpBitsInfo As BITMAPINFO, ByVal wUsage As Long, ByVal dwRop As Long) As Long

Public Function GetImageWidth(SrcPictureBox As PictureBox) As Long Dim bm As Bitmap GetObject SrcPictureBox.Image, Len(bm), bm GetImageWidth = bm.bmWidth End Function

Public Function GetImageHeight(SrcPictureBox As PictureBox) As Long Dim bm As Bitmap GetObject SrcPictureBox.Image, Len(bm), bm GetImageHeight = bm.bmHeight End Function

Public Function GetImageStreamLength(SrcPictureBox As PictureBox) As Long Dim bm As Bitmap GetObject SrcPictureBox.Image, Len(bm), bm GetImageStreamLength = (bm.bmWidth * (bm.bmHeight + 1)) * 3 End Function

Public Sub GetImageData2D(SrcPictureBox As PictureBox, ImageData() As Byte, Optional ByVal CorrectOrientation As Boolean = False) Dim bm As Bitmap GetObject SrcPictureBox.Image, Len(bm), bm Erase ImageData() Dim ArrayWidth As Long ArrayWidth = (bm.bmWidth * 3) - 1 ArrayWidth = ArrayWidth + (bm.bmWidth Mod 4) ReDim ImageData(0 To ArrayWidth, 0 To bm.bmHeight) As Byte ReDim tmpData(0 To ArrayWidth, 0 To bm.bmHeight) As Byte

Dim bmi As BITMAPINFO bmi.bmHeader.bmWidth = bm.bmWidth bmi.bmHeader.bmHeight = bm.bmHeight bmi.bmHeader.bmSize = 40 bmi.bmHeader.bmPlanes = 1 bmi.bmHeader.bmBitCount = 24 bmi.bmHeader.bmCompression = 0

If CorrectOrientation = False Then GetDIBits SrcPictureBox.HDC, SrcPictureBox.Image, 0, bm.bmHeight, ImageData(0, 0), bmi, 0 Else GetDIBits SrcPictureBox.HDC, SrcPictureBox.Image, 0, bm.bmHeight, tmpData(0, 0), bmi, 0 End If If CorrectOrientation = True Then

Dim x As Long, y As Long, z As Long Dim QuickVal As Long For x = 0 To bm.bmWidth - 1 QuickVal = x * 3 For y = 0 To bm.bmHeight - 1 For z = 0 To 2 ImageData(QuickVal + z, y) = tmpData(QuickVal + z, bm.bmHeight - y) Next z Next y Next x End If

Erase tmpData End Sub

Public Sub SetImageData2D(DstPictureBox As PictureBox, OriginalWidth As Long, OriginalHeight As Long, ImageData() As Byte, Optional ByVal CorrectOrientation As Boolean = False) Dim bm As Bitmap GetObject DstPictureBox.Image, Len(bm), bm Dim bmi As BITMAPINFO bmi.bmHeader.bmWidth = OriginalWidth If CorrectOrientation = False Then bmi.bmHeader.bmHeight = OriginalHeight Else bmi.bmHeader.bmHeight = -OriginalHeight End If bmi.bmHeader.bmSize = 40 bmi.bmHeader.bmPlanes = 1 bmi.bmHeader.bmBitCount = 24 bmi.bmHeader.bmCompression = 0 SetStretchBltMode DstPictureBox.HDC, 3& StretchDIBits DstPictureBox.HDC, 0, 0, bm.bmWidth, bm.bmHeight, 0, 0, OriginalWidth, OriginalHeight, ImageData(0, 0), bmi, 0, vbSrcCopy If DstPictureBox.AutoRedraw = True Then DstPictureBox.Picture = DstPictureBox.Image DstPictureBox.Refresh End If DoEvents End Sub

Public Sub GetImageData(SrcPictureBox As PictureBox, ImageData() As Byte) Dim bm As Bitmap GetObject SrcPictureBox.Image, Len(bm), bm Erase ImageData() ReDim ImageData(0 To 2, 0 To bm.bmWidth - 1, 0 To bm.bmHeight - 1) Dim bmi As BITMAPINFO bmi.bmHeader.bmWidth = bm.bmWidth bmi.bmHeader.bmHeight = bm.bmHeight bmi.bmHeader.bmSize = 40 bmi.bmHeader.bmPlanes = 1 bmi.bmHeader.bmBitCount = 24 bmi.bmHeader.bmCompression = 0 GetDIBits SrcPictureBox.HDC, SrcPictureBox.Image, 0, bm.bmHeight, ImageData(0, 0, 0), bmi, 0 End Sub

Public Sub SetImageData(DstPictureBox As PictureBox, OriginalWidth As Long, OriginalHeight As Long, ImageData() As Byte) Dim bm As Bitmap GetObject DstPictureBox.Image, Len(bm), bm Dim bmi As BITMAPINFO bmi.bmHeader.bmWidth = OriginalWidth bmi.bmHeader.bmHeight = OriginalHeight bmi.bmHeader.bmSize = 40 bmi.bmHeader.bmPlanes = 1 bmi.bmHeader.bmBitCount = 24 bmi.bmHeader.bmCompression = 0 SetStretchBltMode DstPictureBox.HDC, 3& StretchDIBits DstPictureBox.HDC, 0, 0, bm.bmWidth, bm.bmHeight, 0, 0, OriginalWidth, OriginalHeight, ImageData(0, 0, 0), bmi, 0, vbSrcCopy If DstPictureBox.AutoRedraw = True Then DstPictureBox.Picture = DstPictureBox.Image DstPictureBox.Refresh End If DoEvents End Sub

Public Sub GetImageDataStream(SrcPictureBox As PictureBox, ImageData() As Byte) Dim bm As Bitmap

GetObject SrcPictureBox.Image, Len(bm), bm Erase ImageData() ReDim ImageData(0 To GetImageStreamLength(SrcPictureBox)) Dim bmi As BITMAPINFO bmi.bmHeader.bmWidth = bm.bmWidth bmi.bmHeader.bmHeight = bm.bmHeight bmi.bmHeader.bmSize = 40 bmi.bmHeader.bmPlanes = 1 bmi.bmHeader.bmBitCount = 24 bmi.bmHeader.bmCompression = 0 GetDIBits SrcPictureBox.HDC, SrcPictureBox.Image, 0, bm.bmHeight, ImageData(0), bmi, 0 End Sub

Public Sub SetImageDataStream(DstPictureBox As PictureBox, OriginalWidth As Long, OriginalHeight As Long, ImageData() As Byte) Dim bm As Bitmap GetObject DstPictureBox.Image, Len(bm), bm Dim bmi As BITMAPINFO bmi.bmHeader.bmWidth = OriginalWidth bmi.bmHeader.bmHeight = OriginalHeight bmi.bmHeader.bmSize = 40 bmi.bmHeader.bmPlanes = 1 bmi.bmHeader.bmBitCount = 24 bmi.bmHeader.bmCompression = 0 StretchDIBits DstPictureBox.HDC, 0, 0, bm.bmWidth, bm.bmHeight, 0, 0, OriginalWidth, OriginalHeight, ImageData(0), bmi, 0, vbSrcCopy If DstPictureBox.AutoRedraw = True Then DstPictureBox.Picture = DstPictureBox.Image DstPictureBox.Refresh End If DoEvents End Sub

Related Interests