• Tidak ada hasil yang ditemukan

Implementasi Digital Watermarking Pada File Audio Dengan Menggunakan Metode Phase Coding

N/A
N/A
Protected

Academic year: 2016

Membagikan "Implementasi Digital Watermarking Pada File Audio Dengan Menggunakan Metode Phase Coding"

Copied!
82
0
0

Teks penuh

(1)

IMPLEMENTASI DIGITAL WATERMARKING PADA FILE AUDIO

DENGAN MENGGUNAKAN

METODE PHASE CODING

SKRIPSI

FITRIYANI

041401066

PROGRAM STUDI S1 ILMU KOMPUTER

DEPARTEMEN ILMU KOMPUTER

FAKULTAS MATEMATIKA DAN ILMU PENGETAHUAN ALAM

UNIVERSITAS SUMATERA UTARA

(2)

IMPLEMENTASI DIGITAL WATERMARKING PADA FILE AUDIO DENGAN MENGGUNAKAN

METODE PHASE CODING

SKRIPSI

Diajukan untuk melengkapi tugas dan memenuhi syarat mencapai gelar Sarjana Komputer

FITRIYANI 041401066

PROGRAM STUDI S1 ILMU KOMPUTER DEPARTEMEN ILMU KOMPUTER

FAKULTAS MATEMATIKA DAN ILMU PENGETAHUAN ALAM UNIVERSITAS SUMATERA UTARA

(3)

PERSETUJUAN

Judul : IMPLEMENTASI DIGITAL WATERMARKING

PADA FILE AUDIO DENGAN MENGGUNAKAN METODE PHASE CODING

Kategori : SKRIPSI

Nama : FITRIYANI

Nomor Induk Mahasiswa : 041401066

Program Studi : SARJANA (S1) ILMU KOMPUTER Departemen : ILMU KOMPUTER

Fakultas : MATEMATIKA DAN ILMU PENGETAHUAN ALAM (FMIPA) UNIVERSITAS SUMATERA UTARA

Diluluskan di

Medan, 12 Januari 2010 Komisi Pembimbing :

Pembimbing 2 Pembimbing 1

Maya Silvi Lydia, B.Sc, MSc Prof. Dr. Muhammad Zarlis NIP. 1974012720021222001 NIP. 195707011986011003

Diketahui/Disetujui oleh

Program Studi S1 Ilmu Komputer Ketua,

(4)

PERNYATAAN

IMPLEMENTASI DIGITAL WATERMARKING PADA FILE AUDIO DENGAN MENGGUNAKAN

METODE PHASE CODING

SKRIPSI

Saya mengakui bahwa skripsi ini adalah hasil karya saya sendiri, kecuali beberapa kutipan dan ringkasan yang masing-masing disebutkan sumbernya.

Medan, Januari 2010

(5)

PENGHARGAAN

Puji dan syukur penulis panjatkan kepada Allah SWT, dengan limpahan karunia-Nya skripsi ini berhasil diselesaikan dalam waktu yang telah ditetapkan.

(6)

ABSTRAK

Watermarking merupakan salah satu bagian dari teknik pengamanan data yang

saat ini mulai dikembangkan. Teknik ini adalah teknik penyembunyian data kedalam data lain sebagai host file dengan memanfaatkan kelemahan pada indera manusia, seperti mata pada pengolahan citra dan telinga pada pengolahan audio. Penelitian ini bertujuan untuk menghasilkan file audio MP3 dengan watermark (berkas teks) yang dapat digunakan untuk perlindungan hak cipta yang handal dan tahan terhadap pengolahan sinyal digital. Teknik Watermarking yang digunakan dalam penelitian ini adalah teknik perekayasaan fase sinyal pada audio yang dikenal dengan Phase Coding. Pada penelitian ini aplikasi dibuat dengan Visual Borland Delphi 7. Perlindungan hak cipta audio dengan Watermarking-Phase Coding menghasilkan audio yang tahan terhadap pengolahan sinyal

(7)

IMPLEMENTATION OF DIGITAL WATERMARKING IN AUDIO DIGITAL USING PHASE CODING METHOD

ABSTRACT

(8)
(9)

BAB 5 PENUTUP 42

5.1 Kesimpulan 42

5.2 Saran 42

DAFTAR PUSTAKA 44

(10)

DAFTAR TABEL

Halaman

Tabel 2.1 Tabel Nilai Bit Rate pada MPEG 9

Tabel 2.2 Tabel Nilai Sampling MPEG 10

Tabel 4.1 Berkas Audio yang di uji 37

Tabel 4.2 Berkas Teks yang di uji 37

Tabel 4.3 Hasil Pengujian Aplikasi 37

Tabel 4.4 Berkas Watermark tanpa Pengolahan Sinyal 38 Tabel 4.5 Hasil Pengujian Watermark terhadap Indera Manusia 38 Tabel 4.6 Analisis Audio dengan Perubahan Format *.wav Menggunakan

(11)

DAFTAR GAMBAR

Halaman

Gambar 2.1 Sampling sinyal kontinu 7

Gambar 2.2 Perancangan sistem Watermarking 12 Gambar 2.3 Sinyal Asli dan Sinyal yang dibagi beberapa Segmen 16

Gambar 3.1 Alur Proses Aplikasi 18

Gambar 3.2 Flowchart Proses Sistem Penggunaan Aplikasi

Untuk enkode 19

Gambar 3.3 Flowchart Proses Perhitungan Frame Audio 20 Gambar 3.4 Flowchart Proses Enkode Phase Coding 22 Gambar 3.5 Flowchart Proses Sistem Penggunaan Aplikasi untuk Dekode 23 Gambar 3.6 Flowchart Proses Dekode Phase Coding 25

Gambar 3.7 Tampilan Utama Aplikas 26

Gambar 3.8 Tampilan Form About 27

Gambar 3.9 Tampilan Proses Tombol ’Pilih Mp3’ 29 Gambar 3.10 Tampilan Proses Tombol ’ Mp3 info’ 30 Gambar 3.11 Tampilan Proses Tombol ’Ukuran Max Sisip’ 30 Gambar 3.12 Tampilan Proses Tombol ’Pilih Sisip File’ 31 Gambar 3.13 Tampilan Proses Tombol ’Encode’ 32 Gambar 3.14 Tampilan Proses Tombol ’Decode’ 33 Gambar 4.1 Sinyal Asli,dan Sinyal yang dibagi kedalam beberapa Segmen 35 Gambar 4.2 Perbedaan Sampel pada File Asli dengan File

Watermark dengan Wavesound Editor 40

(12)

ABSTRAK

Watermarking merupakan salah satu bagian dari teknik pengamanan data yang

saat ini mulai dikembangkan. Teknik ini adalah teknik penyembunyian data kedalam data lain sebagai host file dengan memanfaatkan kelemahan pada indera manusia, seperti mata pada pengolahan citra dan telinga pada pengolahan audio. Penelitian ini bertujuan untuk menghasilkan file audio MP3 dengan watermark (berkas teks) yang dapat digunakan untuk perlindungan hak cipta yang handal dan tahan terhadap pengolahan sinyal digital. Teknik Watermarking yang digunakan dalam penelitian ini adalah teknik perekayasaan fase sinyal pada audio yang dikenal dengan Phase Coding. Pada penelitian ini aplikasi dibuat dengan Visual Borland Delphi 7. Perlindungan hak cipta audio dengan Watermarking-Phase Coding menghasilkan audio yang tahan terhadap pengolahan sinyal

(13)

IMPLEMENTATION OF DIGITAL WATERMARKING IN AUDIO DIGITAL USING PHASE CODING METHOD

ABSTRACT

(14)

Bab 1

PENDAHULUAN

1.1.Latar Belakang

Perkembangan teknologi komputer saat ini telah membuat komputer memegang peranan yang penting dalam pergerakan hampir seluruh aspek kehidupan, baik itu untuk kebutuhan pribadi, pendidikan, perdagangan, fasilitas umum, hiburan, kesehatan dan lain sebagainya. Hal ini di karenakan penggunaan komputer lebih cepat, murah, dan praktis dalam pengolahan data dari pada pengolahan secara manual. Oleh karena itu pada saat ini, penggunaan data digital seperti teks, citra, audio dan video merupakan hal yang sangat lazim bahkan mungkin menjadi hal yang mutlak pada aspek – aspek tertentu. Kelebihan – kelebihannya yang mudah untuk diolah, diubah, mudah digandakan, dan didistribusikan menjadikan pengolahan data digital dianggap lebih efektif daripada pengolahan data secara manual walaupun dilapangan pengolahan data secara manual masih tetap digunakan sebagai dokumentasi.

Seiring dengan semakin banyaknya pemakaian data digital terutama audio seperti ring backtone, ringtone dan lain-lain, yang perkembangannya semakin meningkat maka

(15)

Watermarking dapat diartikan sebagai suatu teknik penyembunyian data atau

informasi yang diperlukan pemilik data ke dalam suatu data digital (dalam hal ini digunakan data audio) untuk ditumpangi.

Watermarking dapat digunakan dalam berbagai tujuan seperti otentikasi

(mengidentifikasikan data digital yang telah mengalami perubahan dari aslinya), Identifikasi Lokasi (mengidentifikasikan isi dari data digital pada lokasi – lokasi tertentu), Anotasi (hanya digunakan untuk keterangan tentang data digital itu sendiri), dan Perlindungan hak cipta (menyembunyikan label hak cipta pada data digital sebagai bukti otentik kepemilikan karya digital tersebut).

1.2 Rumusan Masalah

1. Bagaimana menghasilkan audio yang terlindungi dari aktifitas penggandaan yang ilegal dan dapat dipantau pendistribusiannya dengan menggunakan Watermarking-Phase Coding.

2. Apakah Watermarking-Phase Coding cukup handal setelah dilakukan pengolahan sinyal terhadap berkas ter-watermak tanpa memiliki beda fase yang besar.

1.3 Batasan Masalah

Batasan masalah dalam dalam penulisan ini adalah:

1. Berkas terlebih dahulu akan di watermarking dengan menggunakan metode Phase Coding, berkas yang digunakan adalah berkas audio MPEG-1 Layer 3 dengan format

*.mp3 yang akan disisipi oleh berkas teks (*.txt).

2. Berkas asli dan berkas ter-watermark akan dilakukan pengolahan sinyal seperti Resampling, penambahan derau, dan perubahan format dan akan dilihat jumlah bit

(16)

3. Bahasa pemrograman yang dipakai adalah Visual Borland Delphi 7.0.

1.4 Tujuan Penelitian

Menghasilkan berkas audio ter-watermark yang dapat digunakan untuk perlindungan hak cipta yang handal dan memiliki ketahanan yang baik terhadap berbagai proses pengolahan sinyal audio atau tidak mengalami perubahan bentuk setelah mengalami berbagai pengolahan sinyal tersebut dan memiliki beda fase yang kecil antara sinyal asli dan sinyal yang dimodifikasi.

1.5 Manfaat Penelitian

Manfaat penelitian yaitu dengan watermarking-Phase Coding, berkas audio yang mulai banyak beredar di masyarakat dapat dikendalikan pendistribusiannya dan diketahui kepemilikan berkas tersebut dan memiliki ketahanan yang baik terhadap berbagai proses pengolahan digital.

1.6 Metodologi Penelitian

Langkah – langkah metodologi yang digunakan adalah sebagai berikut:

1. Pengumpulan Data

Pengumpulan data yang dilakukan adalah dengan Studi Literatur, yaitu menggunakan berbagai macam literatur dan referensi internet yang berhubungan dengan watermarking, audio, mp3, steganografi, phase coding dan yang mendukung

penelitian ini.

(17)

Pada tahap ini dilakukan analisis terhadap berkas audio, kelemahan, dan keunggulannya serta permasalahan yang mungkin akan timbul jika audio di-watermarking dan solusi yang akan diambil sebagai pemecahan masalah

3. Perancangan Sistem

Pada tahap ini dirancang suatu sistem watermarking dengan menggunakan metode Phase Coding pada berkas audio .

4. Implementasi Sistem

Implementasi sistem ini dirancang kedalam sebuah bahasa pemrograman Visual Borland Delphi 7.0.

5. Pengujian Program

Untuk mengetahui sejauh mana tingkat keberhasilan program dan sejauh mana berkas ter-watermark yang dihasilkan handal terhadap pengolahan sinyal dengan memiliki beda fase yang kecil atau bahkan mendekati nol.

6. Penyusunan laporan dan penarikan kesimpulan

Menyusun laporan hasil analisis dan perancangan kedalam format tulisan akhir disertai penarikan kesimpulan

1.7 SISTEMATIKA PENULISAN

BAB 1 : PENDAHULUAN

Bab ini akan menjelaskan mengenai latar belakang pemilihan judul, rumusan masalah, batasan masalah, tujuan penelitian, manfaat penelitian, metode penelitian, dan sistematika penulisan.

BAB 2 : LANDASAN TEORI

Bab ini membahas mengenai teori-teori yang mendukung pembahasan mengenai audio, watermarking, phase coding dan Fast Fourier Transform.

(18)

Bab ini berisikan gambaran rancangan struktur program dan desain antarmuka, serta memberikan gambaran dari rancang bangun yang lengkap dan implementasinya dalam suatu program.

BAB 4 : ANALISIS MASALAH

Bab ini berisikan analisis permasalahan perlindungan audio dengan watermarking-phase coding dan ketahanan audio ter-watermark terhadap pengolahan sinyal yang dilakukan seperti resampling, penambahan derau, dan lain-lain.

BAB 5 : PENUTUP

(19)

Bab 2

LANDASAN TEORI

2.1 Audio

Suara atau bunyi adalah suatu gelombang longitudinal yang merambat melalui suatu medium, seperti zat cair, padat dan gas. Bunyi dapat terdengar oleh manusia apabila gelombang tersebut mencapai telinga manusia dengan frekuensi 20Hz – 20kHz , suara ini disebut dengan audiosonic atau dikenal dengan audio, gelombang suara pada batas frekuensi tersebut disebut dengan sinyal akustik. Akustik merupakan cabang fisika yang mempelajari bunyi. Level tekanan suara (volume suara) dihitung dalam desibel (dB), yaitu perhitungan rasio antara titik referensi yang dipilih dalam skala logaritmik dan level yang benar-benar dialami. Keras lemahnya bunyi atau tinggi rendahnya gelombang disebut dengan amplitudo. Bunyi mulai dapat merusak telinga jika tingkat volumenya lebih besar dari 85 dB dan pada ukuran 130 dB akan mampu membuat hancur gendang telinga.

Frekuensi adalah banyaknya gelombang yang mempunyai pola yang sama yang berulang pada interval tertentu selama 1 detik. Berdasarkan frekuensi, suara atau bunyi dibagi atas :

1. Infrasound yaitu suara pada rentang frekuensi 0Hz-20Hz. 2. Audiosound yaitu suara pada rentang frekuensi 20Hz-20kHz. 3. Ultrasound yaitu suara pada rentang frekuensi 20kHz-1GHz. 4. Hypersound yaitu suara pada rentang frekuensi 1GHz-10THz.

Menurut Yulid dan Fazmah (2006) , sinyal audio dibagi atas 3 bagian berdasarkan rentang frekuensinya :

(20)

2. Suara Wideband yaitu 50Hz-7000Hz. 3. Wideband audio yaitu 20Hz- 20000Hz.

2.1.1 Audio Digital

Gelombang suara analog tidak dapat langsung direpresentasikan pada komputer. Komputer mengukur amplitudo pada satuan waktu tertentu untuk menghasilkan sejumlah angka. Suara dikonversi menjadi arus listrik dengan menggunakan mikrofon. Kemudian mengkonversikan osilasi tekanan udara menjadi tegangan osilasi terus-menerus dalam sebuah rangkaian listrik. Perubahan tegangan cepat ini kemudian diubah menjadi serangkaian angka oleh digitizer. Sebuah digitizer bertindak seperti voltmeter digital yang sangat cepat Hal ini menjadikan ribuan pengukuran per detik. Setiap hasil pengukuran dalam jumlah yang dapat disimpan secara digital (hanya jumlah terbatas angka signifikan dari jumlah yang dicatat) disebut dengan sampel dan seluruh konversi suara ke serangkaian angka ini disebut sampling.

Gambar 2.1 Sampling sinyal kontinu.

Keterangan Gambar :Garis biru berubah sesuai dengan tegangan (misalnya, dari mikrofon), segmen merah sesuai dengan sampel.

(21)

berarti menyediakan 256 unit untuk menggambarkan rentang amplitudo dari potongan suara yang di tangkap.

Berdasarkan hal-hal yang tersebut diatas, banyak audio yang beredar dengan berbagai format yang memiliki karakteristik masing-masing, dan salah satunya adalah MPEG-1 Layer 3 atau dikenal MP3 yaitu berkas audio yang akan dibahas pada skripsi ini.

MP3 dikembangkan oleh seorang insinyur memakai pengkodean pengkodean berkas suara yang memiliki kompresi yang baik (meskipun bersifat lossy) sehingga ukuran berkas bisa memungkinkan menjadi lebih kecil, MP3 mengurangi jumlah bit yang diperlukan dengan menggunakan model psychoacoustic untuk menghilangkan komponen-komponen suara yang tidak terdengar oleh manusia.

MP3 yaitu berkas audio dengan karakteristik sebagai berikut : 1. Merupakan berkas dengan lossy compression.

2. Sering digunakan di internet karena ukurannya yang cukup kecil dibandingkan ukuran audio berkas yang tidak terkompresi.

3. Terdaftar pada badan standarisasi internasional pada tahun 1991, yaitu ISO / IEC 11172-3 dan ISO / IEC 13818-3.

4. Kompresi dilakukan dengan menghilangkan bagian-bagian bunyi yang kurang berguna bagi pendengaran manusia.

5. Kompresi mp3 dengan kualitas 128 bits 44000 Hz biasanya akan menghasilkan berkas berukuran 3-4 MB, tetapi unsur panjang pendeknya lagu juga akan berpengaruh.

(22)

Tabel 2.1 Nilai Bit Rate pada MPEG

Bit V1,L1 V1,L2 V1,L3 V2,L1

0000 Bebas Bebas Bebas Bebas

0001 32 32 32 32

0010 64 48 40 48

0011 96 56 48 56

0100 128 64 56 64

0101 160 80 64 80

0110 192 96 80 96

0111 224 112 96 112 1000 256 128 112 128 1001 288 160 128 144 1010 320 192 160 160 1011 352 224 192 176 1100 384 256 224 192 1101 416 320 256 224 1110 448 384 320 256 1111 Buruk Buruk Buruk Buruk Keterangan Tabel :

V1 : MPEG-1

V2 : MPEG-2 dan MPEG-2.5 L1 : Layer 1

L2 : Layer 2 L3 : Layer 3

Bit Rate juga terbagi atas beberapa kategori yaitu: Variable bit rate (VBR) digunakan

(23)

7. Nilai Sampling MPEG-1 Layer 3 (MP3) adalah 32Kbps, 44.1 Kbps dan 48Kbps.

Table 2.2 Nilai Sampling MPEG

Bits MPEG1 MPEG2 MPEG2.5 00 44100 22050 11025 01 48000 24000 12000 10 32000 16000 8000 11 reserv. reserv. reserv.

2.2 Digital Watermarking

Watermarking adalah suatu teknik dalam membantu pengamanan berkas-berkas digital

dengan memberikan suatu tanda tertentu pada berkas tersebut untuk menunjukkan akan kepemilikkan dari berkas tersebut. Watermarking merupakan suatu bentuk steganografi yaitu ilmu yang mempelajari bagaimana menyembunyikan suatu data pada data yang lain.

Menurut Thanuja dan Nagaraj (2008), Digital watermarking adalah teknik penambahan sinyal kedalam sinyal digital pada dokumen digital, seperti teks, citra, audio maupun video. Apabila penambahannya pada sinyal audio maka disebut dengan Audio Watermarking.

Watermarking sudah ada sejak 700 tahun yang lalu. Pada akhir abad 13, pabrik

kertas di Fabriano, Italia, membuat kertas yang diberi watermark atau tanda-air dengan cara menekan bentuk cetakan gambar atau tulisan pada kertas yang baru setengah jadi. Ketika kertas dikeringkan terbentuklah suatu kertas yang ber-watermark. Kertas ini biasanya digunakan oleh seniman atau sastrawan untuk menulis karya mereka. Kertas yang sudah dibubuhi tanda-air tersebut sekaligus dijadikan identifikasi bahwa karya seni diatasnya adalah milik mereka.

(24)

pengamanan pada data yang semakin meluas penyebaran datanya dengan adanya tingkat penggunaan internet yang semakin tinggi.

Secara garis besar, berdasarkan penangkapan oleh indera manusia terhadap keberadaan watermark pada suatu berkas, watermarking terbagi atas :

1. Robust watermarking : Jenis watermark ini tahan terhadap serangan (attack), namun biasanya watermark yang dibubuhi ke dokumen masih dapat ditangkap oleh indera penglihatan atau pendengaran manusia.

2. Fragile watermarking : Jenis watermark ini akan mudah rusak jika terjadi serangan, namun kehadirannya tidak terdeteksi oleh indera manusia.

Suatu sistem watermarking yang ideal harus memenuhi karakteristik berikut ini yaitu :

1. Unobtrusiveness

Watermarking tidak dapat di deteksi secara langsung oleh indera manusia,

karekteristik ini digunakan hanya pada watermark yang bersifat rahasia. 2. Handal / Kuat (Robustness )

Watermarking yang disisipkan tidak berubah walau data mengalami perubahan yang

secara sengaja atau tidak sengaja, contoh kompresi, resampling, penambahan derau, dan lain-lain.

3. Universal.

Algoritma watermarking harus dapat digunakan untuk multimedia baik citra, audio, maupun video.

4. Tidak Ambigu.

Tidak menyebabkan pengidentifikasian media yang dilindungi menjadi membingungkan.

(25)

Pembangunan suatu sistem watermarking membutuhkan suatu kunci watermark untuk dapat membuka kembali watermark yang telah ditambahkan, dan kunci watermark ini hanya diketahui oleh pihak yang berkepentingan seperti produser label dan sebagainya.

Gambar 2.2 Perancangan Sistem Watermarking

Penerapan Digital Watermarking langsung dapat diterapkan pada data digital tersebut atau menggunakan tranformasi ke dalam domain yang lain seperti domain waktu atau domain frekuensi. Berbagai transformasi yang dikenal dalam pengolahan sinyal digital seperti :

1. Transformasi Fourier

2. DCT (Discrete Cosine Transform) 3. Transformasi Wavelet, dan sebagainya.

Dalam matematika, Transformasi Fourier adalah operasi yang merubah suatu nilai kompleks fungsi variabel real kedalam bentuk yang lain. Pada pengolahan sinyal, transformasi ini bekerja pada domain waktu kemudian berkembang menjadi transformasi

Penambahan Watermark Pendeteksi

Watermark

Pengkodean Watermark

Dekode Watermark

Kunci Sinyal induk Kunci

Watermark Watermark

Derau

+ +

File Identitas File

(26)

yang merubah fungsi kedalam domain frekuensi. Ada beberapa konvensi umum untuk menentukan Transformasi Fourier dari suatu integral fungsi f: R C (Lihat Persamaan

2.1)

untuk setiap bilangan real ξ. (2.1) Variabel bebas x merepresentasikan waktu (dengan SI satuan detik), transformasi variabel ξ mewakili frekuensi (dalam hertz). Untuk kondisi yang sesuai, ƒ dapat direkonstruksi dari oleh Perubahan Invers (Persamaan 2.2)

.

untuk setiap bilangan real x. (2.2)

Dalam studi deret Fourier, fungsi periodik ditulis sebagai jumlah matematis gelombang sederhana yang diwakilkan oleh sinus dan cosinus. Hal ini dikarenakan sifat sinus dan kosinus adalah untuk memulihkan jumlah masing-masing gelombang dalam penjumlahan dengan integral Dalam banyak kasus, diharapkan untuk menggunakan rumus Euler, yang menyatakan bahwa e2πiθ = cos 2 πθ + i sin 2 πθ ,untuk menulis deret Fourier dalam bentuk gelombang dasar e2πiθ. Ini memiliki keuntungan untuk menyederhanakan banyak rumus yang terlibat dan memberikan rumusan untuk deret Fourier

Tranformasi Fourier terbagi atas beberapa bagian, salah satunya adalah Discrete Fourier Transform yaitu merubah satu fungsi ke fungsi yang lain, dan merupakan

(27)

2.2.1 Tujuan Watermarking

Watermarking digunakan untuk beberapa tujuan seperti :

1. Otentikasi.

Watermarking digunakan sebagai alat untuk mengidentifikasi atau menunjukkan

bahwa data digital telah mengalami perubahan dari aslinya. 2. Pengidentifikasi Lokasi.

Watermarking digunakan untuk mengidentifikasi isi dari data digital pada

lokasi-lokasi tertentu. 3. Anotasi.

Watermarking digunakan hanya sebagai keterangan tentang data digital itu sendiri.

4. Perlindungan Hak Cipta, yaitu menyembunyikan label hak cipta pada data.

2.2.2 Audio Watermarking

Audio Watermarking adalah teknik watermarking dengan audio sebagai berkas yang

menjadi tumpangan. Berdasarkan domain penyisipannya, teknik watermarking audio dapat dibagi menjadi dua kelompok, yaitu temporal watermarking dan spectral watermarking. Temporal watermarking adalah melakukan penyisipan data pada audio

host dalam domain waktu, sedangkan spectral watermarking terlebih dulu melakukan proses transformasi dari domain waktu ke dalam domain frekuensi, sehingga penyisipannya dilakukan pada elemen-elemen frekuensi.

Metode audio watermarking dibagi berdasarkan domain yaitu : 1. Domain waktu

(28)

Beberapa teknik algoritma yang termasuk dalam metode ini adalah:

a) Compressed-domain watermarking : Pada teknik ini hanya representasi data yang terkompresi yang diberi watermark. Saat data di uncompressed maka watermark tidak lagi tersedia.

b) Bit dithering : Watermark disisipkan pada tiap LSB, baik pada representasi data terkompresi atau tidak. Teknik ini membuat derau pada sinyal.

c) Modulasi Amplitudo : Cara ini membuat setiap puncak sinyal dimodifikasi agar jatuh ke dalam pita-pita amplitudo yang telah ditentukan

d) Penyembunyian Echo: Dalam metode ini salinan-salinan terputus-putus dari sinyal dicampur dengan sinyal asli dengan rentang waktu yang cukup kecil. Rentang waktu ini cukup kecil sehingga amplitudo salinannya cukup kecil sehingga tidak terdengar.

2. Domain frekuensi

Metode ini bekerja dengan cara mengubah konten spektral dalam domain frekuensi dari sinyal seperti membuang komponen frekuensi tertentu atau menambahkan data sebagai derau dengan amplitudo rendah sehingga tidak terdengar. Beberapa teknik yang bekerja dengan metode ini:

a) Phase coding : Bekerja berdasarkan karakteristik sistem pendengaran manusia (Human Auditory System) yang mengabaikan suara yang lebih lemah jika dua suara itu datang bersamaan. Secara garis besar data watermark dibuat menjadi derau dengan amplitudo yang lebih lemah dibandingkan amplitudo data audio lalu digabungkan

b) Modifikasi Pita Frekuensi : Informasi watermark ditambahkan dengan cara membuang atau menyisipkan ke dalam pita-pita (band) spektral tertentu.

c) Penyebaran spektrum : metode ini diadopsi dari teknik penyebaran spektrum dalam telekomunikasi.

(29)

2.3 Phase Coding

Metode Phase coding adalah metode menyembunyikan data pada berkas induk yaitu audio, yang memanfaatkan kelemahan pada pendengaran manusia dengan menggantikan fase dari segmen awal audio dengan fase referensi yang merepresentasikan label watermark dan ditambahkan fase diferensial audio asli. Dengan cara ini, diferensial pengkodean dengan fase biner watermark diseimbangkan. Hal ini untuk membangkitkan aliran biner secara random yang membentuk gelombang digital (berbentuk bujur sangkar). Gelombang tersebut memiliki fase π/2 atau –π/2.

Langkah pertama dalam Phase coding adalah membagi urutan suara kedalam segmen pendek yang ditunjukkan pada gambar 2.1

Gambar 2.3 Sinyal Asli dan Sinyal yang dibagi beberapa segmen

Suatu Transformasi Fourier Diskrit (Discrete Fourier Transform) dihitung pada masing-masing panjang segmen N. Untuk masing-masing-masing-masing elemen hasil fase data dari DFT, hingga nilai N-1, menghitung susunan diferensial antara elemen fase yang berdekatan. Fase absolut dari sinyal data watermark ditambahkan pada pada diferensial, atau Fourier Diskrit pada langkah terakhir.

Langkah selanjutnya adalah dengan memasukkan data, dan mengatur nilainya sebagai fase absolut, kemudian fase absolut watermark di tambahkan pada Fourier Diskrit dari sinyal asli. Dan gabungkan kembali segmen-segmen yang telah dimodifikasi fasenya tersebut menjadi satu.

(30)

pendeteksian. Langkah-langkah pendeteksian watermark yang dilakukan adalah sebagai berikut :

1. Ambil n bagian pertama dari sinyal suara dimana n adalah panjang segmen enkode yang diketahui, s[0] ..s[n-1]. Perhitungan hanya dilakukan terhadap n elemen pertama sinyal karena data watermark disisipkan hanya di segmen awal sinyal suara asli. 2. Lakukan FFT terhadap n-1 sinyal tersebut, kemudian cari nilai fasenya (

φ

) sesuai

persamaan 2.3

   

= −

k k a b 1 tan

φ (2.3)

ak adalah nilai real dari FFT dan bk adalah nilai imaginer dari sinyal tersebut.

3. Konversi nilai fase yang didapatkan, π/2 menjadi bit 1 dan -π/2 menjadi bit 0 sebanyak panjang bit watermark. Hasil konversi nilai fase dibandingkan dengan nilai fase sinyal suara asli.

(31)

File dengan Watermark

MP3 Hitung Jumlah

Frame yang dapat disisipkan

ENKODE

File Sisip (*.txt)

Kompresi

DEKODE Hitung Jumlah

Bit Data

MP3 File File Teks

Bab 3

PERANCANGAN SISTEM DAN IMPLEMETASI

3.1 Perancangan Sistem

Digital watermarking adalah suatu teknik penyembunyian berkas identitas (dalam hal ini berkas *.txt) pada sebuah data digital (seperti audio MP3) yang memiliki beberapa proses yang harus dilalui seperti pengkodean watermark, pengembalian watermark (dekode) dan lain-lain, sehingga diperlukan spesifikasi perangkat keras yang cukup tinggi untuk dapat menjalankan aplikasi ini.

Watermarking terbagi atas dua proses yaitu enkode dan dekode untuk mengambil berkas sisipan, perhatikan gambar 3.1.

(32)
(33)
(34)

Alur Proses pada phase coding untuk penyisipan teks atau enkode adalah sebagai berikut :

1. Merepresentasikan suara kedalam sinyal yang kemudian akan dibagi menjadi beberapa N segmen yang memiliki panjang yang sama yaitu L, kemudian dimasukkan kesuatu data array A[i], dimana 0<i<L-1

2. Menghitung nilai DFT pada masing-masing N segmen. 3. Hitung nilai fase dan amplitudo dari tiap-tiap segmen. 4. Hitung beda fase antara fase segmen yang berdekatan.

5. Fase absolut dari sinyal watermark ditambahkan kedalam beda fase yang dihasilkan sebelumnya. Sinyal watermark dengan panjang Lw, w[j], 0<j<Lw-1, disajikan sebagai bit 1 untuk gelombang π/2 dan bit 0 untuk gelombang - π/2.

6. Subtitusikan fase segmen awal dengan fase sinyal watermark yang telah diubah dalam bentuk bit tersebut.

7. Buat Matrik fase untuk N>0 dengan menggunakan beda fase untuk menjaga relativitas fase antara segmen suara.

(35)
(36)
(37)

Alur Proses pada phase coding untuk dekode adalah sebagai berikut :

1. Ambil n bagian pertama dari sinyal suara dimana n adalah panjang segmen enkoding yang diketahui, s[0] ..s[n-1]. Perhitungan hanya dilakukan terhadap n elemen pertama sinyal karena data watermark disisipkan hanya di segmen awal sinyal suara asli. 2. Lakukan FFT terhadap n-1 sinyal tersebut, kemudian cari nilai fasenya.

3. Konversi nilai fase yang didapatkan, π/2 menjadi bit 1 dan -π/2 menjadi bit 0 sebanyak panjang bit watermark. Hasil konversi nilai fase dibandingkan dengan nilai fase sinyal suara asli.

(38)
(39)

3.2 Implementasi

Perangkat lunak dibuat dengan menggunakan Visual Borland Delphi 7. Data yang dibutuhkan dalam aplikasi ini adalah berkas audio yaitu *.mp3 dan berkas dokumen sebagai berkas yang akan disisipkan yaitu *.txt. Agar proses implementasi ini dapat bekerja dengan sempurna maka harus diuji untuk mengetahui kelemahan dan kesalahan yang ada untuk kemudian di evaluasi.

3.2.1 Implementasi Antarmuka

Aplikasi ini dibuat sesederhana mungkin sehingga memudahkan pengguna untuk memahami dan menggunakannya. Pada Aplikasi ini terdiri atas 2 Form dengan 1 unit untuk memproses aplikasi.

(40)

Gambar 3.8 Tampilan Form About

3.2.2 Tampilan Utama Aplikasi

Tampilan ini dirancang sedemikian rupa dimana tidak membutuhkan banyak form sehingga memudahkan pengguna untuk menjalankan aplikasi ini.

Tampilan ini terdiri atas beberapa komponen yang dapat di jalankan, yaitu : 1. Tombol ’ Pilih mp3’

Tombol ini memiliki fungsi untuk memilih berkas audio yang akan disisipkan oleh berkas identitas.

2. Tombol ’Mp3 info’

Tombol ini memiliki fungsi untuk Untuk melihat Informasi dari Mp3 tersebut. Informasi tersebut terdiri dari :

a. Versi Audio

b. Indeks Layer Audio

c. Protection bit yaitu ada tidaknya CRC pada berkas audio. d. Padding bit

e. Indeks Bit rate f. Indeks Sampling g. Ukuran Frame Awal

(41)

i. . Ukuran Frame Header Selanjutnya j. VBR

k. Nilai VBR l. Jumlah Frame

m. Jumlah Frame yang dapat di watermark 3. Tombol ’Ukuran Max Sisip’

Fungsi tombol ini adalah melihat ukuran maksimal frame yang dapat disisipkan. 4. Tombol ’Size after Encrypt + Compress’

Fungsi tombol ini adalah melihat berkas setelah di kompresi dan di-enkripsi. 5. Tombol ’Pilih File Sisip’

Fungsi tombol ini adalah memasukkan berkas sisip ke dalam memori aplikasi. 6. Tombol ‘Encode’

Fungsi tombol ini adalah menjalankan proses penyisipan berkas teks (*.txt) kedalam berkas MP3 (*.mp3).

7. Tombol ‘Pilih mp3_watermark’

Fungsi tombol ini adalah memasukkan berkas sisip ke dalam memori aplikasi. 8. Tombol ‘Decode’

Fungsi tombol ini adalah menjalankan proses pengembalian berkas *.txt dari berkas terwatermark.

9. Tombol ‘About’

Fungsi tombol ini adalah melihat hal tentang aplikasi. 10. Tombol ‘Clear Memo’

Fungsi tombol ini adalah membersihkan memo dari info mp3 yang sebelumnya. 11. EditText ‘FileName’

12. EditText ‘HiddenFile’ 13. EditText ‘HiddenLenght’ 14. EditText ‘HiddenFileExt’

(42)

3.2.2.1 Proses Enkode

Proses Enkode adalah proses yang dilakukan untuk menyisipkan berkas teks kedalam berkas audio sebagai berkas induknya.

Pada saat pertama sekali memasukkan berkas audio dan berkas teks yang akan disisipkan. Perhatikan pada mp3 info, jumlah frame dan bit frame yang dapat disispkan serta ukuran maksimal . Apabila nilai tersebut didapati maka tahap selanjutnya adalah mengisi password sebagai keamanan berkas tersebut yang akan di enkripsi, dan proses enkode dapat dijalankan. Gambar 3.9 menunujukkan kotak dialog untuk memilih MP3 yang akan disisipkan.

(43)

Gambar 3.10 Tampilan Proses Tombol ’ Mp3 info’

Gambar 3.10 merupakan hasil dari proses Mp3 Info yaitu informasi mengenai berkas audio yang telah dimasukkan dan yang akan disisipi.

Gambar 3.11 Tampilan Proses Tombol ’Ukuran Max Sisip’

Gambar 3.11 merupakan hasil dari proses perhitungan ukuran maksimum bit berkas audio yang dapat disisipi. Langkah-langkah perhitungan ukuran maksimum untuk dapat menyembunyikan teks pada audio adalah sebagai berikut :

(44)

3. Selama posNext tidak sama dengan -1 maka lakukan proses dibawah ini . a. Pos = PosNext+36;

b. Temukan header selanjutnya dan subtitusikan nilainya menjadi nilai variabel posNext.

c. Jika posNetxt tidak sama dengan -1 maka

i. Untuk 0<i<L-2 , maka berkas dapat di watermark

ii. Jika berkas dapat diwatermark, posNext <> -1, dan bukan waktu pertama maka :

Variabel Hitung = Hitung + (pos – posNext) – 4.

Gambar 3.12 Tampilan Proses Tombol ’Pilih Sisip File’

(45)

Gambar 3.13 Tampilan Proses Tombol ’Encode’

Gambar 3.13 menunjukkan proses dari tombol Encode yaitu memunculkan pemberitahuan bahwa data telah sukses dilakukan penyisipan dan menunjukkan lokasi berkas yang telah disisipi oleh teks.

3.2.2.2 Proses Dekode

Proses Dekode adalah proses yang dilakukan untuk mengembalikan berkas yang telah disisipkan.

Pertama sekali memasukkan berkas audio yang telah disisipkan. Isi Password pada kotak password yang disediakan, apabila password sama dengan password enkode maka proses enkode dapat dijalankan. Proses selanjutnya adalah memeriksa berkas audio tersebut , apakah merupakan berkas watermark atau tidak. Apabila telah terwatermark, maka proses dekode dapat dilakukan. Proses dekode dapat dilihat pada gambar 3.6.

(46)

Gambar 3.14 Tampilan Proses Tombol ’Decode’

3.3 Instalasi Aplikasi

(47)

Bab 4

ANALISIS MASALAH

4.1 Analisis Masalah

Penggunaan data digital memberikan banyak kemudahan seperti pendistribusian yang murah dan mudah, penggandaan dan penyimpanan yang mudah, akan tetapi kemudahan-kemudahan tersebut menjadi kendala tersendiri bagi produsen-produsen data digital karena digunakan secara ‘negatif ‘ oleh orang yang tidak bertanggung jawab.

Perlindungan hak cipta terhadap data digital memang sudah menjadi perhatian orang-orang sejak dulu. Banyak cara yang sudah ditempuh untuk memberikan atau melindungi data digital, seperti: enkripsi, perlindungan penggandaan, visible marking, header marking, dan sebagainya, tetapi semua cara tersebut memiliki kelemahannya

masing-masing.

Digital watermarking dikembangkan sebagai salah satu jawaban untuk

menentukan keabsahan pencipta atau pendistribusi suatu data digital dan integritas suatu data digital. Teknik watermarking bekerja dengan menyisipkan sedikit informasi yang menunjukkan kepemilikan, tujuan, atau data lain, pada media digital tanpa mempengaruhi kualitasnya.

Dalam menyembunyikan pesan, ada beberapa kriteria yang harus dipenuhi.

(48)

2). Fidelity. Mutu media penampung tidak berubah banyak akibat penyisipan. Perubahan yang terjadi harus tidak dapat dipersepsi oleh indera manusia.

3). Recovery. Pesan yang disembunyikan harus dapat diungkap kembali. Sewaktu-waktu informasi yang disembunyikan ini harus dapat diambil kembali untuk dapat digunakan lebih lanjut sesuai keperluan (Martharany Rumondang, 2002)

Dengan adanya kriteria diatas, maka digunakan suatu teknik watermarking Phase coding, dimana teknik ini memanfaatkan dari kelemahan-kelemahan manusia ketika

mendengar suara bersamaan dengan menggabaikan suara dengan frekuensi terlemah. Teknik ini bergerak pada frekuensi domain, yaitu menggantikan fase dari segmen awal audio dengan fase referensi yang merepresentasikan label watermark dan ditambahkan fase diferensial audio asli. Dengan cara ini, diferensial pengkodean dengan fase biner watermark diseimbangkan. Teknik ini cukup efisien untuk perlindungan hak cipta dan

pengendalian distribusi data dengan melihat teks yang disisipkan pada data tersebut yang menjadi identitas pada data aslinya, yang berisikan tentang info mengenai sumber-sumber data tersebut.

(49)

4.2 Pengujian Aplikasi

Pengujian perangkat lunak mp3_wm dilakukan dengan menggunakan perangkat keras yang memiliki spesifikasi sebagai berikut :

1. CPU : Intel Core2 duo Processor 2. HD : 160GB

3. Memori : 512 MB DDRAM

Pengujian yang akan dilakukan meliputi pengujian terhadap tiga hal, yaitu :

1. Kebenaran perangkat lunak, yang diukur dari kesesuaian watermark yang disisipkan dengan watermark hasil ekstraksi. Besarnya kesesuaian dihitung dalam persentase dengan membandingkan jumlah bit watermark yang berhasil diekstraksi dengan jumlah bit watermark yang asli.

2. Kinerja perangkat lunak yang diukur dari kecepatan penyisipan maupun pengekstraksian watermark. Pengujian ini dilakukan untuk mengetahui seberapa besar kinerja perangkat lunak yang dibangun

3. Ketahanan data terhadap pemrosesan berkas MP3. Pengujian dilakukan untuk mengetahui sejauh mana kesesuaian bit watermark hasil ekstraksi dengan bit watermark asli, jika berkas MP3 dimanipulasi.

(50)

Tabel 4.1 Berkas Audio yang di uji

3 traditional.mp3 0.45MB Stereo 224kbps 32kHz 0:00:20 4 cow_02.mp3 0.02MB Mono 173kbps 48kHz 0:00:01

Tabel 4.2 Berkas Teks yang di uji

No Nama Berkas Ukuran

1 Sisip_label.txt 72B

2 Sorry.txt 1300B

Tabel 4.3 menunjukkan Hasil Pengujian terhadap aplikasi yang dibuat, dan tabel 4.4 merupakan hasil audio dari proses watermark tanpa adanya pengolahan sinyal digital.

Tabel 4.3 Hasil Pengujian Aplikasi

No Hasil Proses Ukuran

1 Pemutaran berkas MP3 sebelum disisipi watermark Berhasil 2 Pemutaran berkas MP3

sebelum disisipi watermark

Berhasil

3 Penyisipan sebuah watermark (.txt) ke dalam sebuah berkas MP3

Berhasil

4 Pemutaran berkas MP3 yang telah disisipi watermark Berhasil 5 Ekstraksi watermark dari berkas MP3 yang telah

disisipi watermark

(51)

Tabel 4.4 Berkas Watermark tanpa Pengolahan Sinyal

No MP3 No Txt Tipe Ukuran Data

Bitrate Sample Rate Durasi

1 1 Stereo 4.72MB 191kbps 44kHz 0:03:36 2 Stereo 4.72MB 191kbps 44kHz 0:03:36 2 1 Stereo 4.82MB 320kbps 44kHz 0:03:31 2 Stereo 4.82MB 320kbps 44kHz 0:03:31 3 1 Stereo 0.45MB 224kbps 32kHz 0:00:20 2 Stereo 0.45MB 224kbps 32kHz 0:00:20

4 1 Mono 0.03Mb 173kbps 48kHz 0:00:01

2 Gagal Gagal Gagal Gagal Gagal

Dilakukan pengujian terhadap beberapa 5 responden dalam mendengarkan audio (Lihat Lampiran B). Hal ini dilakukan untuk melihat apakah audio watermark yang dihasilkan dapat terdeteksi oleh indera manusia.

Tabel 4.5 Hasil Pengujian Watermark terhadap Indera Manusia

No Berkas Sebelum watermark Berkas Sesudah watermark Perbedaan

dengan audio asli Kualitas

Suara

Presentase Kualitas Suara

Presentase

1.1 Baik 80% Baik 80% Tidak Ada

1.2 Baik 80% Tidak Ada

2.1 Baik 80% Baik 80% Tidak Ada

2.2 Baik 80% Tidak Ada

3.1 Baik 90% Baik 90% Tidak Ada

3.2 Baik 90% Tidak Ada

4.1 Baik 90% Baik 90% Tidak Ada

(52)

Tabel 4.6 merupakan hasil analisis terhadap audio dengan perubahan format *.wav dengan menggunakan aplikasi tambahan yaitu RightMark Audio Analyzer 6.2.3.

Tabel 4.6 Analisis Audio dengan Perubahan Format *.wav Menggunkaan Aplikasi

RightMark Audio Analyzer 6.2.3

Nama File FR NL DR THD ID SC IDN FRS

16. Naima-SMS Aku.mp3 +28.56

-21.37

traditional.mp3 Test Waveform was not recorded properly

cow_02.mp3 Test Waveform was not recorded properly

A

16. Naima-SMS Aku.mp3

watermarkSisip_Label.txt

Test Waveform was not recorded properly

cow_02.mp3

watermarkSisip_Label.txt

Test Waveform was not recorded properly

A

16. Naima-SMS Aku.mp3

watermarksorry.txt

Test Waveform was not recorded properly

(53)

Gambar 4.2 : Perbedaan Sampel pada File Asli dengan File Watermark dengan

Wavesound Editor

Dari gambar 4.2, dapat dilihat perubahan sinyal audio setelah disisipkan file teks dengan mendapatkan tambahan sinyal pada sinyal awal, dan perbedaan sinyal tersebut sangat kecil.

(54)

Gambar 4.3 Pengujian dengan Sound Generator

Gambar 4.3 menunjukkan pengujian dengan menggunakan aplikasi Sound Generator, aplikasi ini bertujuan untuk melihat nilai frekuensi lemah, Amplitudo lemah, dan SNR (Signal Noise Ratio) pada audio.

Tabel 4.7 Hasil Pengujian terhadap Resampling

No Sampling rate Asal

Sampling Rate Baru

Sampling Rate Kedua

Hasil Ektraksi

1.1 44100Hz 48000Hz 32000Hz Baik

1.2 44100Hz 48000Hz 32000Hz Baik

2.1 44100Hz 48000Hz 32000Hz Baik

2.2 44100Hz 48000Hz 32000Hz Baik

3.1 32000Hz 48000Hz 32000Hz Baik

3.2 32000Hz 48000Hz 32000Hz Baik

(55)
(56)

Bab 5

PENUTUP

5.1. Kesimpulan

Berdasarkan pembahasan dan evaluasi dari bab-bab terdahulu dan teori yang ada maka dapat di tarik kesimpulan bahwa :

1. Watermarking dengan teknik phase coding merupakan teknik yang cukup handal dalam penyisipan file ke dalam suatu berkas MP3 karena teknik ini tahan terhadap pengolahan sinyal tanpa banyak mengubah file audio tersebut.

2. Kualitas suara yang dihasilkan oleh watermarking phase coding cukup baik, pendengar tidak merasakan adanya derau.

3. Kelemahan teknik ini adalah pada saat pegeksekusian awal membutuhkan waktu yang lama dibandingkan dengan file asli, karena penyisipan diletakkan pada segmen awal. 4. Enkode terhadap data yang dengan ukuran yang besar memakai waktu yang cukup

lama, karena penghitungan terhadap frame-frame yang ada.

5.3 Saran

(57)

Oleh karena itu, diharapkan pada penelitian selanjutnya dapat menemukan metode watermarking yang handal yang dapat diterapkan pada data ukuran besar, dapat dilakukan

(58)

DAFTAR PUSTAKA

Nedeljko, Cvejic. 5 Juli 2009. Introduction to Digital Audio Watermarking.

Fathony, Dean.2003. Digital Audio Watermarking Menggunakan Analisis Audio Content. http://www.informatika.org/~rinaldi/Kriptografi/2006-2007/Makalah1/Makalah1-085.pdf . Diakses : 5 Juli 2009.

Mikdam dan Marwan. 5 Juli 2009 Digital Audio Watermarking : Survey.

http://ducati.doc.ntu.ac.uk/uksim/ESM2003/Papers/Track-General/CS-16/paper%20CR.pdf.

Munir, Rinaldi.2004.Steganografi dan Watermarking. http://www.informatika.org/~rinaldi/Kriptografi/Steganografi%20dan%20Waterm arking.pdf. Diakses : 5 Juli 2009.

Prabawa, Arya.2009. Penerapan Digital Rights Management dan Watermarking pada lagu. http://www.informatika.org/~rinaldi/Kriptografi/2008-2009/Makalah1/MakalahIF30581-2009-a060.pdf. Diakses : 5 Juli 2009.

Rumondang,Martharany.2002. Perlindungan Hak Cipta Pada Data Audio Menggunakan Teknik Watermarking Phase Coding.

(59)

Suhono dan Kuspriyanto.2000.”Watermarking sebagai Teknik Penyembunyian Label Hak cipta pada Data Digital”.Teknik Elektro Vol 6.hal. 19-27.Bandung: ITB.

Thanuja dan Nagaraj.Juli 2008.” Schemes for Evaluating Signal Processing Properties of Audio Watermarking”. IJCSNS International Journal of Computer Science and Network Security, VOL.8 No.7.hal 242-246.

(60)

LAMPIRAN A : LISTING PROGRAM

program mp3_wm;

uses Forms,

Unit1 in 'Unit1.pas' {Form1}, uMP3 in 'uMP3.pas',

Unit2 in 'Unit2.pas' {AboutBox};

{$R *.res}

begin

Application.Initialize;

Application.Title := 'Watermark_Mp3'; Application.CreateForm(TForm1, Form1);

Application.CreateForm(TAboutBox, AboutBox); Application.Run;

end.

(61)

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, MPlayer, StdCtrls, uMP3, ExtCtrls, DCPcrypt2, DCPrc4, ZLibEx, DCPsha1, ComCtrls, Unit2, DCPblockciphers, DCPrijndael, jpeg,

ShellAPI,

OpenDialog1: TOpenDialog; btnFindFirst: TButton; txtHiddenFile: TEdit; btnBrowseHid: TButton; OpenDialog2: TOpenDialog; btnHide: TButton;

txtHiddenLength: TLabeledEdit; txtHiddenFileExt: TLabeledEdit; txtFileResult: TLabeledEdit; btnBrowseSteg: TButton; OpenDialog3: TOpenDialog; btnReveal: TButton;

txtPassword: TEdit; btnCheckSize: TButton; btnCheckMaxHidden: TButton; DCP_sha11: TDCP_sha1;

GroupBox1: TGroupBox; Memo1: TMemo;

btnClearMemo: TButton; btnAbout: TButton;

DCP_rijndael1: TDCP_rijndael; MediaPlayer1: TMediaPlayer; TrackBar1: TTrackBar;

XPManifest1: TXPManifest; Image1: TImage;

Label1: TLabel; Timer1: TTimer;

procedure btnBrowseClick(Sender: TObject); procedure btnFindFirstClick(Sender: TObject); procedure btnClearMemoClick(Sender: TObject); procedure btnBrowseHidClick(Sender: TObject); procedure btnHideClick(Sender: TObject);

procedure btnBrowseStegClick(Sender: TObject); procedure btnRevealClick(Sender: TObject);

procedure btnCheckMaxHiddenClick(Sender: TObject); procedure btnCheckSizeClick(Sender: TObject); procedure btnAboutClick(Sender: TObject); procedure Image2Click(Sender: TObject); procedure Image1Click(Sender: TObject); procedure btnHelpClick(Sender: TObject);

(62)

var DoDefault: Boolean);

procedure Timer1Timer(Sender: TObject); private

{ Private declarations }

function checkSizeAfter(filename: string; password: string): Integer;

function encryptAndCompress(filename: string; password: string): Boolean;

function decompressAndDecrypt(filename: string; password: string): Boolean;

EmbedFileResult: string;

implementation

{$R *.dfm}

//function to decompress and decrypt

function TForm1.decompressAndDecrypt(filename: string; password: string):

Boolean; var

SourceCrypt, DestCrypt, InputStream, OutputStream: TFileStream; DeCompressionStream: TZDecompressionStream;

begin

Result:=False;

//decrypt try

SourceCrypt:= TFileStream.Create(filename, fmOpenRead or fmShareDenyNone);

DestCrypt:= TFileStream.Create('tmpDecrypt.tmp.zip',fmCreate); DCP_rijndael1.InitStr(password,TDCP_sha1); // initialize the cipher with a hash of the passphrase

DCP_rijndael1.DecryptStream(SourceCrypt,DestCrypt,SourceCrypt.Size); // decrypt the contents of the file

DCP_rijndael1.Burn; DestCrypt.Free; SourceCrypt.Free; DeleteFile(filename); //Result:=True;

except

MessageDlg('File IO error',mtError,[mbOK],0); end;

//decompress try

InputStream := TFileStream.Create('tmpDecrypt.tmp.zip', fmOpenRead or fmShareDenyNone);

OutputStream := TFileStream.Create(filename, fmCreate);

(63)

OutputStream.CopyFrom(DecompressionStream, 0); DecompressionStream.Free;

OutputStream.Free; InputStream.Free;

DeleteFile('tmpDecrypt.tmp.zip'); Result:=True;

except

MessageDlg('File IO error',mtError,[mbOK],0); end;

end;

//function to encrypt and compress file

function TForm1.encryptAndCompress(filename: string; password: string): Boolean;

var

SourceCrypt, DestCrypt, InputStream, OutputStream: TFileStream; CompressionStream: TZCompressionStream;

begin

Result:=False; //compress try

InputStream := TFileStream.Create(filename, fmOpenRead or fmShareDenyNone);

OutputStream := TFileStream.Create('tmpCrypt.tmp.zip', fmCreate); CompressionStream := TZCompressionStream.Create(OutputStream, zcMax);

CompressionStream.CopyFrom(InputStream, InputStream.Size); CompressionStream.Free;

//Result:=True; OutputStream.Free; InputStream.Free; except

MessageDlg('File IO error',mtError,[mbOK],0); end;

//crypt try

SourceCrypt:= TFileStream.Create('tmpCrypt.tmp.zip',fmOpenRead or fmShareDenyNone);

DestCrypt:=

TFileStream.Create('tmpCrypt.tmp'+ExtractFileExt(filename),fmCreate); DCP_rijndael1.InitStr(password,TDCP_sha1); //

initialize the cipher with a hash of the passphrase

DCP_rijndael1.EncryptStream(SourceCrypt,DestCrypt,SourceCrypt.Size); // encrypt the contents of the file

DCP_rijndael1.Burn; Result:=True;

DestCrypt.Free; SourceCrypt.Free; except

MessageDlg('File IO error',mtError,[mbOK],0); end;

(64)

end;

//function to check file size after encryption and compression function TForm1.checkSizeAfter(filename: string; password: string): Integer;

var

SourceCrypt, DestCrypt, InputStream, OutputStream: TFileStream; CompressionStream: TZCompressionStream;

begin

Result:=-1; //compress try

InputStream := TFileStream.Create(filename, fmOpenRead or fmShareDenyNone);

OutputStream := TFileStream.Create('tmpCrypt.tmp.zip', fmCreate); CompressionStream := TZCompressionStream.Create(OutputStream, zcMax);

CompressionStream.CopyFrom(InputStream, InputStream.Size); CompressionStream.Free;

//Result:=OutputStream.Size; OutputStream.Free;

InputStream.Free; except

MessageDlg('File IO error',mtError,[mbOK],0); end;

//crypt try

SourceCrypt:= TFileStream.Create('tmpCrypt.tmp.zip',fmOpenRead or fmShareDenyNone);

DestCrypt:= TFileStream.Create('tmpCrypt.tmp',fmCreate); DCP_rijndael1.InitStr(password,TDCP_sha1); // initialize the cipher with a hash of the passphrase

DCP_rijndael1.EncryptStream(SourceCrypt,DestCrypt,SourceCrypt.Size); // encrypt the contents of the file

DCP_rijndael1.Burn; Result:=DestCrypt.Size; DestCrypt.Free;

SourceCrypt.Free; except

MessageDlg('File IO error',mtError,[mbOK],0); end;

DeleteFile('tmpCrypt.tmp'); DeleteFile('tmpCrypt.tmp.zip'); end;

procedure TForm1.btnBrowseClick(Sender: TObject); begin

if (OpenDialog1.Execute) then begin

if FileExists(OpenDialog1.FileName) then begin

Memo1.Clear;

Mediaplayer1.Close;

(65)

txtFilename.Text:=OpenDialog1.FileName; Mediaplayer1.Open;

Trackbar1.Min := 0;

Trackbar1.Max := Mediaplayer1.Length; Trackbar1.Position := 0;

end; end; end;

procedure TForm1.btnFindFirstClick(Sender: TObject); var

pos, posNext: Integer; myRawHeader: TRawMP3Header; myHeaderArray: TMP3HeaderArray; begin

if FileExists(txtFilename.Text) then begin

Memo1.Clear;

pos:=FindFirstHeader(txtFilename.Text);

Memo1.Lines.Add('First header found at byte '+inttostr(pos));

myHeaderArray:=getMP3Header(txtFilename.Text, pos); ParseHeaderArray(myHeaderArray, myRawHeader);

//print result into memo

Memo1.Lines.Add('Audio

version='+inttostr(myRawHeader.AudioVersion));

Memo1.Lines.Add('Layer index='+inttostr(myRawHeader.LayerIdx)); Memo1.Lines.Add('Protection bit='+inttostr(myRawHeader.Protection)); Memo1.Lines.Add('Padding bit='+inttostr(myRawHeader.Padding));

Memo1.Lines.Add('Bit Rate Index='+inttostr(myRawHeader.BitrateIdx)); Memo1.Lines.Add('Sampling Rate

Index='+inttostr(myRawHeader.SamplingRateIdx));

Memo1.Lines.Add('Frame Size='+inttostr(frameSize(myHeaderArray)));

posNext:=FindNextFrame(txtFilename.Text, pos, myHeaderArray); Memo1.Lines.Add('Next Header found at='+inttostr(posNext)); //print result into memo

myHeaderArray:=getMP3Header(txtFilename.Text, posNext);

Memo1.Lines.Add('Frame Size='+inttostr(frameSize(myHeaderArray))); Memo1.Lines.Add('IsVBR='+inttostr(ord(isVBR(txtFilename.text)))); Memo1.Lines.Add('VBRPos='+inttostr(VBRPos(txtFilename.text))); Memo1.Lines.Add('Frame

Count='+inttostr(frameCount(txtFilename.text)));

Memo1.Lines.Add('Frame Available to waterm Count='+inttostr( FrameAvailableToWatermCount(txtFilename.text, 10))); Memo1.Lines.Add('Frame Available to waterm Bytes='+inttostr( MaxWatermSize(txtFilename.text, 10)));

end else begin

MessageDlg('File does not exist!', mtError, [mbOK], 0); exit;

(66)

procedure TForm1.btnClearMemoClick(Sender: TObject); begin

Memo1.Lines.Clear; end;

procedure TForm1.btnBrowseHidClick(Sender: TObject); begin

if (OpenDialog2.Execute) then begin

if FileExists(OpenDialog2.FileName) then begin

txtHiddenFile.Text:=OpenDialog2.FileName;

txtHiddenLength.Text:=inttostr(FileSize(OpenDialog2.FileName)); txtHiddenFileExt.Text:=ExtractFileExt(OpenDialog2.FileName); end;

end; end;

procedure TForm1.btnHideClick(Sender: TObject); begin

if (txtPassword.Text='') then begin

messageDlg('Please fill the password', mtError, [ mbOK], 0);

exit; end;

if (not FileExists(txtFilename.Text)) or (not FileExists(txtHiddenFile.Text)) then

begin

messageDlg('Both file (mp3 source and hidden file) must exists', mtError, [

mbOK], 0); exit;

end;

EmbedFileResult:= extractFilePath(txtFilename.Text) + extractFileName(txtFilename.Text)+

'-watermark'+extractFileName(txtHiddenFile.Text)+extractFileExt( txtFilename.Text);

txtFileResult.Text:=EmbedFileResult;

if (encryptAndCompress(txtHiddenFile.Text, txtPassword.Text)) then begin

if (HideFile(txtFilename.Text,

'tmpCrypt.tmp'+ExtractFileExt(txtHiddenFile.Text), EmbedFileResult, 10)) then

begin

messageDlg('Embedded Watermark successful!'+#13+'Result file is '+EmbedFileResult, mtInformation, [mbOK], 0);

end else begin

messageDlg('Embedded failed!', mtError, [mbOK], 0); end;

end else begin

(67)

end;

procedure TForm1.btnBrowseStegClick(Sender: TObject); begin

if (OpenDialog3.Execute) then begin

if FileExists(OpenDialog3.FileName) then begin

txtFileResult.Text:=OpenDialog3.FileName; end;

end; end;

procedure TForm1.btnRevealClick(Sender: TObject); var

resultName:string; begin

if (txtPassword.Text='') then begin

messageDlg('Please fill the password', mtError, [ mbOK], 0);

exit; end;

if (not FileExists(txtFileResult.Text)) then begin

messageDlg('Embedded-mp3 file does not exist!', mtError, [ mbOK], 0);

exit; end;

resultName:=DekodeFile(txtFileResult.Text); if (resultName<>'None') then

begin

//success dekode

//decompress and decrypt

if (decompressAndDecrypt(resultName, txtPassword.Text)) then begin

messageDlg('Dekode success!'+#13+'Hasil file is '+resultName, mtInformation, [mbOK], 0);

end else

messageDlg('Dekode failed!', mtError, [mbOK], 0); end;

end;

procedure TForm1.btnCheckMaxHiddenClick(Sender: TObject); var

max: Integer; begin

(68)

max:=trunc(MaxWatermSize(txtFilename.Text, 10));

messageDlg('Maximum file size to hide is '+inttostr(max), mtInformation, [

mbOK], 0);

btnCheckMaxHidden.Caption:='Max. Hidden Size='+inttostr(max); end

procedure TForm1.btnCheckSizeClick(Sender: TObject); var

sizeAfter: Integer; begin

if (txtPassword.Text='') then begin

messageDlg('Please fill the password', mtError, [ mbOK], 0);

exit; end;

if (not FileExists(txtHiddenFile.Text)) then begin

messageDlg('File does not exist ', mtError, [ mbOK], 0);

exit; end;

sizeAfter:=checkSizeAfter(txtHiddenFile.Text, txtPassword.Text); messageDlg('Size after encryption and compression is

'+inttostr(sizeAfter), mtInformation, [ mbOK], 0);

btnCheckSize.Caption:='Size after encrypt+compress='+inttostr(sizeAfter); end;

procedure TForm1.btnAboutClick(Sender: TObject); begin

AboutBox.ShowModal; end;

procedure TForm1.Image2Click(Sender: TObject); begin

ShellExecute(Application.Handle, PChar('open'), PChar('http://achmadz.blogspot.com/'), PChar(0), nil, SW_NORMAL);

end;

procedure TForm1.Image1Click(Sender: TObject); begin

ShellExecute(Application.Handle, PChar('open'),

(69)

nil, SW_NORMAL); end;

procedure TForm1.btnHelpClick(Sender: TObject); begin

ShellExecute(Application.Handle, PChar('open'), PChar('HELP.txt'), PChar(0),

nil, SW_NORMAL); end;

procedure TForm1.MediaPlayer1Click(Sender: TObject; Button: TMPBtnType; var DoDefault: Boolean);

begin

if Button = btPlay then Timer1.Enabled := True; end;

procedure TForm1.Timer1Timer(Sender: TObject); begin

TrackBar1.Position:=MediaPlayer1.Position; end;

end.

unit uMP3;

interface uses

SysUtils, Windows, Messages, Classes,Dialogs;

//mp3 header frame type

TRawMP3Header = record AudioVersion,

//array for mp3 header frame type

TMP3HeaderArray = array[0..3] of byte;

(70)

const

//sampling frequency(Hz) lookup table const

samplingRate: array[0..3] of integer = ( 44100,48000,32000,0);

//sampling per frame lookup table const

samplingPerFrame: array[1..3] of Integer = ( 1152, 1152, 384);

function FindFirstHeader(filename: string): Integer;

function FindNextFrame(filename: string; prevHeaderPos: Integer; prevHeader: TMP3HeaderArray): Integer;

procedure ParseHeaderArray(headerArray: TMP3HeaderArray; var RawHeader: TRawMP3Header);

function getMP3Header(filename: string; pos: Integer): TMP3HeaderArray; function frameSize(headerArray: TMP3HeaderArray): Integer;

function isVBR(filename: string): Boolean;

function isFirstFrame(filename: string; framePos: Integer): Boolean; function isAvailableToWaterm(filename: string; framePos: Integer; length:

Integer): Boolean;

function isWaterm(filename: string; framePos: Integer): Boolean; function FrameCount(filename: string): Integer;

function FrameAvailableToWatermCount(filename: string; length: Integer): Integer;

function MaxWatermSize(filename: string; length: Integer): Integer; function VBRPos(filename: string): Integer;

function FileSize(FileName : String) : Int64;

function HideFile(mp3File:string; hiddenFile: string; resultFile: string;

length: Integer): Boolean;

function DekodeFile(mp3File:string): string;

procedure Split(const Delimiter: Char; Input: string; const Strings: TStrings);

implementation

//function to get first frame position

function FindFirstHeader(filename: string): Integer; var

filemp3: File;

headerArray: array[0..3] of byte; count, pos: Integer;

begin

Result:=-1;

(71)

AssignFile(filemp3, filename); FileMode:=fmOpenRead;

Reset(filemp3,1);

BlockRead(filemp3, headerArray, 4, count);

if ((headerArray[0]=$FF) and ((headerArray[1]=$FB) or

//function to find next frame

function FindNextFrame(filename: string; prevHeaderPos: Integer; prevHeader:

TMP3HeaderArray): Integer; var

filemp3: File; count: Integer; posNow: Integer;

headArray: TMP3HeaderArray; begin

Result := -1;

if FileExists(filename) then begin

AssignFile(filemp3, filename); FileMode:=fmOpenRead;

Reset(filemp3, 1);

posNow:=prevHeaderPos+FrameSize(prevHeader); while not eof(filemp3) do

begin

seek(filemp3, posNow);

BlockRead(filemp3, headArray, 4, count);

if ((headArray[0]=$FF) and ((headArray[1] and $E0)=$E0) and ((headArray[2] and $F0)<>$F0)) then

(72)

posNow:=posNow+1;

//function for parsing mp3 header

procedure ParseHeaderArray(headerArray: TMP3HeaderArray; var RawHeader: TRawMP3Header);

begin

RawHeader.AudioVersion:=(headerArray[1] shr 3) and $3; RawHeader.LayerIdx:=(headerArray[1] shr 1) and $3; RawHeader.Protection:=(headerArray[1] and $1);

RawHeader.BitrateIdx:=(headerArray[2] shr 4) and $F; RawHeader.SamplingRateIdx:=(headerArray[2] shr 2) and $3; RawHeader.Padding:=(headerArray[2] shr 1) and $1;

RawHeader.PrivateBit:=(headerArray[2] and 1);

RawHeader.ChannelMode:=(headerArray[3] shr 6) and $3; RawHeader.ModeExt:=(headerArray[2] shr 4) and $3; RawHeader.Copyright:=(headerArray[2] shr 3) and $1; RawHeader.Original:=(headerArray[2] shr 2) and $1; RawHeader.Emphasis:=(headerArray[2] and 1);

end;

//function to get mp3 header of current pos

function getMP3Header(filename: string; pos: Integer): TMP3HeaderArray; var

filemp3: File;

headerArray: TMP3HeaderArray; count: integer;

begin

if FileExists(filename) then begin

AssignFile(filemp3, filename); FileMode:=fmOpenRead;

Reset(filemp3,1); seek(filemp3, pos);

BlockRead(filemp3, headerArray, 4, count); Result:=headerArray;

//function to find frame size

function frameSize(headerArray: TMP3HeaderArray): Integer; var

myRawMP3Header: TRawMP3Header; begin

(73)

ParseHeaderArray(headerArray, myRawMP3Header);

if samplingRate[myRawMP3Header.SamplingRateIdx] <> 0 then begin

Result:=trunc(((samplingPerFrame[myRawMP3Header.LayerIdx]/ 8) * (bmpeg1[myRawMP3Header.BitrateIdx][myRawMP3Header.LayerIdx] * 1000))/(samplingRate[myRawMP3Header.SamplingRateIdx] +

myRawMP3Header.Padding)); end;

end;

//function to check whether an mp3 is VBR or not function isVBR(filename: string): Boolean;

var

if FileExists(filename) then begin

AssignFile(filemp3, filename); FileMode:=fmOpenRead;

Reset(filemp3,1);

pos:=FindFirstHeader(filename); seek(filemp3, pos);

BlockRead(filemp3, buf, 255, count); for n := 0 to 251 do

//function to check if certain position is first frame

function isFirstFrame(filename: string; framePos: Integer): Boolean; begin

Result := (framePos = FindFirstHeader(filename)); end;

//function to check if a frame contain secret data

function isWaterm(filename: string; framePos: Integer): Boolean; var

filemp3: File;

(74)

Result:=False;

if FileExists(filename) then begin

AssignFile(filemp3, filename); FileMode:=fmOpenRead;

Reset(filemp3,1);

//function to check if a frame is able to be stegged

function isAvailableToWaterm(filename: string; framePos: Integer; length: Integer): Boolean;

var

pos, i : Integer;

buf: array[0..254] of byte; available: Boolean;

filemp3lagi: TFileStream; begin

//

available:=False; Result:=available;

if FileExists(filename) then begin

filemp3lagi:=TfileStream.Create(filename, fmOpenRead or fmShareDenyNone);

pos:=framePos;

filemp3lagi.seek(pos, soFromBeginning); filemp3lagi.Read(buf, length);

(75)

end;

//function to count num. of frame

function FrameCount(filename: string): Integer; var

pos, posNext, count: Integer; frameHeader: TMP3HeaderArray; begin

Result := -1;

pos:=FindFirstHeader(filename);

frameHeader:=getMP3Header(filename, pos); count:=1;

posNext:=pos;

while posNext<>-1 do begin

count:=count+1;

posNext:=FindNextFrame(filename, posNext, frameHeader); if posNext<>-1 then

frameHeader:=getMP3Header(filename, posNext) end;

Result := count; end;

//function to count num. of frame available for stegano data

function FrameAvailableToWatermCount(filename: string; length: Integer): Integer;

var

pos, posNext, count: Integer; frameHeader: TMP3HeaderArray; begin

Result := -1;

pos:=FindFirstHeader(filename);

frameHeader:=getMP3Header(filename, pos); count:=0;

posNext:=pos;

while posNext<>-1 do begin

if (isAvailableToWaterm(filename, posNext+36, length)) then begin

count:=count+1; end;

posNext:=FindNextFrame(filename, posNext, frameHeader); if posNext<>-1 then

frameHeader:=getMP3Header(filename, posNext); end;

Result := count-1; end;

(76)

function MaxWatermSize(filename: string; length: Integer): Integer; var

pos, posNext, count: Integer; frameHeader: TMP3HeaderArray; firsttime: Boolean;

begin

Result := -1; firsttime:=True;

pos:=FindFirstHeader(filename);

frameHeader:=getMP3Header(filename, pos); count:=0;

posNext:=pos;

while (posNext<>-1) do begin

pos:=posNext+36;

posNext:=FindNextFrame(filename, posNext, frameHeader); if (posNext<>-1) then

frameHeader:=getMP3Header(filename, posNext);

if ((isAvailableToWaterm(filename, pos, length)) AND (posNext<>-1) AND (not firsttime)) then

begin

//function to find VBR bit position

function VBRPos(filename: string): Integer; var

if FileExists(filename) then begin

AssignFile(filemp3, filename); FileMode:=fmOpenRead;

Reset(filemp3,1);

pos:=FindFirstHeader(filename); seek(filemp3, pos);

(77)

begin exit; end; end;

//funnction to hide file inside mp3

function HideFile(mp3File:string; hiddenFile: string; resultFile: string; length: Integer): Boolean;

var

posmp3, poshidden, posmp3old, n, m, posNext, len, i: Integer; buff1: byte;

firsttime, available: Boolean; key: string;

streamHidden, streamHasil: TFileStream; begin

//

Result:=False; firsttime:= True;

if (FileSize(hiddenFile)>MaxWatermSize(mp3File, length)) then begin

//exceed max size exit;

end;

CopyFile(PAnsiChar(mp3file), PAnsiChar(resultFile), False);

//create 'key' (size and extension)

key:=inttostr(FileSize(hiddenFile))+'#'+extractFileExt( hiddenFile);

len:=strlen(PAnsiChar(key));

//open result file

streamHasil:=TFileStream.Create(resultFile, fmOpenReadWrite or fmShareDenyNone);

posmp3:=FindFirstHeader(resultFile); posmp3old:=posmp3;

posNext:=FindNextFrame(resultFile, posmp3, getMP3Header(resultFile, posmp3));

streamHasil.Seek(posmp3, soFromBeginning);

//open 'to-be-hidden' file

streamHidden:=TfileStream.Create(hiddenFile, fmOpenRead or fmShareDenyNone);

poshidden:=0;

streamHidden.Seek(poshidden, soFromBeginning);

n:=0;

posmp3:=posmp3+40;

m:=streamHidden.Size;

//loop until all hidden file readed while (n<m) do

begin

poshidden:=n;

Gambar

Gambar 2.1 Sampling sinyal kontinu.
Tabel 2.1 Nilai Bit Rate pada MPEG
Table 2.2 Nilai Sampling MPEG
Gambar 2.2 Perancangan Sistem Watermarking
+7

Referensi

Dokumen terkait

Berapa dosis penambahan Zink Sulfat Heptahidrat dalam pupuk urea yang tepat, sehingga dapat berpengaruh terhadap kadar zink dalam beras dan hasil padi varietas

Hasil pengujian menunjukkan bahwa aplikasi dapat berjalan sesuai dengan yang direncanakan khususnya fitur-fitur yang ditambahkan seperti fitur untuk mengganti warna

Langkah tersebut diambil Umar bin Khattab radiallahu anh agar unta yang akan diserahkan tidak menjadi hewan ternak yang hanya akan mati pada masa itu

dengan tidak adanya pertumbuhan koloni mikroba adalah KBM dari obat. terhadap bakteri uji

Pengembangan kelapa sawit antara lain memberi manfaat dalam peningkatan pendapatan petani dan masyarakat (petani kelapa sawit dapat memiliki pendapatan sekitar Rp. 6 juta per

Pada tabel 68 menunjukkan sarana kesehatan dengan kemampuan Pelayanan Gawat Darurat Level I selama tahun 2015 sebesar 50% dari jumlah sarana kesehatan yang

Dalam strategi pendistribusian, BAZNAS Kota Tangerang selatan melakukan penetapan strategi dengan menyusun kekuatan dan kelemahan internal melalui RAKER, Implementasi

Maksud dari penelitian ini adalah untuk menggambarkan sejauh mana ketelitian hasil pengukuran kekuatan tanah yang diperoleh dengan menggunakan alat Dynamic