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 T ermodifikasi
Data output (ciphertext) Data input (plaintext)
Proses enkripsi twofish
Audio modified (sudah disisipi pesan) Proses decoding echo hiding
Hiden data (ciphertext)
Proses dekripsi twofish Data output (plaintext)
Proses ekstraksi
Gambar 3.1 Proses Watermarking 3.1.1 Proses Insert 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) begin 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
56 for(k=i,index=0k<(i+j) and k
Gambar 3.3 M odul 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
Kernel “1”
Hitung panjang sinyal yang
Kernel “0”
Mixer sinyal “0”
(nilai delay mewakili bit “0” dan “1”)
Mixer sinyal “1”
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 M ixer Kernel function insertWatermarking(audiosamples,message) begin /* * konstanta delay dan amplitude */ delay = ECHO_HIDING_DELAY amplitude = ECHO_HIDING_AMPLITUDE /* * bit audio dalam a rray */ newSample[j] = audioSamples[j] endif endloop else for ( j=window_begin j<=window_end j++) begin if (j‐o ffset1 >=0) begin newSample[j]= (float) (audioSamples[j] + (initAmpl * audioSamples[j‐ offset1]))
59 else newSample[j] = audioSamples[j] endif endloop endif 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) begin windows_number = maxcaps * 8 else windows_number = message.length * 8 endif /* * proses penyisipan message ke dalam bit‐bit audio */ windows_limit = 4096 byteIdx =0 bitDiambil = 0 window_begin = 0 window_end = 0 for ( i=0 i<windows_number i++) begin window_begin = 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) begin for ( j=window_begin j<=window_end j++) begin if (j‐offset0 >= 0) begin newSample[j]= (float) (audioSamples[j] + (initAmpl * audioSamples[j‐offset0] )) else if (bitDiambil >=8) begin byteIdx++ bitDiambil = 0 endif endloop /* * mixer sinyal keseluruhan */ for ( k=window_end+1 k
Gambar 3.6 M odul 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
Gambar 3.7 Proses Pengekstrakan
Data
62 function extractWatermark(audioSamples) begin /* * 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++) begin window_begin = 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++) begin com[j] = new Complex(audioSamples[window_begin],0) window_begin = window_begin + 1 endif /* * penghitungan panjang sinyal yang di s isipi */ com_a = FFT.ifft(com_a) com_a = FFT.fft(com)
63 for ( z=0 z com_a[offset1].real()) begin byteExtract = byteExtract | (0 << bitRem) bitRem = bitRem + 1 else byteExtract = byteExtract | (1 << bitRem) bitRem = bitRem + 1 endif if (bitRem >=8) begin message[byteIdx] = (byte) byteExtract byteIdx = byteIdx + 1 bitRem = 0 byteExtract = 0 endif endloop return message end
Gambar 3.8 M odul 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) begin 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
Gambar 3.10 M odul 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:
SNR = 10 log10
N −1 ⎧ ⎫ x 2 (n ) ⎪ ⎪ ∑ ⎪ ⎪ 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.