53 Bab 3 Prosedur dan Metodologi Bab tiga ini menjelaskan berbagai prosedur dan metodologi pada proses insert dan ekstraksi watermark. 3.1 Prosedur Watermark Proses watermarking dibagi dua cara, pertama proses insert yang merupakan sistem untuk mengolah data awal (plaintext) menjadi sebuah data acak (chiphertext) yang tidak dapat diterjemahkan secara langsung dan kemudian disembunyikan kedalam file audio, sedangkan proses kedua adalah decoding yang merupakan sistem untuk mengeluarkan data acak (ciphertext) yang terdapat di file audio kemudian mengolahnya menjadi data awal (plaintext). Berikut skema dari proses encoding dan proses dari ekstraksi :
54 Proses Penyisipan File audio original Proses encoding echo hiding File Audio Termodifikasi Data output (ciphertext) Data input (plaintext) Proses enkripsi twofish Audio modified (sudah disisipi pesan) Proses decoding echo hiding Hiden data (ciphertext) Proses ekstraksi 3.1.1 Proses Insert Data output (plaintext) Gambar 3.1 Proses Watermarking Proses dekripsi twofish 3.1.1.1 Enkripsi Proses enkripsi Twofish memiliki beberapa proses kecil di dalamnya. Kunci PlainText X enkripsi Twofish ChiperText X Gambar 3.2 Proses Enkripsi Twofish
55 Plaintext X, merupakan file yang akan dienkripsi. Enkripsi plaintext X, menggunakan enkripsi Twofish dan memasukkan kunci. Chipertext X, merupakan hasil enkripsi dari plaintext X. function EncryptMessage(mi, key) twofishalgorithm = new TwoFish() m = new Message() dataplain2 = m.getstream() * convert key menjadi hexadecimal b = Hexadecimal.fromEvenLengthString(key) makekey = null try{ makekey = twofishalgorithm.makekey(b, 16) } catch (InvalidKeyException e) { e.printstacktrace() } plainbytes = new byte[16] cipherbytes = new byte[16] chipper2 = new byte[dataplain2.length] i=0 j=16 index = 0 k=0 while(i<dataplain2.length) * proses enkripsi
56 for(k=i,index=0k<(i+j) and k<dataplain2.length k++,index++) plainbytes[index] = (byte)dataplain2[k] twofishalgorithm.encrypt(plainbytes, 0, cipherbytes, 0, makekey, 16) for(k=i,index=0k<(i+j) and k<dataplain2.length k++,index++) chipper2[k] = (byte)cipherbytes[index] i= i + j m.setstream(chipper2) return m end Gambar 3.3 Modul Enkripsi Twofish 3.1.1.2 Encoding Proses penyisipan memiliki beberapa proses kecil di dalamnya. Alur dari proses ini dapat dilihat dari gambar 3.7. Pada gambar tersebut dapat dilihat bahwa sebelum data disisipkan, panjang sinyal yang diproses harus dihitung terlebih dahulu. Hasil dari perhitungan tersebut lalu digunakan untuk membagi sinyal menjadi beberapa bagian dengan menggunakan kernel 0 dan 1. Sinyal yang dihasilkan dari kedua kernel ini adalah dua buah sinyal yang telah disisipi echo dengan delay yang berbeda.
57 data Sinyal audio (nilai delay mewakili bit 0 dan 1 ) Hitung panjang sinyal yang Kernel 1 Mixer sinyal 1 Kernel 0 Mixer sinyal 0 Gabung sinyal Key (nilai delay mewakili bit 0 Gambar 3.4 Proses Penyisipan Kedua sinyal ini selanjutnya masing-masing akan diproses menggunakan mixer sinyal 0 dan 1 untuk mendapatkan sinya yang sesuai dengan data yang disisipkan. Kedua sinyal yang telah di-mixer kemudian digabungkan dengan operasi penjumlahan kembali menjadi sinyal untuh.
58 Gambar 3.5 Proses Mixer Kernel function insertwatermarking(audiosamples,message) * konstanta delay dan amplitude delay = ECHO_HIDING_DELAY amplitude = ECHO_HIDING_AMPLITUDE * bit audio dalam array newsample[j] = audiosamples[j] else for ( j=window_ j<=window_end j++) if (j o ffset1 >=0) newsample[j]= (float) (audiosamples[j] + (initampl * audiosamples[joffset1]))
59 else newsample[j] = audiosamples[j] float bitaudio : array(audiosamples.length) * kernel 0 dan kernel 1 offset0 = (44100 * (delay/1000)) offset1 = (offset0 * 2) maxcaps = getmaxcapasity() windows_number = 0 if (message.length > maxcaps) windows_number = maxcaps * 8 else windows_number = message.length * 8 * proses penyisipan message ke dalam bit bit audio windows_limit = 4096 byteidx =0 bitdiambil = 0 window_ = 0 window_end = 0 for ( i=0 i<windows_number i++) window_ = i * windows_limit + HEADER_LENGTH window_end = ((i+1) * windows_limit) + HEAD ER_LENGTH 1 curbyte = message[byteidx] & 1 message[byteidx] = message[byteidx] >> 1 bitdiambil++
60 * pembagian sinyal menggunakan kernel 0 dan kernel 1 if ( curbyte == 0) for ( j=window_ j<=window_end j++) if (j offset0 >= 0) newsample[j]= (float) (audiosamples[j] + (initampl * audiosamples[j offset0] )) else if (bitdiambil >=8) byteidx++ bitdiambil = 0 * mixer sinyal keseluruhan for ( k=window_end+1 k<audiosamples.length k++) newsample[k] = audiosamples[k] return newsample end Gambar 3.6 Modul Insert Watermark 3.1.2 Proses Ekstrak 3.1.2.1 Decoding Input dari proses pengekstrakan adalah sinyal audio yang telah berisi data serta inputan key. Key yang dimaksud adalah nilai delay yang digunakan pada proses penyisipan. Setelah sinyal tersebut di-inputkan berserta key-nya, maka proses
61 perhitungan panjang sinyal yang diproses akan dimulai untuk dijadikan acuan dalam melakukan proses pengekstrakan data. Setelah panjang sinyal didapatkan, maka proses pencarian data dilakukan dengan membadingkan dua buah nilai yang merupakan hasil dari perhitungan autocorrelation terhadap cepstrum di tiap-tiap bagian sinyal. Data yang berhasil diekstrak kemudian dihitung probabilitasnya dan disusun hingga memiliki panjang yang sama dengan panjang data yang disisipkan sebelumnya. Data hasil ekstraksi berupa bilangan biner. Berikut proses pengekstraksi : Hitung panjang sinyal yang dirposes Key Bagi sinyal ke beberapa kernel Cari autocorrel ation dari cepstrum tiap kernel Penyusunan data Data Gambar 3.7 Proses Pengekstrakan
62 function extractwatermark(audiosamples) * konstanta delay dan amplitude delay = ECHO_HIDING_DELAY amplitude = ECHO_HIDING_AMPLITUDE // message size msgsize = properties.get("msgsize")) * kernel 0 dan kernel 1 offset0 = (44100 * (delay/1000)) offset1 = (offset0 * 2) message = array(msgsize) windows_number = msgsize * 8 windows_limit = ECHO_NUM byteidx =0 byteextract = 0 bitrem=0 for ( i=0 i<windows_number i++) window_ = i * windows_limit + HEADER_LENGTH window_end = ((i+1) * windows_limit) + HEAD ER_LENGTH 1 com = new Complex(windows_limit) for ( j=0 j<windows_limit j++) com[j] = new Complex(audioSamples[window_],0) window_ = window_ + 1 * penghitungan panjang sinyal yang di sisipi com_a = FFT.ifft(com_a) com_a = FFT.fft(com)
63 } for ( z=0 z<com_a.length z++){ com_a[z] = com_a[z].times(com_a[z]) com_a[z] = com_a[z].log() end * penghitungan autocorellation if (com_a[offset0].real() > com_a[offset1].real()) byteextract = byteextract (0 << bitrem) bitrem = bitrem + 1 else byteextract = byteextract (1 << bitrem) bitrem = bitrem + 1 if (bitrem >=8) message[byteidx] = (byte) byteextract byteidx = byteidx + 1 bitrem = 0 byteextract = 0 return message Gambar 3.8 Modul Ekstrak Watermark
64 3.1.2.2 Dekripsi Kunci ChiperText X Dekripsi Twofish PlainText X Gambar 3.9 Proses Dekripsi Twofish Proses dekripsi Twofish merupakan proses kebalikan dari enkripsi. Proses ini dapat dilihat dari gambar 3.4. Chipertext X, merupakan hasil enkripsi Twofish yang akan didekripsi Dekripsi Twofish, menggunakan dekripsi Twofish dengan menggunakan kunci. Plaintext X, merupakan hasil dekripsi dari chipertext X. function DecryptMessage(mi, key) twofishalgorithm = new TwoFish() m = new Message() datachipper = mi.getstream() * convert key menjadi hexadecimal b = Hexadecimal.fromEvenLengthString(key) makekey = null try{ makekey = twofishalgorithm.makekey(b, 16) } catch (InvalidKeyException e) { e.printstacktrace() } plainbytes = new byte[16] cipherbytes = new byte[16] plain2 = new byte[datachipper.length]
65 i=0 j=16 index = 0 k=0 while(i<datachipper.length) * proses dekripsi for(k=i,index=0k<(i+j) && k<datachipper.length k++,index++) cipherbytes[index] = (byte)datachipper[k] twofishalgorithm.decrypt(cipherbytes, 0, plainbytes, 0, makekey, 16) for(k=i,index=0k<(i+j) && k<datachipper.length k++,index++) plain2[k] = (byte)plainbytes[index] i= i + j m.setstream(plain2) end return m Gambar 3.10 Modul Dekripsi Twofish 3.2 Prosedur Pengujian 3.2.1 Kualitas Audio 3.2.1.1 SNR Dasar yang paling penting pada audio steganography adalah penyisipan data tidak boleh mengubah kualitas suara dari sinyal audio yang digunakan sebagai cover.
66 Jadi data rahasia yang disisipkan tidak boleh terdeteksi oleh pendengar. Performa ini sangat penting pada aplikasi proteksi hak cipta.parameter yang digunakan dalam menentukan kualitas audio yang telah disisipkan data adalah SNR (signal to noise ratio) [3]. Persamaan untuk menghitung SNR adalah sebagai berikut: N 1 2 x ( n) SNR = 10 log 10 n= 0 N 1 2 ~ () x n x() n= 0 Keterangan: x(n) adalah sinyal audio cover dari panjang sampel N dan ()nx~ adalah sinyal data yang disisipkan. 3.2.2 Robustness Robustness merupakan salah satu isu desain algoritma steganografi yang utama. Data rahasia yang disisipkan harus tahan terhadap pengolahan sinyal yang mungkin dilakukan termasuk konversi dijital-analog dan analog-dijital, linear dan non-linear filtering, resampling dan cropping.