II Bab II Dasar Teori II.1 Kriptografi Kriptografi adalah ilmu dan seni untuk menjaga keamanan pesan [SCH96]. Terdapat berbagai macam definisi mengenai kriptografi, namun pada intinya kriptografi adalah teknik yang digunakan untuk menjamin keamanan pertukaran data. II.1.1 Sistem Kriptografi Untuk menjamin keamanan pertukaran data, berbagai proses dilakukan terhadap data, salah satunya adalah proses penyandian. Proses penyandian dilakukan untuk membuat data yang dikirimkan tidak dapat dimengerti oleh pihak lain selain yang memiliki akses terhadap data tersebut. Proses penyandian terdiri atas dua tahapan, yaitu: 1. Enkripsi Enkripsi merupakan proses untuk mengubah plainteks menjadi cipherteks yang tidak bisa dimengerti. Proses enkripsi biasanya dilakukan sebelum pesan dikirimkan. Untuk meningkatkan keamanan enkripsi pesan, pada proses enkripsi ditambahkan kunci yang juga diperlukan untuk proses dekripsi, seperti pada Gambar II-1.
Gambar II-1 Proses Enkripsi Dengan Kunci
2. Dekripsi Dekripsi merupakan proses untuk mengubah cipherteks kembali menjadi plainteks agar pesan dapat dimengerti. Proses dekripsi biasanya dilakukan oleh penerima pesan agar pesan yang diterima dapat dimengerti. Untuk proses enkripsi yang menggunakan kunci maka proses dekripsi harus dilakukan dengan menggunakan kunci, seperti pada Gambar II-2.
II-1
II-2
Gambar II-2 Proses Dekripsi Dengan Kunci
Kunci yang digunakan pada proses dekripsi dapat berbeda dengan kunci yang digunakan pada proses enkripsi, disebut juga kriptografi kunci publik. Sebaliknya, jika kunci yang digunakan sama, disebut juga kriptografi kunci simetri. II.1.2 Kriptografi Kunci Simetri Kriptografi kunci simetri menggunakan kunci yang sama untuk proses enkripsi dan dekripsi. Kunci tersebut harus ditentukan sebelumnya oleh pihak penerima dan pengirim pesan, seperti pada Gambar II-3.
Gambar II-3 Skema Kriptografi Kunci Simetri
Kelemahan dari kriptografi kunci simetri adalah kesulitan dalam pendistribusian kunci, karena pengirim dan penerima pesan harus mengetahui kunci yang sama maka kunci harus dikirimkan atau diberitahukan pada pihak lainnya. Masalah lainnya adalah pada banyaknya kunci yang harus digunakan, untuk setiap pasangan pengirim dan penerima pesan harus ada paling tidak satu buah kunci yang dapat digunakan untuk melakukan enkripsi antara mereka. II.1.3 Tipe dan Mode Algoritma Kunci Simetri Algoritma kunci simetri memiliki dua tipe yang umum digunakan, yaitu: 1. Cipher blok, yang beroperasi pada blok-blok plainteks. Ukuran blok dapat bermacammacam tergantung pada algoritma enkripsi yang digunakan, biasanya berkisar antara 64 atau 128 bit. Hasil enkripsi dari suatu plainteks yang sama, akan menghasilkan cipherteks yang sama.
II-3
2. Cipher aliran, yang beroperasi pada aliran plainteks satu bit atau byte setiap waktu. Hasil enkripsi dari suatu plainteks yang sama belum tentu menghasilkan cipherteks yang sama. Algoritma yang menggunakan prinsip cipher blok membutuhkan mekanisme tambahan karena jika plainteks yang sama menghasilkan cipherteks yang sama maka tingkat keamanan dari algoritma enkripsi menjadi rendah. Tingkatan keamanan dapat diperbaiki dengan adanya berbagai macam mode operasi untuk penggunaan cipher blok. Mode operasi yang sering digunakan dalam algoritma cipher blok pada umumnya adalah mode operasi CBC. Pada mode operasi CBC, enkripsi dilakukan dengan cara melakukan XOR pada blok plainteks dengan blok cipherteks dari blok sebelumnya, seperti pada Gambar II-4. Blok plainteks pertama akan di-XOR dengan initialization vector (IV) agar tiap pesan berbeda satu sama lain.
Gambar II-4 Enkripsi Mode Operasi CBC
Kelemahan dari mode operasi CBC jika diterapkan untuk enkripsi pesan suara adalah delay yang ditimbulkan. Delay dapat terjadi karena pada CBC setiap enkripsi dari blok pada satu pesan harus menunggu hasil cipherteks dari blok sebelumnya. Untuk mengatasi masalah delay ini, perlu digunakan mode operasi lain yang memiliki efisiensi mendekati cipher aliran agar delay yang dihasilkan kecil. Beberapa mode operasi yang diterapkan pada cipher blok dapat membuat cipher blok beroperasi seperti cipher aliran, salah satunya adalah mode operasi counter. Mode operasi counter dapat mengubah efisiensi cipher blok menjadi cipher aliran dengan membangkitkan keystream, yaitu aliran karakter yang dienkripsi kemudian digabungkan dengan plainteks
II-4
untuk membentuk cipherteks. Dalam mode operasi counter, biasanya keystream berasal dari enkripsi suatu blok counter yang dibentuk dari fungsi penghitung (’counter’). Pada mode counter, karena yang dienkripsi adalah blok counter, maka tidak perlu menunggu suatu blok selesai sebelum memulai enkripsi pada blok selanjutnya pada satu pesan. Hal inilah yang menyebabkab peningkatan efisiensi proses enkripsi karena mode operasi counter tidak benarbenar merubah cipher blok menjadi cipher aliran. Cipher blok yang digunakan akan tetap melakukan enkripsi pada blok-blok bit, namun dengan mode operasi counter kecepatannya dapat ditingkatkan. Menurut [DWO01], secara keseluruhan cara kerja enkripsi dengan mode operasi counter adalah: 1. Bangkitkan blok counter, H1, Hi, ...,Hn yang digunakan sebagai input dari cipher blok, untuk menghasilkan bit keystream KS. KSi = Ciph(Hi), i menandakan blok ke-i dalam pesan sepanjang n-blok. 2.
Bit keystream akan di-XOR dengan blok plainteks untuk menghasilkan blok cipherteks. Ci = Pi⊕KSi, dimana Ci merupakan cipherteks blok ke-i. Pi merupakan plainteks blok ke-i.
3.
Khusus untuk blok plainteks terakhir dimana panjang pesan kurang dari ukuran satu blok, maka bit keystream yang digunakan hanya sepanjang bit pesan tersebut. Cn = Pn⊕MSBi(KSn), MSBi(x) merupakan fungsi yang akan mengambil Most significant Bit (bit yang paling berpengaruh atau bernilai paling besar) sepanjang i dari x. Berdasarkan Gambar II-5, dapat dilihat bahwa proses membentuk bit keystream dapat
dilakukan secara paralel, karena tidak ada keterkaitan antara keluaran suatu proses dengan proses enkripsi pada blok selanjutnya. Bahkan, blok counter untuk proses enkripsi dapat dibangkitkan sebelum blok-blok plainteks diketahui selama fungsi counter tidak membutuhkan blok-blok plainteks sebagai masukan.
II-5
Gambar II-5 Mode Operasi Counter
Perlu diperhatikan bahwa pada mode operasi counter, setiap blok counter yang digunakan harus berbeda dengan blok yang digunakan pada proses enkripsi blok plainteks lainnya yang menggunakan kunci yang sama. Hal ini perlu dilakukan untuk menjamin kemananan hasil enkripsi. Blok counter dapat berasal dari angka acak, angka acak ini nanti akan disimpan bersama dengan cipherteks untuk proses dekripsi. Terdapat dua aspek penting yang harus dijaga untuk menjamin blok counter yang digunakan pada enkripsi dengan kunci enkripsi yang sama. Pertama, blok awal yang digunakan, H1, harus dapat memberikan blok counter yang berbeda untuk enkripsi dengan kunci yang sama. Harus dipastikan bahwa dari blok awal tersebut dapat dibangkitkan sejumlah blok counter yang cukup untuk enkripsi pesan. Kemudian, fungsi untuk increment blok tersebut juga harus menjamin bahwa blok awal dapat dibangkitkan menjadi blok counter yang berbeda untuk setiap blok plainteks dengan kunci enkripsi yang sama. Karakteristik dari mode operasi counter menyerupai mode OFB (Output Feedback), kesalahan yang terjadi pada satu bit tidak akan merambat pada bit yang lain. Hal ini merupakan properti yang penting untuk transmisi suara, karena biasanya satu bit error masih dapat ditangani. Mode operasi counter lebih menguntungkan dibandingkan OFB, karena mode OFB hanya dapat digunakan jika ukuran feedback sama dengan ukuran blok. Pada mode counter tidak masalah jika keluaran memiliki ukuran yang lebih kecil daripada panjang blok.
II-6
II.2 Pemrosesan Suara Suara yang masih berupa sinyal analog harus diproses terlebih dahulu sebelum dapat diolah oleh program komputer. Berikut akan dibahas mengenai proses digitalisasi dan kompresi suara. II.2.1.1 Digitalisasi Suara Gelombang suara analog sebelum dapat diproses oleh aplikasi dan dienkripsi harus diubah terlebih dahulu kedalam format digital dengan menggunakan sirkuit ADC (Analog Digital Converter). Karena pada saat ini semua pemrosesan suara melalui komputer menggunakan suara digital. Pada ADC, sinyal analog akan diubah menjadi digital dengan cara sampling [TOR07]. Misalnya sinyal analog diwakilkan seperti pada Gambar II-6. Sumbu
y
melambangkan Volt, yang berarti tegangan volt. Sumbu x melambangkan t, yang berarti waktu.
Gambar II-6 Sinyal Analog
Sirkuit ADC akan mengambil sample atau bagian dari sinyal analog berdasarkan waktu tertentu. Bagian-bagian tersebut kemudian akan direpresentasikan dalam angka berdasarkan tegangan volt yang dimiliki masing-masing bagian. Gambar II-7 menunjukkan contoh beberapa titik sampling yang diambil.
Gambar II-7 Contoh Sampling
II-7
Data sampling yang diambil dapat bervariasi berdasarkan ∆t yang digunakan. Jumlah sample yang diambil tiap detiknya disebut sampling rate. Semakin besar sampling rate maka data yang diperoleh akan semakin akurat namun storage yang dibutuhkan juga semakin besar. Dibutuhkan perhitungan yang tepat agar kualitas suara yang didapat baik dan storage yang dibutuhkan tidak terlalu besar. Pada tugas akhir ini, digunakan Java Application Programming Interfaces (API) yang berasal dari Java yaitu Java Sound API yang menyediakan operasi-operasi dasar pada suara seperti konversi sinyal suara analog menjadi digital. Java sound API dapat melakukan segala macam pemrosesan yang berhubungan dengan suara, termasuk menerima input suara melalui microphone dan menyimpan stream input tersebut kedalam suatu file. II.2.1.2 Kompresi Suara Data suara yang ditransmisikan jarak jauh melalui jaringan internet dan jaringan telepon selular pada umumnya
dikompresi terlebih dahulu. Kompresi dilakukan karena
terbatasnya bandwidth pengiriman data dan besarnya data suara. Kompresi suara dapat diartikan sebagai teknik modulasi dengan memanfaatkan sifat sinyal suara sehingga dapat mentransmisikan suara pembicara dengan kualitas informasi, karakteristik, dan pola sekuensial yang cukup baik dengan frequency band yang lebih sempit dari yang dibutuhkan sebenarnya [ANS07]. Inti dari kompresi suara terletak pada teknik yang digunakan agar data suara yang dikirimkan tidak menghabiskan tempat penyimpanan dan bandwidth pada saat ditransmisikan. Proses kompresi suara harus dilakukan sebelum sinyal suara tersebut ditransmisikan. Ada berbagai macam teknik untuk melakukan kompresi suara, teknik yang digunakan biasanya berkaitan dengan tingkat kompresi dan format data suara yang nantinya dihasilkan. Teknik untuk kompresi suara biasanya disebut juga pengkodean suara. Pengkodean suara pada umumnya dibagi menjadi dua jenis, yaitu algoritma lossless dan lossy. Algoritma kompresi lossy memiliki tingkat kompresi yang lebih baik dibandingkan dengan lossless, namun memiliki kualitas suara yang lebih buruk. Saat ini algoritma jenis lossy lebih banyak digunakan untuk komunikasi suara jarak jauh dibandingkan dengan algoritma lossless. Pada algoritma kompresi lossy terdapat dua macam cara untuk melakukan pengurangan bit-bit. Cara pertama dengan menghilangkan bit-bit yang mewakili suara yang
II-8
dianggap tidak dapat didengar oleh telinga manusia. Cara kedua merupakan cara yang menghasilkan banyak reduksi bit, yaitu dengan mengurangi jumlah bit yang digunakan untuk mewakili suatu sinyal suara, namun hal ini dapat menimbulkan noise. Noise pada akhirnya dapat menyebabkan kualitas suara menjadi kurang bagus. Kompresi yang dilakukan akan mengambil tipe algoritma kompresi lossy dengan menggunakan library dari JSpeex. JSpeex merupakan codec untuk kompresi suara dengan menggunakan teknik pengkodean code excited linear prediction (CELP). JSpeex dapat digunakan sebagai pelengkap dari API Java Sound yang telah disediakan oleh Java. CELP diterapkan menggunakan metode perkiraan linear. Untuk lebih jelasnya, Gambar II-8 dan Gambar II-9 akan menunjukkan langkah decoder dan encoder pada CELP.
Gambar II-8 Decoder CELP [VAL06]
Gambar II-9 Encoder CELP [VAL06]
II-9
Berdasarkan Gambar II-8, masukan dari pembangkitan suara adalah fixed codebook dan adaptive codebook. Fixed codebook biasanya langsung di hard code pada codec, pada Speex fixed codebook disimpan secara eksplisit. Tahap pengkodean pada CELP didasarkan pada Analysis by Synthesis (AbS), pengkodean dilakukan dengan cara mengoptimasi sinyal yang telah dikodekan (sintesis) dalam suatu putaran yang tertutup secara perseptual. Pada Gambar II-9, putaran tertutup tersebut diwakilkan oleh garis putus-putus.
II.3 Algoritma Twofish Twofish merupakan salah satu algoritma yang diajukan untuk mengikuti program penetapan Advanced Encryption Standard (AES) pada tahun 1997. Algoritma ini dirancang oleh Bruce Schneier. Meskipun algoritma ini tidak memenangkan program tersebut, namun tetap terdapat banyak kelebihan dari algoritma ini. II.3.1 Unsur Pembangun Algoritma Twofish Menurut [KEL98], algoritma Twofish memiliki beberapa blok pembangun, yaitu: 1. Jaringan Feistel Jaringan Feistel merupakan model komputasi berulang yang digunakan oleh banyak cipher blok. Fungsi dari model jaringan Feistel adalah untuk memetakan suatu fungsi enkripsi yang sederhana menjadi fungsi enkripsi yang rumit dan kuat. Jaringan Feistel memiiki sifat reversible, dalam konteks ini berarti dapat menggunakan fungsi enkripsi dan dekripsi yang sama tanpa perlu mengubah algoritma yang digunakan. Cukup dengan mengganti urutan kunci yang digunakan pada tiap iterasi yang dilakukan. Twofish menggunakan jaringan Feistel dengan 16 kali iterasi. Fungsi F pada jaringan feistel diterapkan pada jaringan Twofish dengan fungsi g, matriks MDS, dan perubahan pseudo hadamard. Secara umum, struktur jaringan feistel seperti pada Gambar II-10.
II-10
Gambar II-10 Enkripsi menggunakan Jaringan Feistel
Berdasarkan Gambar II-10, plainteks masukan akan dibagi menjadi dua bagian, yaitu bagian kiri, Li, dan bagian kanan, Ri. Blok pada iterasi selanjutnya diperoleh dengan rumus sebagai berikut: Li+1 = Ri Ri+1 = Li ⊕ F (Ki,Ri) , i menandakan nomor iterasi pada jaringan feistel. 2. S-box S-box merupakan matriks substitusi yang digunakan untuk memetakan bit-bit. S-box dapat bervariasi bentuk dan ukuran input output-nya. Twofish menggunakan empat Sbox yang berbeda, dengan ukuran 8x8 bit. 3. Matriks MDS Matriks MDS (maximum distance separable) adalah matriks transformasi dari sebuah kode linear. Selain blok-blok pembangun, algoritma Twofish terdiri dari beberapa proses, yaitu: 1. Perubahan pseudo-hadamard Perubahan pseudo hadamard merupakan transformasi dua arah yang menghasilkan difusi. Difusi yang dimaksudkan disini adalah properti dari operasi cipher yang dikatakan aman menurut Shannon. Arti difusi berdasarkan shannon adalah properti dimana pengulangan yang terdapat pada statistik plainteks dihilangkan dari statistik cipherteks [SHA49]. Bit masukan dari PHT harus memiliki panjang yang genap,
II-11
karena akan dibagi menjadi dua bagian yang sama panjang, masing-masing sepanjang n/2 yang dilambangkan dengan a dan b. Persamaan pseudo-hadamard adalah sebagai berikut: a’ = a + b (mod 2n)
b’ = a + 2b (mod 2n)
untuk membalikkan persamaan diatas, persamaannya adalah: b = b’ - a’ (mod 2n)
a= 2a’ – b’ (mod 2n)
dimana n adalah jumlah bit yang digunakan. 2. Whitening Whitening merupakan teknik untuk meningkatkan keamanan dari cipher blok yang menggunakan iterasi, tujuannya adalah agar input dan output dari fungsi F tidak diketahui. Whitening dilakukan dengan cara mengubah data dengan meng-XOR data dengan sebagian dari kunci sebelum iterasi pertama dan setelah iterasi terakhir dari enkripsi. Hal ini dapat mempersulit brute force attack [KEL98]. 3. Jadwal Kunci Penjadwalan kunci adalah proses mengubah kunci menjadi beberapa subkunci yang akan digunakan pada iterasi-iterasi. II.3.2 Tahapan Algoritma Twofish Selain unsur pembangun diatas, ada beberapa proses penunjang lain pada implementasi algoritma Twofish, yaitu: 1. Bit masukan sebanyak 128 bit akan dibagi menjadi empat bagian masing-masing sebesar 32 bit menggunakan konvensi little-endian. Dua bagian bit akan menjadi bagian kanan, dua bagian bit lainnya akan menjadi bagian kiri. 2. Bit input akan di-XOR terlebih dahulu dengan empat bagian kunci, atau dengan kata lain mengalami proses whitening. R0,i = Pi ⊕Ki
i = 0, ..., 3
Dimana K adalah kunci, Ki berarti sub kunci yang ke-i. 3. Seperti telah dibahas diatas, algoritma Twofish menggunakan struktur jaringan Feistel. Jaringan Feistel yang digunakan oleh Twofish terdiri dari 16 iterasi. Fungsi f dari Twofish terdiri dari beberapa tahap, yaitu: a. Fungsi g, yang terdiri dari empat s-box dan matriks MDS
II-12
b. PHT (pseudo-hadamard transform/ perubahan pseudo hadamard) c. Penambahan hasil PHT dengan kunci Blok-blok pembangun beserta karakteristik diatas, akan digunakan pada implementasi algoritma Twofish dengan tahapan seperti pada Gambar II-11.
Gambar II-11 Struktur Algoritma Twofish
Tahapan-tahapan pada algoritma Twofish lebih jelasnya adalah sebagai berikut: 1. Bit masukan disebut sebagai P0, P1, P2, dan P3, P0 dan P1 akan menjadi bagian kiri, dua lainnya akan menjadi masukan pada bagian kanan. 2. Kemudian akan melalui proses whitening. 3. Bagian kiri akan menjadi masukan untuk fungsi f, P0 akan langsung menjadi masukan bagi fungsi g, sementara P1 akan di-rotate 8-bit sebelum diproses oleh fungsi g . 4. Didalam fungsi g, bit-bit tersebut akan melalui S-box dan matriks MDS, kemudian kedua keluaran akan digabungkan oleh PHT. 5. Setelah melalui PHT, kedua bagian tersebut akan ditambah dengan bagian dari kunci sesuai dengan iterasi yang telah dilewati. Untuk keluaran dari fungsi f dengan input P0 akan ditambah dengan K2r+8. Untuk keluaran dari fungsi f dengan input P1 akan ditambah dengan K2r+9, dimana r adalah jumlah iterasi yang telah dilewati. Masing-
II-13
masing ditambah delapan dan sembilan karena delapan urutan awal sudah digunakan untuk whitening input dan output. 6. Keluaran dari fungsi f dengan input P0 akan di-XOR dengan P2, kemudian hasil XOR tersebut akan di-rotate 1-bit. 7. Keluaran dari fungsi f dengan input P1 akan di-XOR dengan P3, namun P3 sebelumnya di-rotate 1-bit terlebih dahulu. 8. Setelah perhitungan bit selesai, bagian kanan yang telah dihitung tadi akan menjadi bagian kiri dan bagian kiri yang belum dihitung akan menjadi bagian kanan. 9. Kemudian setelah 16 iterasi, akan dilakukan whitening terhadap keluarannya. Whitening pada output akan meng-undo pertukaran bagian kanan dan bagian kiri pada iterasi terakhir, dan melakukan XOR data dengan 4 bagian kunci. Ci = R16,(i+2)mod 4 ⊕ Ki+4
i = 0, ..., 3
Bagian kunci yang digunakan disini berbeda dengan bagian kunci yang digunakan saat whitening pada input. Oleh karena itu urutan bagian kunci yang dipakai ditambah empat, karena empat urutan bagian kunci satu sampai empat sudah terlebih dahulu digunakan untuk whitening pada input. 10. Keempat bagian cipherteks tersebut kemudian ditulis menjadi 16 byte c0,...,c15 menggunakan konversi little-endian seperti pada plainteks.
Sampai saat ini serangan kriptanalisis terbaik yang dilakukan pada Twofish adalah pada tahun 2006. Berdasarkan serangan ini dikatakan, Twofish 16-iterasi mudah terkena serangan kriptanalisis truncated differential. Twofish dinyatakan memiliki kemungkinan truncated differential sebanyak 2-57,3 per blok dan untuk menemukan pasangan differential yang berguna, hanya dibutuhkan 251 plainteks terpilih[SCH05]. Serangan ini diklarifikasi oleh Bruce Schneier, yang menyatakan bahwa serangan tersebut bukanlah serangan kriptanalisis penuh melainkan hanya berdasarkan hipotesis karakteristik differential. Berdasarkan fakta tersebut, secara praktiknya algoritma Twofish belum terpatahkan sama sekali semenjak dipublikasikan pada tahun 2000.