Perbandingan Keamanan Algoritma Kriptografi Klasik Berlapis dengan Algoritma Kriptografi Modern Sederhana Bobby H. Suryanaga - 13508022 Program Studi Teknik Informatika Sekolah Teknik Elektro dan Informatika Institut Teknologi Bandung, Jl. Ganesha 10 Bandung 40132, Indonesia 1 if18022@if.itb.ac.id
Abstraksi— Enkripsi teks secara umum dapat dilakukan dengan menggunakan dua jenis algoritma, yaitu algoritma kriptografi klasik yang melakukan enkripsi teks dengan enkripsi tiap karakter, dan algoritma kriptografi modern yang melakukan enkripsi pada bit-bit dari plaintext. Algoritma kriptografi klasik tentu saja lebih sederhana bila dibandingkan dengan algoritma kriptografi modern. Namun, dengan adanya teknologi komputer, algoritma enkripsi klasik dapat menjadi lebih sulit dipecahkan dengan adanya penggantian karakter yang lebih luas dengan menggunakan mode extended (ASCII). Pada makalah ini akan dijelaskan mengenai beberapa algoritma kriptografi klasik dan algoritma kriptografi modern. Algoritma kriptografi klasik akan dilakukan secara berlapis dan dengan teknik memodifikasi kunci yang digunakan sehingga kunci tidak mudah ditebak. Perbandingan dilakukan dengan berbagai jenis algoritma kriptografi modern. Kata kunci—algoritma kriptografi klasik dengan modifikasi kunci, algoritma kriptografi modern sederhana, perbandingan keamanan, statistik.
I. PENDAHULUAN Pada saat ini, informasi dapat menyebar dengan begitu cepat dan mudahnya dengan mendunianya teknologi internet. Sering kali informasi pribadi seseorang, seperti nomor telepon, alamat, gambar dan video pribadi, diketahui dan didapatkan oleh orang lain dan digunakan tidak semestinya, seperti untuk melakukan penipuan, penyebaran informasi pribadi, dan lain-lain. Untuk itu pengenkripsian data menjadi sangat penting untuk melindungi data-data pribadi. Enkripsi merupakan proses mengubah informasi (sering disebut plaintext) menggunakan suatu algoritma dengan suatu kunci tertentu untuk membuatnya tidak dapat dibaca (ciphertext). Hanya orang yang mengetahui kunci tersebut yang dapat mengembalikan (dekripsi) teks yang tidak terbaca tersebut dengan sebuah algoritma ke bentuk yang dapat terbaca lagi seperti semula. Enkripsi telah lama digunakan militer dan pemerintah untuk mengirim pesan dan berkomunikasi secara rahasia. Enkripsi merakyat dengan berkembangnya komputer Makalah IF3058 Kriptografi – Sem. II Tahun 2010/2011
sehingga diperlukan cara untuk melindungi data-data yang terdapat dalam komputer dari orang lain. Enkripsi menjadi bagian yang sangat penting dalam transaksi jual beli dalam jaringan. Data-data yang dikirimkan dalam transaksi dalam jaringan seperti nomor kartu kredit harus dienkripsi untuk mencegah pencurian data tersebut.
II. ALGORITMA KRIPTOGRAFI KLASIK Algoritma kriptografi klasik pada dasarnya mengimplementasikan substitusi, yaitu mengganti suatu elemen pada plaintext menjadi elemen yang terdapat pada ciphertext, dan transposisi, yaitu mengubah urutan kemunculan elemen plaintext. Salah satu algoritma enkripsi klasik yang ditemukan paling awal adalah Caesar Cipher. Caesar Cipher menggunakan prinsip substitusi. Pada Caesar Cipher, setiap karakter digantikan oleh 3 karakter sebelumnya pada abjad alphabet. Algoritma versi umum dari Caesar Cipher adalah sebagai berikut: C = E( k, p ) = (p + k) mod 26 C : karakter hasil enkripsi dengan representasi bilangan (a = 0, b = 1, dst.) p: karakter plaintext yang dienkripsi dengan representasi bilangan k: jumlah pergeseran yang digunakan Algoritma dekripsinya adalah sebagai berikut: p = D( k, C ) = (C - k) mod 26 Pengembangan algoritma kriptografi yang menggunakan substitusi adalah monoalphabetic cipher, yaitu penggantian tiap karakter dari plaintext menggunakan kunci dengan urutan karakter yang random. Algoritma ini memerlukan kunci sepanjang 26 karakter pengganti a sampai z. Algoritma substitusi lainnya contohnya cipher substitusi homofonik, cipher abjad majemuk, cipher substitusi poligram. Pada cipher substitusi homofonik Setiap huruf plainteks dipetakan ke dalam salah satu huruf cipherteks yang mungkin. Fungsi ciphering memetakan satu-ke-
banyak (one-to-many). Tujuannya adalah untuk menyembunyikan hubungan statistik antara plainteks dengan cipherteks.[1] Pada cipher abjad majemuk, setiap huruf menggunakan kunci berbeda. Cipher abjad-majemuk dibuat dari sejumlah cipher abjad-tunggal, masing-masing dengan kunci yang berbeda. [1] Pada cipher substitusi poligram, blok huruf plainteks disubstitusi dengan blok cipherteks. Misalnya AS diganti dengan RT, BY diganti dengan SL Jika unit huruf plainteks/cipherteks panjangnya 2 huruf, maka ia disebut digram (biigram), jika 3 huruf disebut ternari-gram, dst. Tujuannya adalah distribusi kemunculan poligram menjadi flat (datar), dan hal ini menyulitkan analisis frekuensi.Contoh algoritma kriptografi cipher substitusi poligram adalah playfair cipher.[1] Dari semua algoritma kriptografi klasik tersebut, yang akan dipakai dalam pembuatan algoritma kriptografi klasik berlapis pada makalah ini adalah cipher abjad majemuk dalam bentuk Vigenere Cipher dan cipher transposisi. Pada algoritma enkripsi Vigenere Cipher, ciphertext dienkripsi menggunakan sebuah kunci berjenis string. Setiap karakter pada plaintext dienkripsi berdasarkan urutan karakter pada kunci. Bila kunci lebih pendek dari plaintext, kunci akan diulang. Rumus penghitungan karakter hasil ciphertext adalah sebagai berikut. C = P + K mod 26 C: karakter pada ciphertext dalam representasi integer P: karakter pada plaintext dalam representasi integer K: karakter pada kunci dalam representasi integer Dalam makalah ini Vigenere yang digunakan adalah versi extended sehingga rumusnya menjadi C = P + K mod 256
Chaining (CBC), Cipher Feedback (CFB), Output Feedback (OFB). Pada ECB, setiap blok plainteks Pi dienkripsi secara individual dan independen menjadi blok cipherteks Ci . [2] Enkripsi: Ci = EK(Pi) Dekripsi: Pi = DK(Ci) Pada mode ECB, blok plainteks yang sama selalu dienkripsi menjadi blok cipherteks yang sama[2]. Kelemahan pada ECB adalah setiap blok yang sama akan menghasilkan ciphertext yang sama juga sehingga mudah diserang secara statistik. Selain itu, pihak lawan juga dapat mengelabui penerima pesan dengan memanipulasi ciphertext.[2] Pada mode ECB, setiap blok cipherteks bergantung tidak hanya pada blok plainteksnya tetapi juga pada seluruh blok plainteks sebelumnya, hasil enkripsi blok sebelumnya di-umpan-balikkan ke dalam enkripsi blok yang current.[2] Kelemahan mode CBC adalah kesalahan satu bit pada sebuah blok plainteks akan merambat pada blok cipherteks yang berkoresponden dan semua blok cipherteks berikutnya. Tetapi, hal ini berkebalikan pada proses dekripsi. Kesalahan satu bit pada blok cipherteks hanya mempengaruhi blok plainteks yang berkoresponden dan satu bit pada blok plainteks berikutnya (pada posisi bit yang berkoresponden pula). [2] Pada CFB, Data dienkripsikan dalam unit yang lebih kecil daripada ukuran blok. Unit yang dienkripsikan dapat berupa bit per bit (jadi seperti cipher aliran), 2 bit, 3-bit, dan seterusnya.[2] Mode OFB mirip dengan mode CFB, kecuali n-bit dari hasil enkripsi terhadap antrian disalin menjadi elemen posisi paling kanan di antrian. Dekripsi dilakukan sebagai kebalikan dari proses enkripsi.[2]
III. ALGORITMA KRIPROGRAFI MODERN Perkembangan algoritma kriptografi modern didorong oleh berkembangnya komputer digital. Algoritma kriptografi modern beroperasi pada level bit (biner). Kebanyakan algoritma kriptografi modern menggunakan operasi XOR dalam melakukan enkripsinya karena pada operasi XOR dapat diketahui kembali sumber bit yang dioperasikan bila hasil operasi dan sebuah bit sumber operasi (kunci) diketahui. Enkripsi: C = P K Dekripsi: P = C K Secara umum, algoritma kriptografi berbasis bit dibagi menjadi 2, cipher aliran (stream cipher) dan cipher blok (block cipher). Pada cipher aliran, algoritma beroperasi pada bit tunggal dan proses enkripsi dan dekripsi dilakukan secara bit per bit. Pada cipher blok, algoritma beroperasi pada blok bit dan proses enkripsi dan dekripsi dilakukan blok per blok. Pada makalah ini, perbandingan akan dilakukan dengan algoritma kriptografi modern berjenis cipher block. Algoritma kriptografi modern cipher block ada 4 mode, yaitu: Electronic Code Book (ECB), Cipher Block Makalah IF3058 Kriptografi – Sem. II Tahun 2010/2011
IV. ALGORITMA KRIPTOGRAFI KLASIK BERLAPIS DENGAN MODIFIKASI KUNCI A. Enkripsi Algoritma kriptografi klasik yang akan dipakai pada pembuatan algoritma kriptografi klasik berlapis dengan modifikasi kunci pada makalah ini adalah algoritma vigenere cipher. Pemilihan algoritma Vigenere Cipher karena memiliki kunci yang mudah diingat dan pemodifikasian kunci dapat dilakukan dengan beragam. Selain itu algoritma Vigenere Cipher juga tidak membutuhkan kunci yang panjang, menghasilkan ciphertext yang panjangnya sama dengan plaintext, dan mudah diimplementasikan dalam mode extended (ASCII). Algoritma ini terdiri dari 3 tahap enkripsi. Tahap pertama dan kedua mengaplikasikan algoritma cipher substitusi dalam bentuk algoritma Vigenere Cipher. Tahap ketiga mengaplikasikan cipher transposisi. Tahap pertama merupakan enkripsi dengan algoritma Vigenere Cipher biasa dalam mode extended dengan pengulangan
kunci. Pada tahap kedua, dilakukan enkripsi dengan algoritma Vigenere Cipher, tetapi kali ini dengan modifikasi kunci. Ciphertext yang dihasilkan dari tahap pertama dipecahpecah menjadi blok-blok teks dengan panjang sama dengan panjang kunci. Kemudian blok pertama dienkripsi menggunakan algoritma Vigenere Cipher dengan kunci semula. Namun, pada blok kedua, teks dienkripsi dengan algoritma Vigenere Cipher menggunakan kunci yang berasal dari hasil enkripsi blok pertama. Begitu juga dengan blok ketiga yang dienkripsi menggunakan hasil enkripsi dari blok kedua dan seterusnya. Pada tahap ketiga dilakukan transposisi pada setiap blok yang dihasilkan pada tahap kedua. Transposisi dilakukan dengan menggeser karakter pada blok sebanyak nilai integer dari ASCII pada kunci dimodulo dengan panjang dari kunci tersebut ke arah kiri. Pada blok terakhir, jumlah pergeseran mungkin lebih besar dari panjang blok tersebut. Jika hal tersebut terjadi, pergeseran yang dilakukan tidaklah sebanyak jumlah pergeseran seperti pada blok lainnya, melainkan jumlah pergeseran yang dilakukan sebanyak jumlah pergeseran pada blok lain dimodulo dengan panjang dari blok tersebut. Terakhir, ciphertext dapat dihasilkan dengan menggabung semua karakter yang terdapat pada blokblok yang dihasilkan pada tahap ketiga. Berikut ini adalah pseudo-code dari algoritma kriptografi klasik berlapis dengan modifikasi kunci yang digunakan. function EncryptVigenere(array of byte B, array of byte Key) array of byte {menghasilkan ciphertext dari plaintext B dengan kunci Key menggunakan algoritma Vigenere Cipher dengan pengulangan kunci, Masukan: B, Key} Deklarasi: result: array of byte i, temp:integer Algoritma: for i 0 to B.Length – 1 do temp B[i] + (int)(Key[(i mod K.Length)]) result[i] (byte)(temp mod 256) endfor result function MainEncryptAlgorithm(array of byte Plain, array of byte Key)array of byte {menghasilkan ciphertext dari plaintext Plain dengan kunci Key menggunakan algoritma kriptografi klasik berlapis. Masukan: Plain, Key} Deklarasi: s, temp, temp2: array of array of byte
Makalah IF3058 Kriptografi – Sem. II Tahun 2010/2011
result: array of byte i, j, k, N: integer Algoritma: s ByteToListOfByte(EncryptVigenere(Plain , Key),Key.Length) for i 0 to s.Count - 1 do if (i = 0) temp[i] EncryptVigenere(s[i], Key) else temp[i] EncryptVigenere(s[i], temp[i-1]) endif endfor N 0 for i 0 to Key.Length – 1 do N N + (int)(Key[i]) endfor N N mod Key.Length for i 0 to temp.Count – 1 do temp2[i] transpose(N, temp[i]) endfor k 0 for i 0 to temp2.Count – 1 do for j 0 to temp2[i].Length – 1 do result[k] temp2[i][j] k k + 1 endfor endfor result {NB: fungsi ByteToListOfByte dan transpose disediakan pada lampiran dalam bahasa C#.}
Berikut ini adalah diagram dari proses enkripsi.
menggunakan algoritma pendekripsian Vigenere Cipher dengan kunci blok sebelumnya. Tahap pendekripsian untuk ciphertext dengan jumlah blok n adalah dengan iterasi dari blok n hingga blok pertama dengan kunci setiap blok merupakan blok yang akan didekripsi setelahnya atau blok sebelum blok tersebut pada urutan blok ciphertext. Blok pertama didekripsi menggunakan kunci yang diberikan. Tahap ketiga, gabungkan semua blok yang didapatkan dari tahap kedua menjadi sebuah teks sepanjang plaintext semula. Kemudian lakukan pendekripsian dengan algoritma dekripsi Vigenere Cipher sehingga didapatkan plaintext hasil akhir dekripsi. Berikut ini adalah pseudo code dari algoritma dekripsi di atas. function DecryptVigenere(array of byte B, array of byte Key) array of byte {menghasilkan plaintext dari ciphertext B dengan kunci Key menggunakan algoritma Vigenere Cipher dengan pengulangan kunci, Masukan: B, Key} Deklarasi: result: array of byte i, n:integer Algoritma: for i 0 to B.Length – 1 do if ((int)(B[i]) < (int)(key[(i mod Key.Length)])) n (int)(B[i]) + 256 (int)(key[(i mod Key.Length)]) else n (int)(B[i]) - (int)(key[(i mod Key.Length)]) endif result[i] (byte)n endfor result
Gambar 1. Diagram proses enkripsi
B. Dekripsi Pendekripsian ciphertext yang dienkripsi menggunakan algoritma kriptografi klasik berlapis dengan modifikasi kunci pada poin A memiliki tahap yang serupa dengan algoritma enkripsinya namun dalam urutan yang dibalik. Pertama-tama ciphertext dikelompokkan menjadi blokblok dengan panjang sama dengan panjang kunci. Kemudian dilakukan penghitungan pergeseran yang akan dilakukan dari masukan kunci. Setiap blok digeser sebanyak hasil perhitungan tadi ke arah kanan. Sama seperti pada proses enkripsi, blok terakhir digeser ke arah kanan sebanyak hasil perhitungan dimodulo dengan panjang blok bila panjang blok lebih kecil dari hasil perhitungan jumlah pergeseran. Pada tahap kedua, dilakukan iterasi blok-blok dari belakang untuk didekripsi. Pendekripsian dilakukan Makalah IF3058 Kriptografi – Sem. II Tahun 2010/2011
function MainDecryptAlgorithm(array of byte Ciphertext, array of byte Key)array of byte {menghasilkan plaintext dari Ciphertext dengan kunci Key menggunakan algoritma kriptografi klasik berlapis. Masukan: Ciphertext, Key} Deklarasi: s, temp, temp2, temp3: array of array of byte result: array of byte i, j, k, N: integer Algoritma: s ByteToListOfByte(Ciphertext, Key.Length) N 0 for i 0 to Key.Length 1 do N N + (int)(Key[i]) endfor N N mod Key.Length
for i 0 to s.Count - 1 do temp[i] transpose(-N, s[i])) endfor i s.Count - 1 while i >= 0 do if (i = 0) temp2[i] DecryptVigenere(temp[i], Key) else temp2[i] DecryptVigenere(temp[i], temp[i - 1]) endif i i - 1 endwhile for i 0 to temp.Count - 1 do temp3[i] DecryptVigenere(temp2[i],Key) endfor k 0 for i 0 to temp3.Count - 1 do for j 0 to temp3[i].Length - 1 do result[k] temp3[i][j] k k + 1 endfor endfor result {NB: fungsi ByteToListOfByte dan transpose disediakan pada lampiran dalam bahasa C#.}
Berikut ini adalah diagram proses dekripsi.
Gambar 2. Diagram proses dekripsi
V. ANALISA PERBANDINGAN KEAMANAN Ciphertext hasil enkripsi algoritma kriptografi klasik dapat diserang dengan teknik penghitungan statistik untuk kemunculan suatu huruf dan kelompok huruf. Oleh karena itu, untuk menguji keamanan ciphertext hasil enkripsi algoritma kriptografi klasik berlapis pada bagian IV, akan digunakan serangan dengan menggunakan statistik. Plaintext yang digunakan berbahasa Inggris (terdapat pada lampiran) dienkripsi menggunakan kunci „worldmystery‟. Program yang digunakan untuk melakukan enkripsi dibuat menggunakan kakas Visual Studio 2010 dan ditulis dalam bahasa C#. Berikut ini adalah tampilan dari program yang dibut.
Makalah IF3058 Kriptografi – Sem. II Tahun 2010/2011
Gambar 3. Tampilan program enkripsi dekripsi yang dibuat
Dari hasil penghitungan frekuensi kemunculan karakter pada ciphertext (terdapat pada lampiran) didapatkan hasil sebagai berikut. ASCII Karakter Jumlah Lokasi 162 ¢ 23 54, 102, 224, 378, 527, 642, 656, 1288, 1345, 1416, 1518, 1632, 1664, 1752, 1833, 2304, 2370, 2380, 2395, 3116, 3219, 3235, 3241 163 £ 23 35, 57, 468, 645, 938, 1115, 1131, 1167, 1273, 1305, 1545, 1626, 1633, 1934, 2239, 2453, 2540, 2723, 2904, 2966, 2988, 3060, 3185 210 Ò 22 89, 133, 324, 472, 780, 1025, 1259, 1544, 1603, 1617, 1799, 1908, 2185, 2482, 2650, 2732, 2739, 2844, 2892, 2984, 3023, 3100 6 21 2, 58, 73, 450, 493, 658, 971, 1186, 1314, 1349, 1417, 1777, 2426, 2456, 2489, 2502, 2544, 2564, 2601, 2715, 2716 16 21 80, 103, 172, 218, 308, 368, 475, 506, 547, 576, 881, 1074, 1589, 1624, 1687, 1783, 1931, 1964, Makalah IF3058 Kriptografi – Sem. II Tahun 2010/2011
69
E
21
132
„
21
2114, 2199, 2572 56, 169, 225, 551, 842, 1077, 1148, 1169, 1485, 1558, 1611, 1825, 1937, 2111, 2188, 2236, 2275, 2518, 2523, 2549, 2870 22, 94, 390, 491, 591, 800, 810, 932, 1024, 1285, 1437, 1455, 1491, 1847, 2198, 2204, 2508, 2709, 3092, 3120, 3215
Tabel 1. Jumlah kemunculan karakter dalam ciphertext beserta lokasinya
Seperti tampak pada tabel, frekuensi kemunculan karakter yang paling besar adalah karakter dengan ASCII 162 (¢) ,163 (£), 210 (Ò), 6 ( [bukan -]), 16 ( ), 69 (E), 132 („). Berikut ini adalah tabel jumlah kemunculan karakter yang terbesar beserta lokasi kemunculannya (dimulai dari 0). Untuk mengetahui kesulitan pemecahan ciphertext dengan serangan statistik, akan dilihat kembali karakter pada plaintext yang menghasilkan karakter pada ciphertext tersebut. Hal tersebut akan direpresentasikan dalam tabel, lokasi menunjukkan tempat kemunculan ASCII dalam ciphertext, isi menunjukkan karakter pada lokasi tersebut di plaintext (karakter sebelum dienkripsi menjadi ASCII dengan nilai tersebut). Lokasi Isi Lokasi Isi Lokasi Isi (162) (163) (210) 54 (spasi) 35 h 89 i 102 r 57 (spasi) 133 y 224 m 468 o 324 t
378 527 642 656 1288 1345 1416 1518 1632 1664 1752 1833 2304 2370 2380 2395 3116 3219 3235 3241
r a h i (spasi) n (spasi) i e r n c l , a e t p w (spasi)
645 938 1115 1131 1167 1273 1305 1545 1626 1633 1934 2239 2453 2540 2723 2904 2966 2988 3060 3185
h (spasi) d i s (spasi) c t u y v h w n r F d m (spasi) m
472 780 1025 1259 1544 1603 1617 1799 1908 2185 2482 2650 2732 2739 2844 2892 2984 3023 3100
Lokasi (6) 2 58 73 450
Isi
Lokasi (16) 80 103 172 218
Isi
Lokasi (69) 56 169 225 551
w a y a
u n d k
o t o y s e a (spasi) (spasi) (spasi) (spasi) a u a (spasi) u a (spasi) e
Isi s s u i
493 658 971 1186 1314 1349 1417 1777 2426 2456 2489 2502 2544 2564 2601 2715 2716
i u a r o (spasi) d i (spasi) a g T r a f d i
308 368 475 506 547 576 881 1074 1589 1624 1687 1783 1931 1964 2114 2199 2572
e (spasi) s t h , (spasi) w n h e a (spasi) (spasi) b a l
842 1077 1148 1169 1485 1558 1611 1825 1937 2111 2188 2236 2275 2518 2523 2549 2870
(spasi) h (spasi) d (spasi) i m (spasi) d t o t c g a n t
Tabel 2. Karakter asal (plaintext) dari karakter yang kemunculannya terbanyak pada ciphertext
Dari tabel di atas, terlihat bahwa karakter pada plaintext yang menghasilkan karakter terbanyak pada ciphertext sangat beragam sehingga tidak dapat menggunakan statistik kemunculan huruf dalam bahasa Inggris. Peggunaan metode Kasiski juga kurang efektif karena ditemukan bahwa karakter plaintext yang sama dari suatu karakter ciphertext tidak memiliki indeks kunci yang sama.
Gambar 3. Frekuensi kemunculan huruf dalam bahasa Inggris
Dengan hasil pengamatan di atas, penghitungan frekuensi kemunculan bigraf dan trigraf juga menjadi trivial karena kemunculan karakter terbanyak pada ciphertext berasal dari karakter yang berbeda-beda pada plaintext. Jika dibandingkan dengan algoritma kriptografi modern block cipher dengan mode ECB dengan algoritma enkripsi sederhana seperti operasi XOR saja, ciphertext hasil enkripsi menggunakan algoritma kriptografi berlapis Makalah IF3058 Kriptografi – Sem. II Tahun 2010/2011
dengan modifikasi kunci di atas lebih sulit dipecahkan karena karakter yang sama belum tentu dienkripsi menjadi karakter yang sama pada ciphertext. Jika dibandingkan dengan CBC dengan algoritma enkripsi sederhana seperti operasi XOR saja, tingkat keamanan ciphertext hampir setara, namun pada penggunaan algoritma kriptografi klasik berlapis tidak diperlukan menambah plaintext jika blok tidak lengkap. Jika dibandingkan dengan CFB dan OFB dengan
algoritma enkripsi sederhana seperti operasi XOR saja, tingkat keamanan algoritma kriptografi klasik berlapis dapat disejajarkan. Namun, jika dibandingkan dengan penggunaan algoritma yang rumit pada algoritma kriptografi modern seperti algoritma Rijndael, tentu saja algoritma kriptografi klasik berlapis tidak dapat menyaingi keamanan algoritma kriptografi modern. Kelebihan algoritma kriptografi klasik berlapis di atas adalah kecepatannya dalam melakukan enkripsi dan dekripsi. Selain itu panjang kunci tidak dibatasi. Kunci dapat bekerja sebagaimana mestinya jika memiliki panjang maksimal sepanjang plaintext yang akan dienkripsi. Jika panjang kunci melebihi panjang plaintext, sisa karakter pada kunci akan tidak digunakan. Misalnya, jika kita memilki plaintext “ini plaintext”, kemudian kita memasukkan kunci “kuncikriptografiklasik”, maka kunci yang sebenarnya dipakai adalah “kuncikriptogr”, potongan kunci semula dengan panjang sama dengan panjang plaintext.
VI. KESIMPULAN Algoritma kriptografi klasik berlapis memiliki keamanan yang setara dengan algoritma kriptografi modern sederhana. Untuk kehidupan sehari-hari, algoritma kriptografi klasik sederhana sudah cukup aman untuk digunakan. Algoritma kriptografi modern dengan algoritma yang rumit seperti AES memiliki tingkat keamanan yang lebih baik dari pada algoritma kriptografi klasik berlapis dengan modifikasi kunci pada makalah ini.
VII. UCAPAN TERIMA KASIH Atas terselesaikannya makalah ini, saya mengucapkan terima kasih kepada dosen pembimbing dalam perkuliahan Kriptografi, Pak Rinaldi Munir, karena telah memberikan pengetahuan dasar yang memungkinkannya dibuatnya makalah ini.
REFERENCES [1] [2] [3] [4] [5]
Munir, Rinaldi, Algoritma Kriptografi Klasik Munir, Rinaldi, Algoritma Kriptografi Modern Munir, Rinaldi, Advanced Encryption Standard (AES) http://www.ascii.cl/htmlcodes.htm Waktu akses: 16 Maret 2011 http://www.stealthcopter.com/blog/wpcontent/uploads/2009/12/letter_freq.png Waktu akses: 18 Maret 2011
PERNYATAAN Dengan ini saya menyatakan bahwa makalah yang saya tulis ini adalah tulisan saya sendiri, bukan saduran, atau terjemahan dari makalah orang lain, dan bukan plagiasi. Bandung, 19 Maret 2011
Makalah IF3058 Kriptografi – Sem. II Tahun 2010/2011
ttd
Bobby H. Suryanaga – 13508022
Lampiran – Plaintext How The Bermuda Triangle Works The Bermuda Triangle is a strange and mysterious place in the southern Atlantic Ocean. It is roughly the shape of a triangle and it is said to have sucked planes and boats into its dark and murky waters. No one knows what happened to the planes and boats. When some enter the waters of the triangle they disappear forever. For over forty years the Bermuda Triangle has been popularly known for supposedly paranormal disappearances of boats and aircraft. This imaginary triangle, also known as devils triangle, has its three points at Miami, Puerto Rico, and Bermuda, actually, despite several factors which should contribute to higher rates of accidents in the region, the Bermuda Triangle has been found to be no more statistically dangerous than other areas of the open ocean. The popular legend of the Bermuda Triangle began with a nineteen sixty four article in the magazine Argosy that described and named the triangle. Further articles and reports in such magazines, as National Geographic and Playboy, merely repeated the legend without additional research. Many of the disappearances discussed in these articles and others did not even occur in the area of the triangle. You won‟t find it on any official map and you won‟t know when you cross the line, but according to some people, the Bermuda Triangle is a very real place where dozen of ships, planes, and people have disappeared with no good explanation. Since a magazine first coined the phrase Bermuda Triangle in nineteen sixty four, the mystery has continued to attract attention. When you dig deeper into most cases, though they‟re much less mysterious either they were never in the area to begin with, they were actually found or there‟s a reasonable explanation for their disappearance. Does this mean there‟s nothing to the claims of so many who have had odd experiences in the Bermuda Triangle, not necessarily scientists have documented deviations from, then, or min the area and have found some interesting formations on the seafloor within the Bermuda Triangles boundaries? So, for those who like to believe in it, there is plenty fuel for the fire in this article. Well, look at the facts surrounding what we do know about the area as well as some of the most commonly recited stories. Well, also explore the bizarre theories like aliens and space portals, as well as the mundane explanations. Many think of the Bermuda Triangle, also known as the devils triangle, as an imaginary area. The US board of geographic names does not recognize the Bermuda Triangle and does not maintain an official file on it however within this imaginary area many real vessels and the people aboard them have seemingly disappeared without explanation. The Bermuda Triangle is located off the southeastern coast of the United States in the Atlantic Ocean with its apexes in the vicinities of Bermuda, Miami, Florida, and San Juan, Puerto Rico. It covers roughly five hundred thousands square miles. The area may have been named after its Bermuda apex since Bermuda was once known as the isle of devils treacherous reefs that have ensnared ships sailing too close to its shores surround Bermuda and there are hundreds of ship wrecks in the waters that surround it. Ciphertext (dalam bentuk screenshot dari notepad karena beberapa karakter ASCII akan merusak tampilan jika dimasukkan ke Ms. Word) kunci: worldmystery
Makalah IF3058 Kriptografi – Sem. II Tahun 2010/2011
NB: Beberapa karakter ASCII tidak dapat ditampilkan sehingga tampak seperti spasi Hasil perhitungan frekuensi kemunculan huruf dan lokasi kemunculannya (hanya ditampilkan yang kemunculannya lebih dari 20 kali / 11 terbesar) ASCII 6 Jumlah: 21 Posisi: 2, 58, 73, 450, 493, 658, 971, 1186, 1314, 1349, 1417, 1777, 2426, 2456, 2489, 2502, 2544, 2564, 2601, 2715, 2716 ASCII 15 Jumlah: 20 Posisi: 33, 248, 265, 413, 557, 794, 915, 945, 960, 1093, 1134, 1155, 1519, 1703, 1902, 2160, 2405, 2827, 2845, 3179 ASCII 16 Jumlah: 21 Posisi: 80, 103, 172, 218, 308, 368, 475, 506, 547, 576, 881, 1074, 1589, 1624, 1687, 1783, 1931, 1964, 2114, 2199, 2572 ASCII 47 Jumlah: 20 Posisi: 4, 328, 364, 570, 1083, 1232, 1428, 1674, 1681, 1764, 2038, 2253, 2458, 2562, 2604, 2731, 2879, 2913, 2999, 3206 ASCII 69 Jumlah: 21 Posisi: 56, 169, 225, 551, 842, 1077, 1148, 1169, 1485, 1558, 1611, 1825, 1937, 2111, 2188, 2236, 2275, 2518, 2523, 2549, 2870 ASCII 132 Jumlah: 21 Posisi: 22, 94, 390, 491, 591, 800, 810, 932, 1024, 1285, 1437, 1455, 1491, 1847, 2198, 2204, 2508, 2709, 3092, 3120, 3215 ASCII 139 Jumlah: 20 Makalah IF3058 Kriptografi – Sem. II Tahun 2010/2011
Posisi: 445, 554, 574, 733, 760, 774, 1478, 1612, 1691, 1712, 2402, 2486, 2659, 2736, 2771, 2826, 2924, 2978, 3024, 3167 ASCII 162 Jumlah: 23 Posisi: 54, 102, 224, 378, 527, 642, 656, 1288, 1345, 1416, 1518, 1632, 1664, 1752, 1833, 2304, 2370, 2380, 2395, 3116, 3219, 3235, 3241 ASCII 163 Jumlah: 23 Posisi: 35, 57, 468, 645, 938, 1115, 1131, 1167, 1273, 1305, 1545, 1626, 1633, 1934, 2239, 2453, 2540, 2723, 2904, 2966, 2988, 3060, 3185 ASCII 208 Jumlah: 20 Posisi: 262, 585, 937, 990, 1033, 1085, 1103, 1126, 1323, 1336, 1613, 1963, 2045, 2234, 2308, 2363, 2897, 2962, 2982, 3173 ASCII 210 Jumlah: 22 Posisi: 89, 133, 324, 472, 780, 1025, 1259, 1544, 1603, 1617, 1799, 1908, 2185, 2482, 2650, 2732, 2739, 2844, 2892, 2984, 3023, 3100 Kode yang digunakan untuk memproses teks dalam C# using using using using
System; System.Collections.Generic; System.Linq; System.Text;
namespace ClassicCryptographyModified { class TextProcessing { public TextProcessing() { } public byte[] GetPlaintext() { return Plaintext; } public byte[] GetCiphertext() { return Ciphertext; } public void SetPlaintext(byte[] b) { Plaintext = b; } public void SetCiphertext(byte[] b) { Ciphertext = b; } public void SetPlaintext(string S) { Plaintext = StringToByte(S); } public void SetCiphertext(string S) { Ciphertext = StringToByte(S); } public void SetKey(string S) { Key = S; } private byte[] Plaintext; private byte[] Ciphertext; public string Key; public byte[] StringToByte(string S) { char[] AC = S.ToCharArray(); byte[] b = new byte[S.Length]; for (int i = 0; i < S.Length; i++) { b[i] = (byte)(AC[i]); } return b; } public string ByteToString(byte[] b) { string S = ""; for (int i = 0; i < b.Length; i++) { S += ((char)(b[i])).ToString(); } return S; } public List
ByteToListOfByte(byte[] B, int N) {
Makalah IF3058 Kriptografi – Sem. II Tahun 2010/2011
List LB = new List(); if (B.Length % N == 0) { for (int i = 0; i < (B.Length / N); i++) { byte[] b = new byte[N]; for (int j = 0; j < N; j++) { b[j] = B[i*N+j]; } LB.Add(b); } return LB; } else { for (int i = 0; i < (B.Length / N + 1); i++) { if (i != B.Length / N) { byte[] b = new byte[N]; for (int j = 0; j < N; j++) { b[j] = B[i * N + j]; } LB.Add(b); } else { int n = B.Length % N; byte[] b = new byte[n]; for (int j = 0; j < n; j++) { b[j] = B[i * N + j]; } LB.Add(b); } } return LB; } } public byte[] transpose(int N, byte[] B) { byte[] result = new byte[B.Length]; if (N > 0) { if (N < B.Length) { for (int i = N; i < B.Length; i++) { result[i - N] = B[i]; } for (int i = 0; i < N; i++) { result[B.Length - N + i] = B[i]; } return result; } else { return transpose(N % B.Length, B); }
Makalah IF3058 Kriptografi – Sem. II Tahun 2010/2011
} else if (N < 0) { if (-N < B.Length) { for (int i = - N; i < B.Length; i++) { result[i] = B[i + N]; } for (int i = 0; i < -N; i++) { result[i] = B[B.Length + N + i]; } return result; } else { return transpose(0 - (-N % B.Length), B); } } else { return B; } } public byte[] EncryptVigenere(byte[] source, string K) { byte[] hasil = new byte[source.Length]; char[] key = K.ToCharArray(); for (int i = 0; i < source.Length; i++) { int temp; temp = source[i] + key[(i % K.Length)]; hasil[i] = (byte)(temp % 256); } return hasil; } public byte[] EncryptVigenere(byte[] source, byte[] K) { byte[] hasil = new byte[source.Length]; for (int i = 0; i < source.Length; i++) { int temp; temp = source[i] + (int)(K[(i % K.Length)]); hasil[i] = (byte)(temp % 256); } return hasil; } public byte[] DecryptVigenere(byte[] source, string K) { byte[] temp = new byte[source.Length]; char[] key = K.ToCharArray(); for (int i = 0; i < source.Length; i++) { int n; if ((int)(source[i]) < (int)(key[(i % K.Length)])) { n = (int)(source[i]) + 256 - (int)(key[(i % K.Length)]); } else
Makalah IF3058 Kriptografi – Sem. II Tahun 2010/2011
{ n = (int)(source[i]) - (int)(key[(i % K.Length)]); } temp[i] = (byte)n; } return temp; } public byte[] DecryptVigenere(byte[] source, byte[] K) { byte[] temp = new byte[source.Length]; for (int i = 0; i < source.Length; i++) { int n; if ((int)(source[i]) < (int)(K[(i % K.Length)])) { n = (int)(source[i]) + 256 - (int)(K[(i % K.Length)]); } else { n = (int)(source[i]) - (int)(K[(i % K.Length)]); } temp[i] = (byte)n; } return temp; } public void MainEncryptionAlgorithm() { List s = ByteToListOfByte(EncryptVigenere(Plaintext, Key),Key.Length); List temp = new List(); for (int i = 0; i < s.Count; i++) { if (i == 0) { temp.Add(EncryptVigenere(s.ElementAt(i), Key)); } else { temp.Add(EncryptVigenere(s.ElementAt(i), temp.ElementAt(i-1))); } } List temp2 = new List(); int N = 0; for (int i = 0; i < Key.Length; i++) { N += (int)(Key[i]); } N = N % Key.Length; for (int i = 0; i < temp.Count; i++) { temp2.Add(transpose(N, temp.ElementAt(i))); } byte[] result = new byte[Plaintext.Length]; int k = 0; for (int i = 0; i < temp2.Count; i++) { for (int j = 0; j < temp2.ElementAt(i).Length; j++) { result[k] = temp2.ElementAt(i)[j]; k++; } }
Makalah IF3058 Kriptografi – Sem. II Tahun 2010/2011
Ciphertext = result; } public void MainDecryptionAlgorithm() { List s = ByteToListOfByte(Ciphertext, Key.Length); List temp = new List(); int N = 0; for (int i = 0; i < Key.Length; i++) { N += (int)(Key[i]); } N = N % Key.Length; for (int i = 0; i < s.Count; i++) { temp.Add(transpose(-N, s.ElementAt(i))); } List temp2 = new List(); for (int i = s.Count - 1; i >= 0; i--) { if (i == 0) { temp2.Add(DecryptVigenere(temp.ElementAt(i), Key)); } else { temp2.Add(DecryptVigenere(temp.ElementAt(i), temp.ElementAt(i - 1))); } } temp2.Reverse(); List temp3 = new List(); for (int i = 0; i < temp.Count; i++) { temp3.Add(DecryptVigenere(temp2.ElementAt(i),Key)); } byte[] result = new byte[Ciphertext.Length]; int k = 0; for (int i = 0; i < temp3.Count; i++) { for (int j = 0; j < temp3.ElementAt(i).Length; j++) { result[k] = temp3.ElementAt(i)[j]; k++; } } Plaintext = result; } } }
Makalah IF3058 Kriptografi – Sem. II Tahun 2010/2011