Penambahan Chinese Reminder Theorem Untuk Mempercepat Proses Enkripsi Dan Dekripsi Pada RSA
PENAMBAHAN CHINESE REMINDER THEOREM UNTUK
MEMPERCEPAT PROSES ENKRIPSI DAN DEKRIPSI
PADA RSA
SKRIPSI
ANDI HAZRI HASIBUAN
100823021
DEPARTEMEN MATEMATIKA
FAKULTAS MATEMATIKA DAN ILMU PENGETAHUAN ALAM
UNIVERSITAS SUMATERA UTARA
MEDAN
2013
(2)
PENAMBAHAN CHINESE REMINDER THEOREM UNTUK MEMPERCEPAT PROSES ENKRIPSI DAN DEKRIPSI PADA RSA
SKRIPSI
Diajukan untuk melengkapi tugas dan memenuhi syarat mencapai gelar Sarjana Sains
ANDI HAZRI HASIBUAN
100823021
DEPARTEMEN MATEMATIKA
FAKULTAS MATEMATIKA DAN ILMU PENGETAHUAN ALAM
UNIVERSITAS SUMATERA UTARA
MEDAN
2013
(3)
PERSETUJUAN
Judul : PENAMBAHAN CHINESE REMINDER THEOREM
UNTUK MEMPERCEPAT PROSES ENKRIPSI DAN DEKRIPSI PADA RSA
Kategori : SKRIPSI
Nama : ANDI HAZRI HASIBUAN
Nomor Induk Mahasiswa : 100823021
Program Studi : SARJANA (S1) MATEMATIKA
Departemen : MATEMATIKA
Fakultas : MATEMATIKA DAN ILMU PENGETAHUAN
ALAM (FMIPA) UNIVERSITAS SUMATERA UTARA
Diluluskan di
Medan, September 2013
Komisi Pembimbing :
Pembimbing 2, Pembimbing 1,
Syahriol Sitorus, S.Si., M.IT. Prof. Dr. Drs. Iryanto, M.Si.
Nip. 197103101997031004 Nip. 194604041971071001
Diketahui/Disetujui oleh
Departemen Matematika FMIPA USU
Prof. Drs. Tulus, Vordipl.Math., M.Si., Ph.D Nip. 196209011988031002
(4)
PERNYATAAN
PENAMBAHAN CHINESE REMINDER THEOREM UNTUK MEMPERCEPAT
PROSES ENKRIPSI DAN DEKRIPSI PADA RSA
SKRIPSI
Saya mengakui bahwa Tugas Akhir ini adalah hasil kerja saya sendiri, kecuali beberapa kutipan dan ringkasan yang masing-masing disebutkan sumbernya.
Medan, September 2013
ANDI HAZRI HASIBUAN 100823021
(5)
PENGHARGAAN
Puji dan syukur penulis panjatkan kehadirat Allah SWT yang telah memberikan rahmat dan karunia-Nya sehingga penulis dapat menyelesaikan skripsi ini tepat pada waktunya.
Ucapan terima kasih Penulis sampaikan kepada Bapak Prof. Dr. Drs. Iryanto, M.Si, Bapak Syahriol Sitorus, S.Si., M.IT. selaku pembimbing pada penyelesaian skripsi ini yang telah memberikan panduan dan penuh kepercayaan kepada penulis. Bapak Drs. Sawaluddin, M.IT. dan Bapak Drs. Marihat Situmorang, M.Si. selaku pembanding pada skripsi ini yang telah banyak memberi semangat dan motivasi. Ucapan terima kasih juga ditujukan kepada Ketua dan Sekretaris Departemen Matematika FMIPA USU Bapak Prof. Drs. Tulus, Vordipl.Math., M.Si., Ph.D. dan Ibu Dra. Mardiningsih, M.Si., Dekan dan Pembantu Dekan FMIPA USU, semua Dosen Pengajar FMIPA USU, pegawai FMIPA USU, dan rekan-rekan Penulis kelas Ekstensi Matematika Komputasi tahun angkatan 2010.
Akhirnya, tidak terlupakan Orang Tua Penulis dan keluarga yang telah banyak memberikan bantuan dan dorongan untuk penyelesaian skripsi ini. Semoga Allah SWT membalasnya.
Medan, September 2013
(6)
ABSTRACT
Many methods are used to protect digital data stored or transmitted via electronic media. One way is to use a cryptographic algorithm RSA (Rivest-Shamir-Adleman). Standard RSA uses modular arithmetic to perform the encryption and decryption. In this thesis discussed the addition of Chinese Remainder Theorem to speed up the RSA.
(7)
ABSTRAK
Banyak cara yang digunakan untuk melindungi data digital yang disimpan ataupun dikirim melalui media elektronik. Salah satunya adalah dengan menggunakan kriptogfari algoritma RSA (Rivest-Shamir-Adleman). RSA standar menggunakan aritmatika modular untuk melakukan proses enkripsi dan dekripsinya. Dalam skripsi ini dibahas tentang penambahan Chinese Remainder Theorem untuk mempercepat proses pada RSA.
(8)
DAFTAR ISI
Halaman
Persetujuan ii
Pernyataan iii
Penghargaan iv
Abstrak v
Abstrack vi
Daftas Isi vii
Daftar Gambar ix
Bab 1 Pendahuluan 1
1.1 Latar Belakang 1
1.2 Identifikasi Masalah 3
1.3 Perumusan Masalah 3
1.4 Pembatasan Masalah 3
1.5 Tinjauan Pustaka 4
1.6 Tujuan Penelitian 5
1.7 Kontribusi Penelitian 5
1.8 Metode Penelitian 5
Bab 2 Landasan Teori 6
2.1 Sejarah Kriptografi 6
2.2 Pengertian Kriptografi 8
2.3 Konsep Kriptografi 9
2.4 Macam-macam Algortima Kriptografi 13
2.4.1 Algoritma Kriptografi Klasik 13
2.4.2 Algoritma Kriptografi Modern 14
2.5 RSA 18
2.5.1 Sejarah Singkat RSA 18
2.5.2 Cara Kerja Algoritma RSA 19
2.5.3 Pembangkitan Kunci RSA 20
2.5.4 Proses Enkripsi Pada RSA 20
2.5.5 Proses Dekripsi Pada RSA 21
2.5.6 Kelebihan dan Kelemahan RSA 22
2.6 Teori Bilangan 22
2.6.1 Sifat Habis Dibagi Pada Bilangan Bulat 22
2.6.2 Kongruensi 24
2.6.3 Bilangan Prima dan Relatif Prima 25
2.7 Chinese Remainder Theorem 25
Bab 3 Pembahasan 27
3.1 Proses Pada RSA 27
3.1.1 Pembangkitan Kunci 27
3.1.2 Proses Ekripsi 28
3.1.3 Proses Dekripsi 29
(9)
3.2.1 Pembentukan Kunci 29
3.2.2 Proses Dekripsi pada RSA-CRT 30
3.3 Perbedaan RSA dengan RSA-CRT 32
3.4 Flowchart Algoritma RSA 36
3.5 Flowchart Algoritma RSA-CRT 37
3.6 Pengujian Pada Program 38
3.6.1 Pengujian Algoritma RSA 38
3.6.2 Pengujian Algoritma RSA-CRT 39
Bab 4 Kesimpulan dan Saran 40
4.1 Kesimpulan 40
4.2 Saran 41
Daftar Pustaka 42
(10)
DAFTAR GAMBAR
Halaman
Gambar 2.1 Egyptian Hieroglyphs 6
Gambar 2.2 Proses enkripsi/dekripsi Sederhana 12
Gambar 2.3 Ilustrasi Algoritma Kriptografi Simetris 15
Gambar 2.4 Ilustrsi Algoritma Kriptografi Asimetris 17
Gambar 3.1 Bagan perbandingan RSA dengan RSA-CRT 34
Gambar 3.2 Bagan contoh perbandingan RSA dengan RSA-CRT 35
Gambar 3.3 Flowchart Algoritma RSA 36
Gambar 3.4 Flowchart Algoritma RSA-CRT 37
Gambar 3.5 Proses Enkripsi dan Dekripsi RSA dengan Java 38
(11)
DAFTAR TABEL
Halaman
Tabel 2.1 Simbol-simbol Data Flow Diagram 11
Tabel 2.2 Simbol-simbol Flowchart 12
Tabel 4.1 Tabel Admin 52
Tabel 4.2 Tabel Siswa 52
Tabel 4.3 Tabel Nilai 53
Tabel 4.4 Tabel Guru 54
Tabel 4.5 Tabel Buku Tamu 54
Tabel 4.6 Tabel Informasi Akademik 55
(12)
ABSTRACT
Many methods are used to protect digital data stored or transmitted via electronic media. One way is to use a cryptographic algorithm RSA (Rivest-Shamir-Adleman). Standard RSA uses modular arithmetic to perform the encryption and decryption. In this thesis discussed the addition of Chinese Remainder Theorem to speed up the RSA.
(13)
ABSTRAK
Banyak cara yang digunakan untuk melindungi data digital yang disimpan ataupun dikirim melalui media elektronik. Salah satunya adalah dengan menggunakan kriptogfari algoritma RSA (Rivest-Shamir-Adleman). RSA standar menggunakan aritmatika modular untuk melakukan proses enkripsi dan dekripsinya. Dalam skripsi ini dibahas tentang penambahan Chinese Remainder Theorem untuk mempercepat proses pada RSA.
(14)
BAB 1
PENDAHULUAN
1.1 Latar Belakang
Perkembangan teknologi memberi pengaruh besar bagi segala aspek kehidupan. Begitu banyak manfaat teknologi tersebut yang dapat diimplementasikan dalam kehidupan. Teknologi saat ini telah memberikan kemudahan dalam penyampaian suatu informasi. Pada umumnya untuk menyampaikan suatu informasi melalui surat atau berkomunikasi melalui telepon, namun sekarang proses pengiriman informasi berupa pesan dapat dilakukan melalui teknologi internet.
Seiring dengan berkembangnya teknologi yang memberikan kemudahan, khususnya komputer, juga membawa dampak negatip dalam pengiriman pesan itu sendiri. Hal ini dapat disebabkan karena adanya suatu serangan dari pihak yang tidak berhak untuk mendapatkan isi pesan tersebut dengan menggunakan berbagai cara, sehingga dapat merugikan pengirim pesan tersebut.
Dalam komunikasi data terdapat sebuah metode pengamanan data yang dikenal dengan nama kriptografi. Kriptografi merupakan salah satu metode pengamanan data yang dapat digunakan untuk menjaga kerahasiaan data, keaslian data serta keaslian pengirim data. Metode ini bertujuan agar informasi yang bersifat rahasia yang dikirim melalui telekomunikasi umum seperti internet, tidak dapat diketahui atau dimanfaatkan oleh orang yang tidak berkepentingan atau orang yang tidak berhak menerimanya.
Salah satu algoritma kriptografi yang popular saat ini adalah RSA. RSA merupakan algoritma kunci publik yang dikembangkan oleh Rivest-Shamir-Adleman. RSA merupakan salah satu jenis algoritma dalam sistem kriptografi kunci-publik, atau
(15)
dikenal juga dengan kriptografi asimetris dimana pengguna memiliki pasangan kunci kriptografi yaitu kunci publik dan kunci privat. Kunci privat dirahasiakan, sedangkan kunci publik dapat disebarluaskan.
Keamanan algoritma RSA terletak pada sulitnya memfaktorkan bilangan yang besar menjadi faktor-faktor primanya. Pemfaktoran dilakukan untuk memperoleh kunci privat yang digunakan untuk mendekripsi cipherteks. Selama belum ditemukan algoritma yang efisien untuk pemfaktoran bilangan besar menjadi faktor-faktor primanya, maka keamanan algoritma RSA tetap terjamin. Salah satu kelemahan RSA yang paling signifikan adalah kecepatannya. RSA adalah algoritma kriptografi yang lambat karena proses komputasinya yang melibatkan bilangan-bilangan besar. Oleh karena itu, pada prakteknya RSA biasanya hanya digunakan untuk mengenkripsi kunci dari algoritma kriptografi kunci simetri dan untuk tandatangan digital. (Aditya, 2010)
Penulis akan mencoba memodifikasi algoritma RSA menggunakan Chinese
Remainder Theorem (CRT) untuk mempercepat proses enkripsi dan dekripsi. CRT merupakan teorema dalam aritmatika modulo yang akan digunakan dalam melakukan operasi modulo pada proses enkripsi dan dekripsi. Berdasarkan penjelasan tersebut,
penulis tertarik untuk melakukan penelitian dengan judul: “PENAMBAHAN
CHINESE REMINDER THEOREM UNTUK MEMPERCEPAT PROSES ENKRIPSI DAN DEKRIPSI PADA RSA”.
1.2 Identifikasi Masalah
Masalah yang menjadi dasar penelitian ini adalah proses komputasi yang lambat pada dekripsi algoritma RSA. Kelambatan proses ini diakibatkan proses komputasi yang melibatkan bilangan-bilangan eksponen dan modulo yang besar pada algortima RSA. Untuk mengatasai masalah tersebut, penulis mencoba memodifikasi algoritma RSA
(16)
1.3 Perumusan Masalah
Berdasarkan identifikasi masalah di atas, yang menjadi rumusan masalah pada penelitian ini adalah bagaimana cara menggunakan Chinese Reminder Theorem (CRT) untuk mempercepat proses dekripsi pada algoritma RSA.
1.4 Pembatasan Masalah
Didalam mengkaji suatu permasalahan diperlukan suatu pembatasan agar pengkajiannya lebih terarah. Dalam hal ini, batasan masalahnya adalah sebagai berikut:
1. Sistem pengamanan data atau kriptografi memiliki cakupan yang luas, oleh karena itu dalam tulisan ini dibatasi hanya menguraikan kriptografi algoritma RSA.
2. Modifikasi RSA hanya dengan penambahan Chinese Reminder Theorem.
3. Character yang digunakan dalam proses enkripsi adalah character ASCII.
1.5Tinjauan Pustaka
Dalam tulisan ini penulis memanfaatkan buku-buku, internet, dan jurnal yang dapat dipergunakan untuk menjelaskan teori-teori pemecahan masalah atau dasar pemikiran untuk menjelaskan masalah yang dibahas.
(Dony Ariyus, 2009) dalam bukunya “Keamanan Multimedia”, kriptografi adalah ilmu dan seni untuk menjaga keamanan pesan ketika pesan dikirim dari suatu tempat ke tempat yang lain.
(17)
(Rinaldi Munir, 2006) dalam bukunya “Kriptografi”, menerangkan bahwa
kriptografi bertujuan untuk memberi layanan keamanan yang dimaksud sebagai aspek-aspek keamanan yaitu : Kerahasiaan (confidentiality), Integritas Data (Data Integrity), Otentikasi (Authentication) dan Nirpenyangkalan (Non-Repudiation).
(Tri Rahajoeningroem, 2009) dalam jurnalnya “Studi dan Implementasi
Algoritma RSA”, Algoritma RSA dibuat oleh tiga orang peneliti dari MIT (Massachussets Institute of Technology) pada tahun 1976, yaitu Ron Rivest, Adi Shamir dan Leonard Adleman. RSA adalah salah satu teknik kriptografi dimana kunci untuk melakukan enkripsi berbeda dengan kunci untuk melakukan dekripsi. Kunci untuk melakukan enkripsi disebut sebagai kunci publik, sedangkan kunci untuk melakukan dekripsi disebut sebagai kunci privat.
(Dimas Gilang Saputra, 2010) dalam makalahnya “Aplikasi Chinese
Remainder Theorem dalam Secret Sharing”, menerangkan bahwa chinese remainder theorem adalah teorema mengenai kekongruenan lanjar dalam teori bilangan bulat yaitu aritmetika modulo. Teorema ini pertama kali ditemukan oleh Sun Tze pada abad pertama.
1.6Tujuan Penelitian
Penelitian ini bertujuan untuk memperoleh modifikasi algortima kriptografi RSA
dengan penambahan Chinese Reminder Theorem untuk mempercepat proses
dekripsinya.
1.7Kontribusi Penelitian
Manfaat dari penelitian ini adalah untuk menambah pengetahuan penulis di bidang kriptografi terutama tentang algortima RSA. Penelitian ini diharapkan menghasilkan
(18)
suatu algoritma baru yakni modifikasi algoritma RSA dengan penambahan Chinese Reminder Theorem yang dapat mempercepat proses enkripsi dan deksripsi pada RSA.
1.8Metode Penelitian
Metode penelitian ini digunakan sebagai pedoman dalam melaksanakan penelitian agar hasil yang dicapai tidak menyimpang dari tujuan yang telah ditentukan sebelumnya. Metode penelitian yang digunakan adalah sebagai berikut:
1. Mempelajari algoritma kriptografi, dalam hal ini yang dibahas adalah kriptografi dengan menggunakan algoritma Rivest Shamir Adleman (RSA).
2. Mempelajari Chinese Reminder Theorem dan teknik penggabungannya
dengan algoritma RSA.
3. Merancang suatu sistem pengamanan pesan dengan menggunakan algoritma
RSA yang dapat mengenkripsi dan mendekripsi pesan yang
diimplementasikan dalam bahasa pemograman Java.
4. Melakukan uji program.
(19)
BAB 2
LANDASAN TEORI
2.1 Sejarah Kriptografi
Kriptografi memiliki sejarah yang panjang. Penulisan rahasia ini dapat dilacak kembali ke 3000 tahun SM saat digunakan oleh bangsa Mesir. Mereka menggunakan
hieroglyphics untuk tulisan mereka agar tidak mudah dimengerti oleh orang yang tidak diharapkan. Hieroglyphics diturunkan dari bahasa Yunani yakni hieroglyphica yang berarti ukiran rahasia. Hieroglyphcs berevolusi menjadi hieratic, yaitu stylized script
yang lebih mudah digunakan. (Dony, 2009)
Gambar 2.1Egyptian Hieroglyphs
Sumber : www.wikipedia.org
Sekitar 400 SM, kriptografi militer digunakan oleh bangsa Spartan dalam bentuk sepotong papyrus atau perkamen dibungkus dengan batang kayu. Sistem ini disebut dengan Scytale.
Sekitar 50 SM, Julius Caesar, kaisar Roma, menggunakan cipher subsitusi untuk mengirim pesan ke Marcus Tullius Cicero. Pada cipher ini, huruf-huruf alphabet disubtitusikan dengan huruf-huruf yang lain pada alphabet yang sama. Karena hanya satu alphabet yang digunakan, cipher ini merupakan subsitusi monoalfabetik. Cipher
(20)
semacam ini mencakup penggeseran alphabet dengan 3 (tiga) huruf dan mensubsitusikan huruf tersebut. Subsitusi ini kadang disebut dengan C3.
Di India, cryptography digunakan oleh pecinta untuk berkumunikasi tanpa
diketahui orang lain. Bukti itu ditemukan dalam buku Kama Sutra yang
merekomendasikan bagaimana wanita seharusnya mempelajari seni memahami tulisan menggunakan cipher.
Pada abad ke-15, Leo Battista Alberti menemukan suatu metode wheel cipher,
lalu mengembangkannya menjadi alat enkripsi dan dekripsi. Metode ini kemudian dikembangkan ulang oleh Thomas Jefferson yang kemudian dinamakan Jefferson Wheel Cipher. Selanjutnya metode tersebut dikembangkan lagi oleh Bazeries yang kemudian dinamakan Bazaries Cylinder. Metode tersebut terus dikembangkan menjadi M94, dan versi-versi setelahnya.
Bentuk wheel cipher yang pada saat itu masih dikenal sebagai cipher disk,
ditemukan pertama kali oleh Leon Alberti. Terdapat dua buah potongan silinder, yaitu potongan silinder dalam dan potongan silinder luar. Masing-masing potongan silinder berlabel seluruh alfabet dengan susunan yang tidak harus terurut sama. Potongan silinder luar merupakan alfabet untuk plaintext dan potongan silinder dalam untuk
ciphertext.
Pada perang dunia kedua, Jerman menggunakan enigma, atau juga disebut mesin rotor, yang oleh Hitler dimanfaatkan untuk mengirim pesan kepada tentaranya. Enigma yang digunakan Jerman bisa mengenkripsi satu pesan yang memiliki 15 miliyar kemungkinan untuk didekripsikan. Dari kemungkinan-kemungkinan tersebut, Jerman tidak percaya bahwa pesan yang dikirim melalui enigma tersebut bisa dipecahkan. Namun pada kenyataannya pesan tersebut bisa didekripsikan oleh pihak sekutu.
Selama bertahun-tahun, cryptography menjadi bidang khusus yang hanya dipelajari oleh pihak militer untuk mengamankan komunikasi mereka dari pihak luar.
(21)
Akan tetapi, 30 tahun terakhir ini, cryptography tidak hanya dimonopoli oleh pihak militer saja. Hal yang sama juga dilakukan oleh individu-individu yang menginginkan pesan dan komunikasi mereka tidak diketahui oleh pihak lain. Apalagi pada zaman sekarang ini, dimana persaingan begitu ketat sehingga mereka mengeluarkan biaya lebih hanya untuk menjaga privasi mereka.
2.2 Pengertian Kriptografi
Kata cryptography berasal dari bahasa Yunani, kripto (hidden atau secret) dan grafh
(writing) artinya “secret writing”. Menurut terminologinya, cryptography adalah ilmu dan seni untuk menjaga keamanan pesan ketika pesan dikirim dari suatu tempat ke tempat lain. (Dony, 2009)
Cryptography adalah cabang ilmu matematika tentang persandian untuk menjaga keamanan data. (Munawar, 2012)
Kriptografi adalah ilmu yang mempelajari teknik-teknik matematis yang berhubungan dengan aspek keamanan informasi seperti keabsahan, integritas data, serta autentifikasi data. Kriptografi tidak berarti hanya memberikan keamanan informasi saja, namun lebih kearah teknik-tekniknya.
2.3 Konsep Kriptografi
Konsep kriptografi sendiri telah lama digunakan oleh manusia misalnya pada peradaban Mesir dan Romawi walaupun masih sangat sederhana. Prinsip-prinsip yang mendasari kriptografi adalah sebagai berikut :
a. Confidentiality (kerahasiaan) yaitu layanan yang ditujukan untuk menjaga agar isi pesan yang dikirimkan tidak dapat dibaca oleh pihak lain (kecuali pihak pengirim, pihak penerima/pihak-pihak yang memiliki ijin). Umumnya hal ini dilakukan dengan cara menyandikan pesan menjadi ciphertext sehingga sulit dibaca dan dipahami.
(22)
b. Data integrity (keutuhan data) yaitu layanan yang mampu menjamin pesan masih asli/utuh atau belum pernah dimanipulasi selama masa waktu pengiriman. Untuk menjaga integritas data, sistem harus memiliki kemampuan untuk mendeteksi adanya manipulasi pesan tersebut oleh pihak-pihak yang tidak berhak antara lain penghapusan, pengubahan atau penambahan data yang tidak sah oleh pihak lain.
c. Authentication (otentikasi) yaitu layanan yang berhubungan dengan identifikasi. Baik mengidentifikasi kebenaran pihak-pihak yang berkomunikasi maupun mengidentifikasi kebenaran sumber pesan. Dua pihak yang saling berkomunikasi harus dapat mengotentikasi satu sama lain sehingga ia dapat memastikan sumber pesan. Pesan yang di kirim melalui saluran komunikasi juga harus diotentikasi asalnya. Dengan kata lain, aspek keamanan ini dapat
diungkapkan sebagai pertanyaan : “apakah pesan yang diterima benar-benar berasal dari pengirim yang benar ?” Otentikasi sumber pesan secara implisit
juga memberikan kepastian integritas data, sebab jika pesan telah dimodifikasi berarti sumber pesan sudah tidak benar. Oleh karena itu, layanan integritas data selalu dikombinasikan dengan layanan otentikasi sumber pesan. Didalam kriptografi, layanan ini direalisasikan dengan menggunakan tandatangan digital (digital signature). Oleh sebab itu tandatangan digital selalu dikombinasikan dengan layanan otentikasi sumber pesan.
d. Non-repudiation (anti-penyangkalan) yaitu layanan yang dapat mencegah suatu pihak untuk menyangkal aksi yang dilakukan sebelumnya, yaitu pengirim pesan menyangkal melakukan pengiriman atau penerimaan pesan menyangkal telah menerima pesan. Sebagai contoh, misalnya pengiriman pesan memberi otoritas kepada penerima pesan untuk melakukan pembelian, namun kemudian ia menyangkal telah memberikan otoritas tersebut.
Berikut adalah istilah-istilah yang digunakan dalam bidang kriptografi : a. Pesan, Plaintext dan Chiphertext
Pesan (message) adalah data atau informasi yang dapat dibaca dan dimengerti maknanya. Nama lain untuk pesan adalah plaintext. Pesan dapat berupa data
(23)
atau informasi yang dikirim melalui kurir, saluran telekomunikasi maupun saluran lain. Pesan yang tersimpan tidak hanya berupa text, tetapi juga dapat berbentuk citra (image), suara/bunyi (audio) dan video atau berkas biner lainnya. Agar pesan tidak dapat dimengerti maknanya oleh pihak lain, maka pesan perlu disandikan kebentuk lain yang tidak dapat dipahami. Bentuk pesan yang tersandi disebut ciphertext atau sering juga disebut kriptogram. Ciphertext
harus dapat ditransformasikan kembali menjadi plaintext semula agar pesan yang diterima bisa dibaca.
b. Pengirim dan Penerima
Komunikasi data melibatkan pertukaran pesan antara dua entitas. Pengirim (sender) adalah entitas yang mengirim pesan kepada entitas lainnya. Penerima (receiver) adalah entitas yang menerima pesan. Entitas yang dimaksud dapat berupa orang , mesin (komputer, kartu kredit) dan sebagainya. Jadi orang dapat bertukar pesan dengan orang lainnya, sementara didalam jaringan komputer mesin (komputer) berkomunikasi dengan mesin. contoh : mesin ATM dengan komputer server di bank.
c. Enkripsi (E) dan Dekripsi (D)
Proses menyandikan plainteks menjadi ciphertext disebut enkripsi. Ada 2 syarat keamanan suatu system enkripsi, yaitu true random bits dan key space yang sangat besar untuk algoritma enkripsi tersebut. Jika kedua syarat dipenuhi, maka tidak ada masalah seberapa kompleks algoritma enkripsinya. Bahakan semakin sederhana semakin baik, karena semakin sederhana, maka makin sedikit proses komputasinya, dan semakin sedikit waktu yang dibutuhkan untuk mengeksekusinya.
Proses mengembalikan ciphertext menjadi plainteks disebut dekripsi. Enkripsi dan dekripsi dapat diterapkan baik pada pesan yang dikirim maupun pada pesan tersimpan.
(24)
d. Cipher dan Kunci
Algoritma kriptografi disebut juga cipher yaitu aturan untuk enciphering dan
deciphering, atau fungsi matematik yang digunakan untuk enkripsi dan dekripsi. Konsep matematis yang mendasari algoritma kriptografi adalah relasi antara dua buah himpunan yaitu himpunan yang berisi elemen-elemen plainteks
dan himpunan yang berisi ciphertext. Enkripsi dan dekripsi merupakan fungsi
yang memetakan elemen-elemen antara kedua himpunan tersebut. Misalkan P
menyatakan plainteks dan C menyatakan ciphertext, maka fungsi enkripsi E
memetakan P ke C
E(P) = C (2.1)
Dan fungsi dekripsi D memetakkan C ke P
D(C) = P (2.2)
Karena proses enkripsi kemudian dekripsi mengembalikan pesan ke pesan asal, maka kesamaan berikut harus benar :
D (E(P)) = P (2.3)
Kriptografi modern juga telah banyak mengatasi masalah dengan penggunaan kunci, yang dalam hal ini algoritma tidak lagi dirahasiakan, tetapi kunci harus dijaga kerahasiaannya. Kunci (key) adalah parameter yang digunakan untuk transformasi enciphering dan deciphering. Kunci biasanya berupa string atau deretan bilangan. Dengan menggunakan kunci K, maka fungsi enkripsi dan dekripsi dapat ditulis sebagai berikut :
Ek(P)= C dan Dk(C) = P (2.4)
dan kedua fungsi ini memenuhi
Dk(Ek(P))= P (2.5)
berikut ilustrasi skema enkripsi dan dekripsi dengan menggunakan kunci terhadap sebuah pesan :
(25)
Gambar 2.2 Proses enkripsi/dekripsi Sederhana
e. Penyadap
Penyadap (eavesdropper) adalah orang yang mencoba menangkap pesan selama ditransmisikan. Tujuan penyadap adalah untuk mendapatkan informasi sebanyak-banyaknya mengenai sistem kriptografi yang digunakan untuk berkomunikasi dengan maksud memecahkan ciphertext.
f. Kriptanalisis dan kriptologi
Kriptanalisis adalah ilmu dan seni untuk memecahkan ciphertext menjadi
plainteks tanpa mengetahui kunci yang digunakan dan pelakunya disebut Kriptanalis. Jika seorang kriptografer mentransformasikan plainteks menjadi
ciphertext dengan suatu algoritma dan kunci maka sebaliknya seorang kriptanalis berusaha untuk memecahkan ciphertext tersebut untuk menemukan
plainteks atau kunci.
Kriptologi adalah studi mengenai kriptografi dan kriptanalisis. Baik kriptografi maupun kriptanalisis keduanya saling berkaitan.
2.4 Macam-macam Algoritma Kriptografi
Berdasarkan sejarahnya, kriptografi dapat dibedakan menjadi dua bagian yaitu Kriptografi Klasik dan Kriptografi Modern. Perbedaan mendasar yang terdapat pada kedua jenis tersebut adalah pada kriptografi modern, algoritma kriptografi umumnya beroprasi pada mode-bit sehingga kriptanalis sangat sulit untuk memcahkan cipherteks
tanpa mengetahui kuncinya, sedangkan kriptografi klasik beroprasi pada mode karakter, sehingga memungkinkan cipherteks dapat depecahkan dengan mudah, seperti
Enkripsi Ciphertext Dekripsi
Plaintext Plaintex
(26)
penggunaan statistik kemunculan huruf pada bahasa tertentu, terkaan, intuisi dan sebagainya.
Berbeda dengan kriptografi klasik yang menitikberatkan kekuatan pada kerahasiaan algoritma yang digunakan. Apabila algoritma yang digunakan telah diketahui maka pesan sudah jelas "bocor" dan dapat diketahui isinya oleh siapa saja yang mengetahui algoritma tersebut. Kriptografi modern lebih menitikberatkan pada kerahasiaan kunci yang digunakan pada algoritma tersebut (oleh pemakainya) sehingga algoritma tersebut dapat saja disebarkan ke kalangan masyarakat tanpa takut kehilangan kerahasiaan bagi para pemakainya.
2.4.1 Algoritma Kriptografi Klasik
Kriptografi klasik meruapakan algoritma yang menggunakan satu kunci untk mengamankan data. Teknik ini telah digunakan beberapa abad yang lalu. Dua teknik dasar yang digunakan pada algoritma klasik adalah teknik subsitusi dan teknik permutasi.
a. Teknik Subsitusi
Teknik ini merupakan penggantian setiap karakter dari plaintext dengan karakter lainnya. Ada empat istilah subsitusi cipher, yaitu : monoalphabet
adalah dimana setiap karakter cipherteks menggantikan satu karakter plainteks. Polyalphabet dimana setiap karakter cipherteks dapat menggantikan lebih dari satu macam karakter plainteks. Monograf yaitu satu enkripsi dilakukan terhadap satu karakter plainteks. Polygraph
dimana satu enkripsi dilakukan terhadap lebih dari satu karakter plainteks.
Contoh algoritma subsitusi adalah Caesar Cipher, Shift Cipher, Hill Cipher, Vigenere Cipher, dan Playfair Cipher.
(27)
b. Teknik Permutasi
Teknik ini menggunakan permutasi karakter. Penggunaan teknik ini menyebabkan pesan yang asli tidak dapat dibaca kecuai bila memiliki kunci untuk mengembalikan pesan cipherteks ke pesan plainteks atau disebut dekripsi.
Teknik Permutasi (transposisi) dengan bermacam pola bisa dilakukan untuk menyembunyikan pesan dari tangan-tangan orang yang tidak berhak. Kombinasi dari pola-pola tersebut merupakan dasar dari pembentukan algoritma kriptografi yang dikenal sekarang ini.
2.4.2 Algoritma Kriptografi Modern
Kriptografi modern berbeda dengan kriptografi konvensional karena kriptografi modern sudah menggunakan komputer dalam pengoperasiannya. Fungsinya adalah untuk mengamankan data, baik yang ditransfer melalui jaringan komputer maupun tidak. Hal tersebut sangat berguna untuk melindungi privasi, integritas data,
authentication, dan non-repudiation.
Kriptografi modern merupakan suatu perbaikan yang mengacu pada kriptografi klasik. Pada kriptografi modern terdapat berbagai macam algoritma yang bertujuan mengamankan informasi yang dikirim melalui jaringan komputer.
Kriptografi modern terdiri dari 3 (tiga) bagian, yaitu : a. Algoritma Simetris
Algoritma ini mengasumsikan pengirim dan penerima pesan sudah berbagi kunci yang sama sebelum bertukar pesan. Algoritma simetris (symmetric algorithm) adalah suatu algoritma dimana kunci enkripsi yang digunakan sama dengan kunci dekripsi, sehingga algoritma ini disebut juga sebagai
single-key algorithm. Algoritma ini sering juga disebut dengan algoritma klasik karena memakai kunci yang sama untuk kegiatan enkripsi dan
(28)
dekripsi. Algoritma ini sudah ada sejak lebih dari 4000 tahun yang lalu. Semua algoritma kriptografi klasik termasuk kedalam sistem kriptografi simetri. Keamanan dari pesan yang menggunakan algoritma ini tergantung pada kunci. Jika kunci tersebut diketahui oleh orang lain maka orang tersebut akan dapat melakukan enkripsi dan dekripsi terhadap pesan.
Berikut ilustrasi penggunaan algoritma simetris :
Gambar 2.3 Ilustrasi Algoritma Kriptografi Simetris
Algoritma kriptografi yang memakai kunci simetris antara lain adalah Data Encryption Standard (DES), RC2, RC4, RC5, RC6, International Data Encrytion Algorithm (IDEA), Advanced Encryption Standard (AES), One Time Pad (OTP), dan lain-lain
Sebelum melakukan pengiriman pesan, pengirim dan penerima harus memilih suatu kunci tertentu yang sama untuk dipakai bersama, dan kunci ini haruslah rahasia bagi pihak yang tidak berkepentingan sehingga algoritma ini disebut juga algoritma kunci rahasia (secret-key algorithm).
Kelebihan Algoritma Simetris:
1. Kecepatan operasi lebih tinggi bila dibandingkan dengan algoritma asimetrik.
2. Karena kecepatannya yang cukup tinggi, maka dapat digunakan pada sistem real-time
Enkripsi Dekripsi
Ciphertext
Plaintext Plaintex
(29)
Kelemahan Algoritma Simetris :
1. Untuk tiap pengiriman pesan dengan pengguna yang berbeda
dibutuhkan kunci yang berbeda juga, sehingga akan terjadi kesulitan dalam manajemen kunci tersebut.
2. Permasalahan dalam pengiriman kunci itu sendiri yang disebut “key
distribution problem”
b. Kriptografi Kunci Asimetris
Kriptografi asimetris juga disebut dengan kriptografi kunci-publik. Dengan arti kata kunci yang digunakan untuk melakukan enkripsi dan dekripsi adalah berbeda. Pada kriptografi jenis ini, setiap orang yang berkomunikasi mempunyai sepasang kunci yaitu:
1. Kunci umum (publik key) : yaitu kunci yang boleh semua orang tahu. Pengirim mengenkripsi pesan dengan menggunakan kunci publik si penerima pesan.
2. Kunci rahasia (private key) : yaitu kunci yang dirahasiakan atau diketahui oleh satu orang saja. Hanya penerima pesan yang dapat mendekripsi pesan, karena hanya ia yang mengetahui kunci private
nya sendiri
Kunci-kunci tersebut berhubungan satu sama lain. Walau kunci publik telah diketahui namun akan sangat sukar mengetahui kunci private yang digunakan. Contoh algoritma kriptografi kunci-publik diantaranya RSA, Elgamal, DSA dll.
(30)
Berikut ilustrasi penggunaan algoritma Asimetris :
Gambar 2.4 Ilustrsi Algoritma Kriptografi Asimetris
Kelebihan Algoritma Asimetris:
1. Masalah keamanan pada distribusi kunci dapat lebih baik
2. Masalah manajemen kunci yang lebih baik karena jumlah kunci yang lebih sedikit.
Kelemahan Algoritma Asimetris:
1. Kecepatan yang lebih rendah bila dibandingkan dengan algoritma simetris.
2. Untuk tingkat keamanan sama, kunci yang digunakan lebih panjang
dibandingkan dengan algoritma simetris.
c. Hybrid Algoritma
Algoritma Hybrid adalah algoritma yang memanfaatkan dua tingkatan kunci, yaitu kunci rahasia (simetri) untuk enkripsi dan pasangan kunci private-kunci publik untuk memberikan tanda tangan digital serta melindungi kunci simetri.
Berdasarkan besar data yang diolah dalam satu kali proses, maka algoritma kriptografi dapat dibedakan menjadi dua jenis yaitu :
a. Algoritma block cipher
Informasi/data yang hendak dikirim dalam bentuk blok-blok besar (misal 64-bit) dimana blok-blok ini dioperasikan dengan fungsi enkripsi yang
Enkripsi Dekripsi
Ciphertext
Plaintext Plaintex
Kunci Enkripsi
Kunci Dekripsi
(31)
sama dan akan menghasilkan informasi rahasia dalam blok-blok yang berukuran sama.
b. Algoritma stream cipher
Informasi/data yang hendak dikirim dioperasikan dalam bentuk blok-blok yang lebih kecil (byte atau bit), biasanya satu karakter persatuan waktu proses, menggunakan tranformasi enkripsi yang berubah setiap waktu.
2.5 RSA
2.5.1 Sejarah Singkat RSA
Algortima RSA dijabarkan pada tahun 1977 oleh tiga orang : Ron Rivest, Adi Shamir dan Len Adleman dari Massachusetts Institute of Technology. Huruf RSA itu sendiri berasal dari inisial nama mereka (Rivest-Shamir-Adleman).
Clifford Cocks, seorang matematikawan Inggris yang bekerja untuk GCHQ, menjabarkan tentang sistem equivalen pada dokumen internal di tahun 1973. Penemuan Clifford Cocks tidak terungkap hingga tahun 1997 karena alasan top-secret classification. Algoritma tersebut dipatenkan oleh Massachusetts Institute of Technology pada tahun 1983 di Amerika Serikat sebagai U.S. Patent 4405829. Paten tersebut berlaku hingga 21 September 2000.
Semenjak Algoritma RSA dipublikasikan sebagai aplikasi paten, regulasi di sebagian besar negara-negara lain tidak memungkinkan penggunaan paten. Hal ini menyebabkan hasil temuan Clifford Cocks dikenal secara umum.
(32)
2.5.2 Cara Kerja Algoritma RSA
RSA juga dikenal sebagai Algoritma cryptography asymetric. Algoritma cryptography asymetric adalah algoritma yang menggunakan kunci yang berbeda untuk proses enkripsi dan dekripsinya. Algoritma ini disebut juga algoritma kunci umum (public key algorithm) karena kunci untuk enkripsi dibuat umum (public key) atau dapat diketahui oleh setiap orang, tapi kunci untuk dekripsi hanya diketahui oleh orang yang berwenang mengetahui data yang disandikan atau sering disebut kunci pribadi (private key).
RSA merupakan algoritma pertama yang cocok untuk digital signature seperti halnya enkripsi, dan salah satu yang paling maju dalam bidang kriptografi public key. RSA masih digunakan secara luas dalam protokol electronic commerce, dan dipercaya dalam mengamankan dengan menggunakan kunci yang cukup panjang sehingga akan sulit untuk memecahkan kode sandinya.
RSA merupakan algoritma yang melibatkan ekspresi dengan fungsi eksponensial. Plaintext dienkripsi dalam blok blok, dimana setiap blok tersebut mempunyai nilai biner yang kurang dari angka tertentu (n). Proses enkripsi dan dekripsi untuk plaintext blok M dan ciphertext blok C dapat digambarkan sebagai berikut :
C = Me mod n
M = Cd mod n = (Me)d mod n = Med mod n (2.6) Kedua belah pihak (pengirim dan penerima) harus mengetahui nilai dari n. Pengirim mengetahui nilai e dan hanya penerima yang tahu nilai d. Jadi, dapat disimpulkan bahwa kunci publik dari algoritma ini adalah e, n dan kunci pribadinya adalah d, n. Untuk penentuan kunci ini juga tidaklah bebas, harus melalui rumus tertentu.
(33)
Keamanan algoritma RSA terletak pada sulitnya memfaktorkan bilangan yang besar menjadi faktor-faktor prima.
2.5.3 Pembangkitan Kunci Pada RSA
Pembangkitan pasangan kunci pada RSA mengikuti algoritma sebagai berikut : a. Pilih dua bilangan prima, a dan b (rahasia)
b. Hitung n = ab. Besaran n tidak perlu dirahasiakan. c. Hitung m = (a – 1)(b – 1).
d. Pilih sebuah bilangan bulat untuk kunci publik, sebut namanya e, yang relatif prima terhadap m.
e. Hitung kunci dekripsi, d, melalui ed 1 (modm) atau (de) mod m = 1.
2.5.4 Proses Enkripsi pada RSA
Proses selanjutnya setelah pembangkitan kunci pada RSA adalah proses Enkripsi. Enkripsi adalah proses mengubah pesan asli (plaintext) menjadi pesan rahasia (chipertext).
Pada proses ini pesan asli terlebih dahulu diubah kedalam bentuk desimal, kemudian pesan yang sudah berbentuk desimal kemuadian di bagi-bagi menjadi beberapa blok desimal secara teratur. Setiap blok desimal akan memiliki nilai yang harus lebih kecil dari nilai n yang disebut P.
Rumus yang digunakan untuk melakukan proses Enkripsi pada RSA adalah :
C = Pe (mod n). (2.7)
Dimana P = blok pesan asli C = Chipertext e = kunci publik n = kunci publik (ab)
(34)
2.5.5 Proses Dekripsi Pada RSA
Proses dekripsi pada RSA mirip dengan proses enkripsinya, hanya saja pada proses dekripsinya menggunakan kunci private d. Rumus untuk proses dekripsi pada RSA adalah sebagai berikut :
P = Cd (mod n), (2.8)
Dimana P = Plainteks (pesan asli) C = cipertext
d = kuci private (kunci dekripsi) n = kunci publik (ab)
2.5.6 Kelebihan dan Kelemahan RSA
Kekuatan algoritma RSA terletak pada tingkat kesulitan dalam memfaktorkan bilangan menjadi faktor primanya, dalam hal ini memfaktorkan n menjadi p dan q. Karena jika n berhasil difaktorkan, maka menghitung nilai m adalah perkara mudah. Selanjutnya, walau nilai e diumumkan, perhitungan kunci d tidaklah mudah pula karena nilai m yang tidak diketahui.
Kelebihan lain algoritma RSA terletak pada ketahanannya terhadap berbagai bentuk serangan, terutama serangan brute force. Hal ini dikarenakan kompleksitas dekripsinya yang dapat ditentukan secara dinamis dengan cara menentukan nilai p dan q yang besar pada saat proses pembangitkan pasangan kunci, sehingga dihasilkan sebuah key space yang cukup besar, sehingga tahan terhadap serangan.
Namun demikian, kelebihan tersebut sekaligus menjadi kelemahan dari sistem ini. Ukuran kunci privat yang terlalu besar akan mengakibatkan proses dekripsi yang cukup lambat, terutama untuk ukuran pesan yang besar. Oleh karena itu, RSA
(35)
umumnya digunakan untuk meng-enkripsi pesan berukuran kecil seperti kata kunci dari enkripsi simetris seperti DES dan AES yang kemudian kunci tersebut dikirim secara bersamaan dengan pesan utama.
2.6 Teori Bilangan
2.6.1 Sifat Habis Dibagi Pada Bilangan Bulat
Suatu bilangan bulat b dikatakan habis dibagi (divisible ) oleh suatu bilangan bulat tak nol a jika ada suatu bilangan bulat q sedemikian sehingga b = aq. Atau dapat juga dikatakan a membagi habis b dan ditulis dengan a | b.
Sifat – sifat hasil bagi :
a. jika a | b maka a | bc untuk sebarang c bilangan bulat.
b. jika a | b dan b | c maka a | c.
c. jika a | b dan a | c maka a | bx+cy untuk sebarang x,y bilangan bulat. d. jika a | b dan b | a maka a = b.
e. jika a b dan b ≠ 0, maka |a|b|
f. jika m ≠ 0, maka a | b jika hanya jika ma | mb
Jika a | b maka a disebut faktor dari b. Kemudian jika suatu bilangan bulat d membagi dua bilangan bulat a dan b maka d disebut faktor persekutuan dari a dan b. Bilangan bulat terbesar di antara semua faktor persekutuan bagi a dan b dinamakan faktor persekutuan terbesar (greatest common divisor) bagi a dan b dan dilambangkan dengan GCD(a,b) atau sering juga sering dilambangkan dengan FPB(a,b).
Contoh :
Faktor pembagi 45 adalah : 1, 3, 5, 9, 15, 45
Faktor pembagi 36 adalah : 1, 2, 3, 4, 6, 9, 12, 18, 36
(36)
Untuk menentukan faktor persekutuan terbesar dapat pula digunakan teorema algoritma euclide berikut :
Diberikan dua bilangan bulat a dan b dengan a > b > 0, maka GCD(a,b) dapat dicari dengan mengulang algoritma pembagian.
a = q1.b + r1 ... (0 < r1 < b)
b = q2.r1 + r2 ... (0 < r2 < r1)
r1 = q3.r2 + r3 ...(0 < r3 < r2)
: :
r(n-2) = qn.r(n-1) + rn
r(n-1) = q(n+1).rn + 0
Maka, rn, sisa terakhir dari pembagian diatas yang bukan nol merupakan
GCD(a,b).
Akibat selanjutnya dari teorema euclide yaitu persamaan linear Diophantine sebagai berikut :
Suatu persamaan linear Diophantine ax + by = c dengan a,b dan c bilangan bulat mempunyai penyelesaian bilangan bulat jika dan hanya jika GCD(a,b) membagi habis c.
Bukti :
Dari akibat sebelumnya diketahui bahwa untuk setiap GCD(a,b) maka terdapat bilangan bulat m dan n sedemikian hingga GCD(a,b) = am + bn. Selanjutnya karena GCD(a,b) membagi habis c maka terdapat bilangan k sedemikian hingga
c = k. GCD(a,b) c = k. (am +bn) c = a(km) + b(kn)
Jadi salah satu penyelesain untuk persamaan linear Diophantine tersebut yaitu x = km dan y =kn.
(37)
2.6.2 Kongruensi
Misalkan m adalah suatu bilangan bulat positif. Dua buah bilangan a dan b dikatakan kongruen modulo m jika dan hanya jika m | a-b, dan ditulis dengan a b (mod m).
Misalkan a, b, c, d, x, dan y adalah bilangan bulat, maka :
a. a b (mod m), dan b a (mod m), dan a-b 0 (mod m) adalah pernyataan-pernyataan setara.
b. Jika a b (mod m) dan b c (mod m) maka a c (mod m). c. Jika a b (mod m) dan d membagi habis m maka a b (mod d) Jika a b (mod m) dan c d (mod m) maka ax + cy bx + dy (mod m).
2.6.3 Kekongruenan Lanjar
Kekongruenan lanjar adalah kongruen yang berbentuk ax b (mod m) dengan m
adalah bilangan bulat positif, a dan b sembarang bilangan bulat, dan x adalah peubah bilangan bulat.
Nilai-nilai x dicari sebagai berikut :
ax = b + km
yang dapat disusun menjadi
a km b x
dengan k adalah sembarang bilangan bulat. Cobakan untuk k = 0, 1, 2, … dan k = –1,
(38)
2.6.4 Bilangan Prima dan Relatif Prima
Bilangan prima adalah bilangan asli yang lebih besar dari 1, yang faktor pembaginya adalah 1 dan bilangan itu sendiri. 2 dan 3 adalah bilangan prima. 4 bukan bilangan prima karena 4 bisa dibagi 2. Sepuluh bilangan prima yang pertama adalah 2, 3, 5, 7, 11, 13, 17, 19, 23 dan 29.
Dua buah bilangan bulat a dan b dikatakan relatif prima jika PBB(a, b) = 1. Contoh : 20 dan 3 relatif prima sebab PBB(20, 3) = 1. Begitu juga 7 dan 11 relatif prima karena PBB(7, 11) = 1. Tetapi 20 dan 5 tidak relatif prima sebab PBB(20, 5) = 5
≠ 1
. Jika a dan b relatif prima, maka terdapat bilangan bulat m dan n sedemikian sehingga ma + nb = 1.Bilangan 20 dan 3 adalah relatif prima karena PBB(20, 3) =1, atau dapat ditulis 2 . 20 + (–13) . 3 = 1 dengan m = 2 dan n = –13. Tetapi 20 dan 5 tidak relatif prima karena PBB(20, 5) = 5 ≠ 1 sehingga 20 dan 5 tidak dapat dinyatakan dalam m . 20 + n . 5 = 1.
2.6.5 Remainder Theorem
Teorema sisa (Remainder Theorem) adalah suatu cara untuk menentukan sisa pembagian suatu sukubanyak jika dibagi faktor linear (x - c) atau secara umum oleh faktor linear (ax + b). Jika sukubanyak P dibagi oleh faktor linear (x - c), maka sisanya adalah P(c), jika sukubanyak P dibagi oleh faktor linear (ax+b), a ≠0, maka sisanya adalah P(-b/a).
Tentukan sisanya jika 2x3– x2 + 7x + 6 dibagi x + 1 atau dibagi x – (-1). Jawab: sisanya adalah P(-1) = 2.(-1)3– (-1)2 + 7(-1) + 6
(39)
2.7Chinese Remainder Theorem
Chinese remainder theorem adalah teorema mengenai kekongruenan lanjar dalam teori bilangan bulat yaitu aritmetika modulo. Teorema ini pertama kali ditemukan oleh Sun Tze pada abad pertama.
Misalkan m1, m2, ...,mn adalah bilangan bulat positif sedemikian sehingga
FPB(mi, mj) = 1 untuk i ≠ j. Maka sistem kongruen lanjar x ≡ ak (mod mk) mempunyai
sebuah solusi unik modulo m = m1.m2. ... .mn.
Sebagai contoh, Sun Tze mengajukan pertanyaan sebagai berikut : Tentukan sebuah bilangan bulat yang bila dibagi dengan 5menyisakan 3, bila dibagi 7 menyisakan 5, dan bila dibagi 11 menyisakan 7.(Putri, 2007)
Pertanyaan Sun Tze di atas dapat dirumuskan kedalam system kongruen lanjar:
x 3 (mod 5)
x 5 (mod 7)
x 7 (mod 11) Penyelesaian :
Kongruen pertama, x 3 (mod 5), memberikan x = 3 + 5k1 untuk beberapa nilai k. Subsitusikan ke dalam kongruen kedua menjadi 3 + 5k1 5 (mod 7), dari sini diperoleh k1 6 (mod 7), atau k1 = 6 + 7k2 untuk beberapa nilai k2. Jadi didapatkan x
= 3 + 5k1 = 3 + 5(6 + 7k2) = 33 + 35k2 yang mana memenuhi dua kongruen pertama. Jika x memenuhi kongruen yang ketiga, harus mempunyai 33 + 35k2 7 (mod 11), yang mengakibatkan k2 9 (mod 11) atau k2 = 9 + 11k3. Subsitusikan k2 ini ke dalam kongruen yang ketiga menghasilkan x = 33 + 35(9 + 11k3) 348 + 385k3 (mod 11). Dengan demikian, x 348 (mod 385) yang memenuhi ketiga konruen tersebut. Dengan kata lain, 348 adalah solusi unik modulo 385. Catatlah bahwa 385 = 5 7 11.
(40)
Solusi unik ini mudah dibuktikan sebagai berikut. Solusi tersebut modulo m =
m1 m2 m3 = 5 7 11 = 5 77 = 11 35. Karena 77 3 1 (mod 5), 55 6 1 (mod 7), dan 35 6 1 (mod 11), solusi unik dari sistem kongruen tersebut adalah
x 3 77 3 + 5 55 6 + 7 35 6 (mod 385)
(41)
BAB 3 PEMBAHASAN
3.1 Proses Pada RSA
3.1.1 Pembentukan kunci
Proses pembangkitan kunci pada kriptografi RSA adalah sebagai berikut :
a. Pilih dua buah bilangan prima sembarang p dan q. Jaga kerahasiaan p dan q. b. Hitung n = p * q. Besaran n ini tidak perlu dirahasiakan.
c. Hitung m = (p-1) * (q-1). Sekali m telah dihitung, p dan q dapat dihapus untuk mencegah diketahuinya oleh pihak lain.
d. Pilih sebuah bilangan bulat untuk kunci publik, sebut namanya e, yang relatif prima terhadap m (relatif prima berarti GCD(e, m) = 1) dengan syarat e ≠ (p-1), e ≠ (q-1), dan e < n.
e. Hitung kunci dekripsi, d, dengan kekongruenan ed ≡1 (mod m).
Contoh penerapan pembangkitan kunci algoritma RSA :
a. Menentukan bilangan acak p dan q p = 13, q = 5
b. Hitung n dan m
n = 13 * 5 = 65 dan m = 12 * 4 = 48
c. Cari nilai e
GCD(e, 48) = 1 Misalnya, e = 2 maka GCD(2, 48) = 2 e = 3 maka GCD(3, 48) = 3 e = 4 maka GCD(4, 48) = 4
(42)
d. Lalu cari nilai d
Misalnya
k = 1 maka d = 9,8 k = 2 maka d = 19,4
k = 3 maka d = 29 , jadi digunakan d = 29
Dari contoh penerapan di atas didapat kunci Publik e = 5, n = 65, dan kunci privat d = 29, n = 65.
3.1.2 Proses Enkripsi
Setelah proses proses pembangkitan kunci selesai, kemudian lanjut ke proses enkripsi pesan menggunakan kunci publik dari hasil pembangkitan kunci dengan menggunakan rumus :
C = Pe mod n.
Menggunakan kunci yang diperoleh di atas kita akan mencoba untuk malakukan enkripsi pesan sederhana. Misalnya P = 48, maka akan diperoleh C sebagai berikut :
C = Pe mod n = 485 mon 65
= 254803968 mod 65 = 3
Jadi hasil enkripsi 48 menggunakan kunci yang diperoleh di atas adalah 3.
3.1.3 Proses Dekripsi
Untuk mengembalikan pesan ciphertext menjadi plaintext (pesan asli) adalah dengan menggunakan rumus dekripsi RSA sebagai berikut :
(43)
Dengan menggunakan pesan hasil enkripsi dan kunci yang diperoleh di atas dapat dilakukan dekripsi pesan sebagai berikut :
P = Cd mod n = 329 mod 65
= 68630377364883 mod 65 = 48
Dari hasil dekripsi di atas dapat dibuktikan bahwa hasil enkripsi pesan dapat didekripsi kembali ke pesan asli.
3.2 Proses Pada RSA-CRT
3.2.1 Pembentukan kunci (Key Generation)
Pembentukan kunci pada RSA-CRT berbeda dengan pembentukan kunci pada RSA standart. Pembentukan kunci pada RSA-CRT adalah sebagai berikut :
a) Misalkan p dan q adalah dua bilangan prima yang sangat besar dengan ukuran yang hampir sama dimana p > q.
b) Hitung n = p*q dan m = (p-1)(q-1).
c) Pilih sebuah bilangan bulat untuk kunci publik, sebut namanya e, yang relatif prima terhadap m (relatif prima berarti GCD(e, m) = 1) dengan syarat e ≠ (p-1), e ≠ (q-1), dan e < n.
d) Hitung nilai
e) Hitung nilai dp = d mod (p-1) dan dq = d mod (q-1)
(44)
3.2.2 Poses Dekripsi pada RSA-CRT
Karena enkripsi RSA-CRT sama dengan prosedur enkripsi RSA standar, saat ini perhatian difokuskan pada dekripsi RSA-CRT.
Pada deskripsi RSA standart kita mendekripsi pesan dengan menggunakan rumus P = Cd mod n, sehingga perhitungan tersebut tergantung pada nilai d dan n. Jika nilai d besar, maka perhitungannya akan lebih lama karna nilai eksponen yang besar d.
Sedangkan pada RSA-CRT kita menggunakan d hanya untuk membangkitkan kunci dp
dan dq dimana dp dan dq akan lebih kecil nilainya dari d karna perhitungannya menggunakan d modulus p dan q. Rumus untuk menghitung dp dan dq adalah sebagai berikut [PKCS1] :
d mod (p-1) = e-1 mod (p-1)
d mod (q-1) = e-1 mod (q-1)
dp = e-1 mod (p-1) = d mod (p-1)
dq = e-1 mod (q-1) = d mod (q-1)
Dari hasil perhitungan di atas akan didapatkan nilai dp dan dq yang lebih kecil dari d.
Selanjutnya kita menghitung representasi pesan m1 dan m2 yang akan digunakan untuk perhitungan akhir proses dekripsi menggunakan rumus sebagai berikut :
m1 = cdP mod p
m2 = cdQ mod q
m1 dan m2 dari hasil perhitungan di atas kita subsitusikan ke dalam rumus
Garner’s untuk menghitung solusi akhir dekripsi sebagai berikut : qInv = (1/q) mod p =
(45)
h = qInv.(m1 - m2) mod p
m = m2 + h.q
Hasil perhitungan m di atas adalah solusi akhir dari proses dekripsi dimana m
akan bernilai sama dengan pesan sebelum di enkripsi.
Untuk lebih memahami proses dekripsi RSA-CRT, berikut contoh implementasi RSA-CRT.
Contoh :
Pilih p = 11, q = 7, P = 8; N = 11*7 = 77, m = 10*6 =60. e : FPB(e,60)=1; e = 7;
d =
dp = d mod (p-1) = 43 mod (11-1)=3; dq = d mod(q-1) = 43 mod (7-1)=1.
Plainteks kita enkripsi dengan menggunakan rumus enkripsi sebagai berikut :
C = Pe mod n = 87 mod 77 =2097152 mod 77 =57.
Pesan asli P = 8 setelah dienkripsi menghasilkan C = 57. Jika kita dekripsi menggunakan RSA-CRT sebagai berikut :
=
M1 = Cdp mod p=573 mod 11=54 mod 11 =8
M2 = Cdq mod q=571 mod 7 =57 mod 7 =1
h=qInv*(m1-m2) mod p = 8*(8-1) mod 11 = 40 mod 11 = 1
P = m2+h*q = 1 +1*7 =8
Dari perhitungan di atas diperoleh nilai P = 8. Dengan demikian hasil akhir adalah 8 dan hasil ini sesuai dengan pesan asli sebelum dienkripsi.
(46)
Dari contoh di atas dapat dilihat perbedaan nilai eksponen d dengan eksponen
dp dan dq. dp < d, dq < d (3 < 43, 1 < 43) sehingga perhitungan dekripsi pada RSA-CRT lebih cepat dibandingkan RSA biasa karna memiliki nilai eksponen dp, dq lebih kecil dibandingkan d.
3.3 Perbedaan RSA dengan RSA-CRT
Perbedaan antara RSA dengan RSA-CRT terletak pada proses pembangkitan kunci dan proses dekripsinya. Perbedaan pada dekripsi RSA dengan dekripsi RSA-CRT tersebut dikarenakan pada RSA-CRT ditambahkan teorema CRT dimana penambahan teorema ini diharapkan bisa menambah kecepatan proses perhitungan dekripsinya.
Secara teori dapat dilihat dekripsi pada RSA-CRT lebih cepat perhitungannya dibandingkan dengan dekripsi RSA. Hal ini dapat dilihat dari kompleksitas dekripsi RSA (P = Cd mod n) bergantung langsung pada ukuran d dan n. Eksponen dekripsi d
menspesifikasikan bilangan perkalian modulo yang dibutuhkan untuk melakukan eksponensiasi, dan modulo n menentukan ukuran dari hasil sementaranya. Cara untuk mengurangi ukuran d dan n adalah dengan menggunakan teori Chinese Remainder Theorem (CRT).
Berikut perbandingan antara dekripsi RSA dengan RSA-CRT. Misalkan kita menggunakan contoh di atas, dimana p = 11 dan q = 7, n = 77, m = 60, e = 7, d = 43,
dp = 3, dq = 1, dan Plainteks M = 8. Jika di enkripsi maha dihasilkan ciperteks C = 57.
Jika ciperteks didekripsi dengan menggunakan RSA-CRT maka akan menghasilkan pergitungan seperti di bawah ini :
=
M1 = Cdp mod p=573 mod 11=54 mod 11 =8
M2 = Cdq mod q=571 mod 7 =57 mod 7 =1
(47)
P = m2+h*q = 1 +1*7 =8
Jika ciperteks didekripsi dengan RSA adalah sebagai berikut :
M = Cd mod n = 5743 mod 77 = 8
Dari perhitungan di atas dapat dilihat penurunan nilai eksponen d dan modulo n
sehingga dapat disimpulkan bahwa proses dekripsi pada RSA-CRT lebih cepat dibandingkan dengan RSA standart.
Untuk lebih memperjelas perbedaan kecepatan perhitungan deskripsi pada RSA dengan RSA-CRT berikut dibuat bagan perbadingan proses pada RSA dan RSA-CRT beserta bagan contoh implementasinya.
(48)
Gambar 3.1 Bagan perbandingan RSA dengan RSA-CRT
RSA RSA-CRT
p, q, n=(p*q), m = (p-1)(q-1) e : FPB(e, m) = 1
p, q, (q > p)
n = p*q, m = (p-1)(q-1) e: FPB(e,m)=1
dp = d mod (p-1) dq = d mod (q-1)
Pembangkitan Kuci Pembangkitan Kuci
Kunci Publik : e, n
Kunci Rahasia : d, n
Kunci Publik : e, n
Kunci Rahasia : p, q, d, dp, dq
Enkripsi
Enkripsi Deskripsi
M1 = Cdp mod p
M2 = Cdq mod q
h=qInv*(m1-m2) mod p
P = m2+h*q
(49)
Gambar 3.2 Bagan Contoh perbandingan RSA dengan RSA-CRT
RSA RSA-CRT
p=137, q=131, n=(137*131)=17947, m = (137-1)(131-1)=17680, e : FPB(e, 17680) = 1(e=3)
11787 ; (k=3)
p=137, q=131, n=(137*131)=17947, m = (137-1)(131-1)=17680, e : FPB(e, 17680) = 1(e=3)
11787 ; (k=3)
dp = 11787 mod (137-1)=91 dq = 11787 mod (131-1)=87
Pembangkitan Kuci Pembangkitan Kuci
Kunci Publik : e=3, n=17947
Kunci Rahasia : d=11787, n=17947
Kunci Publik : e=3, n=17680
Kunci Rahasia : p=137, q=131,
d=11787, dp=91, dq=87
Enkripsi
Enkripsi
qInv = 114 (k=109)
M1 = 836391 mod 137= 102
M2 = 836387 mod 131=120
h = qInv*(m1-m2) mod p
= 114*(102-120+137) mod 137=3 P = m2+h*q=120+(3*131)=513 Catatan : kita menambahkan p pada (m1-m2)untuk menghindari nilai negatip.
Deskripsi
Jika diketahui p = 137, q=131, dan pesan P = 513. Berikut perbandingan perhitungan RSA dengan RSA-CRT :
Contoh :
(50)
3.4 Flowchart Algoritma RSA Mulai
Tentukan bilangan prima p & q, dimana p ≠ q, Masukkan pesan P
Hitung n = p.q, m = (p-1)(q-1)
Pilih integer e, dimana 1<e<n-1
Hitung FPB (e, m)
Jika FPB (e, m) = 1
Pilih integer d
Hitung ed ≡ 1 (mod m)
Jika ed = 1 mod m
Enkripsi Pesan C = Pe mod n
Output Chiper
Dekripsi Pesan P = Cd mod n
Output Pesan Asli
Selesai
Tidak
Tidak Ya
Ya
Dekripsi Ya
Tidak
(51)
3.5 Flowchart Algoritma RSA-CRT Mulai
Tentukan bilangan prima p & q, dimana p ≠ q dan p > q,
Masukkan pesan P
Hitung n = p.q, m = (p-1)(q-1)
Pilih integer e, dimana 1<e<n-1
Hitung FPB (e, m)
Jika FPB (e, m) = 1
Pilih integer d
Hitung ed ≡ 1 (mod m)
Jika ed = 1 mod m
Enkripsi Pesan C = Pe mod n
Output Chiper
Dekripsi Pesan qInv = q-1 mod p M1 = Cdp mod p M2 = Cdq mod q h=qInv*(m1-m2) mod p
P = m2+h*q
Output Pesan Asli
Selesai Tidak
Tidak Ya
Ya
Hitung dp = d mod (p-1) dan dq = d mod (q-1)
Deskripsi
Ya
Tidak
(52)
3.6 Pengujian Pada Program
Pengujian program yang dilakukan pada penelitian ini adalah dengan menggunakan pesan berupa bilangan integer. Hal ini dilakukan agar bisa diimplementasikan pada program yang lebih sederhana sehingga dengan mudah diketahui perbedaan kecepatan pada RSA dan RSA dengan CRT.
Bahasa pemrograman yang digunakan dalam pengujian ini adalah bahasa pemograman Java.
3.6.1 Pengujian Algoritma RSA
Pengujian program dilakukan dengan nilai m sebagai berikut :
“123456789098765432101234567890987654321012345678909876543210123456789
098765432101234567890987654321012345678909876543210123456789098765432 101234567890987654321012345678909876543210123456789098765432101234567 890987654321012345678909876543210"
(53)
3.6.2 Pengujian Algoritma RSA-CRT
Pengujian program dilakukan dengan nilai m yang sama dengan RSA yaitu sebagai berikut :
“123456789098765432101234567890987654321012345678909876543210123456789
098765432101234567890987654321012345678909876543210123456789098765432 101234567890987654321012345678909876543210123456789098765432101234567 890987654321012345678909876543210"
Gambar 3.6 Proses Enkripsi dan Dekripsi RSA-CRT dengan Java
3.6.3 Pebandingan Hasil Pengujian
Untuk melihat perbandingan waktu proses RSA dan RSA-CRT dilakukan percobaan menggunakan pesan dan komputer yang sama. Percobaan dilakukan sebanyak 10 (sepuluh) kali dengan hasil percobaan yang tertera pada tabel percobaan berikut :
(54)
Tabel 4.1 Perbandingan Waktu Proses Pada RSA dan RSA-CRT
PERCOBAAN RSA RSA-CRT
I 3,234 3,136
II 2,394 2,129
III 2,934 1,513
IV 2,355 1,139
V 5,044 3,282
VI 4,283 1,844
VII 3,482 1,398
VIII 3,835 2,566
IX 3,625 1,734
X 5,486 2,093
JUMLAH 36,672 20,834
Berdasarkan percobaan di atas didapat perbedaan waktu proses pada RSA dan RSA-CRT. Proses RSA membutuhkan rata-rata waktu proses 3,667 detik, sementara untuk RSA-CRT membutuhkan waktu rata-rata 2,083 detik. Dengan demikian diperoleh perbedaan waktu proses dimana RSA membutukan waktu 1,584 detik lebih lama sehingga dapat disimpulkan proses pada RSA-CRT lebih cepat dibandingkan dengan RSA.
(55)
BAB 4
KESIMPULAN DAN SARAN
4.1 Kesimpulan
Adapun kesimpulan yang diperoleh dari penelitian ini adalah :
1. Pada RSA standar, baik enkripsi maupun dekripsi merupakan pemangkatan modular (modular exponentiation) yang dapat dilakukan dengan serangkaian perkalian modular. Proses ini memerlukan waktu komputasi yang relatif lama.
2. Waktu komputasi dapat direduksi dengan mengimplementasikan Chinese
Remainder Theorem (CRT) pada RSA.
3. RSA-CRT berbeda dari RSA standar dalam hal pembangkitan kunci dan
dekripsi.
4. Waktu komputasi pada RSA-CRT lebih cepat jika dibandingkan dengan RSA standart.
(56)
4.2 Saran
Beberapa saran dalam penelitian ini adalah :
1. Penigkatan kecepatan komputasi RSA-CRT pada penelitian ini masih bisa ditingkatkan lagi dengan menggunakan algoritma Rebalance RSA atau dengan menggunakan algoritma lainnya.
2. Aplikasi pemrograman yang dibuat dalam penelitian ini bisa dibilang masih sederhana sehingga dalam hal ini masih bisa ditingkatkan dengan program yang lebih komplit.
3. Pembuatan aplikasi pemrograman yang dibuat pada penelitian ini adalah dengan menggunakan bahasa Java dan tidak ditutup kemungkinan jika menggunakan bahasa pemrograman yang lain seperti Visual Basic dan lain-lain.
(57)
DAFTAR PUSTAKA
Artikel non-personal. 2002. Egyptian Hieroglyphs.
http://en.wikipedia.org/wiki/Egyptian_hieroglyphs (diakses tanggal 20 September 2012).
Ariyus, Dony. 2009. Keamanan Multimedia. Yogyakarta : Andi.
Denning, Dorothy Elizabeth R. 1982. Cryptography and Data Security. Purdue University.
Erivani, Putri. 2007. Implementasi Chinese Remainder Theorem Dalam
Membentuk Varian RSA (Rivest-Shamir-Adleman) Untuk Pengamanan Data Digital. Institut Teknologi Bandung.
Munawar. 2012. Perancangan Algoritma Sistem Keamanan Data Menggunakan
Metode Kriptografi Asimetris. Komputa Edisi. 1 Volume. 1. Munir, Rinaldi. 2006. Kriftografi. Bandung : Informatika.
Shinde, G.N dan HS Fadewar. 2008. Faster RSA Algorithm for Decryption Using Chinese Remainder Theorem. ICCES Volume 5 No.4, pp.255-261.
Rahajoeningroem, Tri., dan Muhammad Aria. 2009. Jurnal Studi dan
Implementasi Algoritma RSA untuk Pengamanan Data Transkrip Akademik Mahasiswa. Universitas Komputer Indonesia.
Prabawa, Aditya Eka. 2010. Analisis Perbandingan dan Pengujian Algoritma Kunci Publik RSA dan Paillier. Institut Teknologi Bandung.
Saputra, Dimas Gilang. 2010. Aplikasi Chinese Remainder Theorem dalam Secret Sharing. Institut Teknologi Bandung.
Wagner, Neal R. 2003. The Laws of Cryptography with Java Code.
www.cs.utsa.edu/~wagner/lawsbookcolor/laws.pdf (diakses 27 September 2012).
(58)
LISTING PROGRAM
// RSAPublicKey: RSA public key
import java.math.*; // for BigInteger public class RSAPublicKey {
public BigInteger n; // public modulus
public BigInteger e = new BigInteger("3"); // encryption exponent
public String userName; // attach name to each public/private key pair
public RSAPublicKey(String name) { userName = name;
}
// setN: to give n a value in case only have public key public void setN(BigInteger newN) {
n = newN; }
// getN: provide n
public BigInteger getN() { return n;
}
// RSAEncrypt: just raise m to power e (3) mod n public BigInteger RSAEncrypt(BigInteger m) { return m.modPow(e, n);
}
// RSAVerify: same as encryption, since RSA is symmetric
public BigInteger RSAVerify(BigInteger s) { return s.modPow(e, n);
} }
// RSAPrivateKey: RSA private key import java.math.*; // for BigInteger import java.util.*; // for Random
public class RSAPrivateKey extends RSAPublicKey{
private final BigInteger TWO = new BigInteger("2"); private final BigInteger THREE = new BigInteger("3"); private BigInteger p; // first prime
private BigInteger q; // second prime
private BigInteger d; // decryption exponent
public RSAPrivateKey(int size, Random rnd, String name) {
super(name); generateKeyPair(size, rnd); }
(59)
public void generateKeyPair(int size, Random rnd) { // size = n in bits
// want sizes of primes close, but not too close. Here 10-20 bits apart.
int size1 = size/2; int size2 = size1;
int offset1 = (int)(5.0*(rnd.nextDouble()) + 5.0); int offset2 = -offset1;
if (rnd.nextDouble() < 0.5) {
offset1 = -offset1; offset2 = -offset2; }
size1 += offset1; size2 += offset2;
// generate two random primes, so that p*q = n has size bits
BigInteger p1 = new BigInteger(size1, rnd); // random int
p = nextPrime(p1);
BigInteger pM1 = p.subtract(BigInteger.ONE); BigInteger q1 = new BigInteger(size2, rnd); q = nextPrime(q1);
BigInteger qM1 = q.subtract(BigInteger.ONE); n = p.multiply(q);
BigInteger phiN = pM1.multiply(qM1); // (p-1)*(q-1) BigInteger e = THREE;
d = e.modInverse(phiN); }
// nextPrime: next prime p after x, with p-1 and 3 relatively prime
public BigInteger nextPrime(BigInteger x) {
if ((x.remainder(TWO)).equals(BigInteger.ZERO)) x = x.add(BigInteger.ONE);
while(true) {
BigInteger xM1 = x.subtract(BigInteger.ONE); if
(!(xM1.remainder(THREE)).equals(BigInteger.ZERO)) if (x.isProbablePrime(10)) break; x = x.add(TWO);
}
return x; }
// RSADecrypt: decryption function
public BigInteger RSADecrypt(BigInteger c) { return c.modPow(d, n);
}
// RSASign: same as decryption for RSA (since it is a symmetric PKC)
(60)
public BigInteger RSASign(BigInteger m) { return m.modPow(d, n);
}
public BigInteger RSASignAndEncrypt(BigInteger m, RSAPublicKey other) {
// two ways to go, depending on sizes of n and other.getN()
if (n.compareTo(other.getN()) > 0)
return RSASign(other.RSAEncrypt(m)); else
return other.RSAEncrypt(RSASign(m)); }
public BigInteger RSADecryptAndVerify(BigInteger c, RSAPrivateKey other) {
// two ways to go, depending on sizes of n and other.getN()
if (n.compareTo(other.getN()) > 0)
return other.RSAVerify(RSADecrypt(c)); else
return RSADecrypt(other.RSAVerify(c)); }
}
// RSATest: Test RSA Implementation import java.math.*; // for BigInteger import java.util.*; // for Random public class RSATest {
public static void main(String[] args) { long start;
long end;
start = System.currentTimeMillis();//menghitung waktu proses dalam detik
Random rnd = new Random();
BigInteger m, m1, m2, m3, c, s, s1;
RSAPrivateKey alice = new RSAPrivateKey(1024, rnd, "Alice");
RSAPrivateKey bob = new RSAPrivateKey(1024, rnd, "Bob ");
m = new BigInteger(
"1234567890987654321012345678909876543210" + "1234567890987654321012345678909876543210" + "1234567890987654321012345678909876543210" + "1234567890987654321012345678909876543210" +
(61)
"1234567890987654321012345678909876543210" + "1234567890987654321012345678909876543210"); System.out.println("Pesan Asli m:\n" + m + "\n");
c = bob.RSAEncrypt(m); // Using Bob's public key System.out.println("Pesan Hasil Enkripsi:\n" + c + "\n");
m1 = bob.RSADecrypt(c); // Using Bob's private key System.out.println("Pesan Asli Setelah di
Dekripsi:\n" + m1 + "\n");
end = System.currentTimeMillis();
System.out.println("\nTime : " + ((end - start) / 1000.0) + " detik");
} }
// RSAPublicKey: RSA public key
import java.math.*; // for BigInteger public class RSAPublicKey {
public BigInteger n; // public modulus
public BigInteger e = new BigInteger("3"); // encryption exponent
public String userName; // attach name to each public/private key pair
public RSAPublicKey(String name) { userName = name;
}
// setN: to give n a value in case only have public key public void setN(BigInteger newN) {
n = newN; }
// getN: provide n
public BigInteger getN() { return n;
}
// RSAEncrypt: just raise m to power e (3) mod n public BigInteger RSAEncrypt(BigInteger m) { return m.modPow(e, n);
}
// RSAVerify: same as encryption, since RSA is symmetric
(62)
return s.modPow(e, n); }
}
// RSAPrivateKeyFast: RSA private key, using fast CRT algorithm
import java.math.*; // for BigInteger import java.util.*; // for Random
public class RSAPrivateKeyFast extends RSAPublicKey{ private final BigInteger TWO = new BigInteger("2"); private final BigInteger THREE = new BigInteger("3"); private BigInteger p; // first prime
private BigInteger q; // second prime
private BigInteger d; // decryption exponent
private BigInteger p1, pM1, q1, qM1, phiN; // for key generation
private BigInteger dp, dq, c2; // for fast decryption public RSAPrivateKeyFast(int size, Random rnd, String name) {
super(name); generateKeyPair(size, rnd); }
public void generateKeyPair(int size, Random rnd) { // size = n in bits
// want sizes of primes close, but not too close. Here 10-20 bits apart.
int size1 = size/2; int size2 = size1;
int offset1 = (int)(5.0*(rnd.nextDouble()) + 5.0); int offset2 = -offset1;
if (rnd.nextDouble() < 0.5) {
offset1 = -offset1; offset2 = -offset2; }
size1 += offset1; size2 += offset2;
// generate two random primes, so that p*q = n has size bits
p1 = new BigInteger(size1, rnd); // random int p = nextPrime(p1);
pM1 = p.subtract(BigInteger.ONE); q1 = new BigInteger(size2, rnd); q = nextPrime(q1);
qM1 = q.subtract(BigInteger.ONE); n = p.multiply(q);
phiN = pM1.multiply(qM1); // (p-1)*(q-1) d = e.modInverse(phiN);
(63)
// remaining stuff needed for fast CRT decryption dp = d.remainder(pM1);
dq = d.remainder(qM1); c2 = p.modInverse(q); }
// nextPrime: next prime p after x, with p-1 and 3 relatively prime
public BigInteger nextPrime(BigInteger x) {
if ((x.remainder(TWO)).equals(BigInteger.ZERO)) x = x.add(BigInteger.ONE);
while(true) {
BigInteger xM1 = x.subtract(BigInteger.ONE); if
(!(xM1.remainder(THREE)).equals(BigInteger.ZERO)) if (x.isProbablePrime(10)) break; x = x.add(TWO);
}
return x; }
// RSADecrypt: decryption function, fast CRT version public BigInteger RSADecrypt(BigInteger c) {
// See 14.71 and 14.75 in Handbook of Applied Cryptography, by
// Menezes, van Oorschot and Vanstone // return c.modPow(d, n);
BigInteger cDp = c.modPow(dp, p); BigInteger cDq = c.modPow(dq, q); BigInteger u =
((cDq.subtract(cDp)).multiply(c2)).remainder(q);
if (u.compareTo(BigInteger.ZERO) < 0) u = u.add(q); return cDp.add(u.multiply(p));
}
// RSASign: same as decryption for RSA (since it is a symmetric PKC)
public BigInteger RSASign(BigInteger m) { // return m.modPow(d, n);
return RSADecrypt(m); // use fast CRT version }
public BigInteger RSASignAndEncrypt(BigInteger m, RSAPublicKey other) {
// two ways to go, depending on sizes of n and other.getN()
if (n.compareTo(other.getN()) > 0)
return RSASign(other.RSAEncrypt(m)); else
(64)
return other.RSAEncrypt(RSASign(m)); }
public BigInteger RSADecryptAndVerify(BigInteger c, RSAPrivateKeyFast other) {
// two ways to go, depending on sizes of n and other.getN()
if (n.compareTo(other.getN()) > 0)
return other.RSAVerify(RSADecrypt(c)); else
return RSADecrypt(other.RSAVerify(c)); }
}
// RSATestFast: Test Fast RSA Implementation import java.math.*; // for BigInteger
import java.util.*; // for Random public class RSATestFast {
public static void main(String[] args) { long start;
long end;
start = System.currentTimeMillis();//menghitung waktu proses dalam detik
Random rnd = new Random();
BigInteger m, m1, m2, m3, c, s, s1; RSAPrivateKeyFast alice = new
RSAPrivateKeyFast(1024, rnd, "Alice"); RSAPrivateKeyFast bob = new RSAPrivateKeyFast(1024, rnd, "Bob "); m = new BigInteger(
"1234567890987654321012345678909876543210" + "1234567890987654321012345678909876543210" + "1234567890987654321012345678909876543210" + "1234567890987654321012345678909876543210" + "1234567890987654321012345678909876543210" + "1234567890987654321012345678909876543210"); System.out.println("Pesan Asli m:\n" + m + "\n"); c = bob.RSAEncrypt(m); // Using Bob's public key System.out.println("Pesan setelah Di Enkripsi :\n" + c + "\n");
m1 = bob.RSADecrypt(c); // Using Bob's private key System.out.println("Pesan Asli setelah di
Dekripsi:\n" + m1 + "\n");
(65)
System.out.println("\nTime : " + ((end - start) / 1000.0) + " detik");
(1)
public BigInteger RSASign(BigInteger m) { return m.modPow(d, n);
}
public BigInteger RSASignAndEncrypt(BigInteger m, RSAPublicKey other) {
// two ways to go, depending on sizes of n and other.getN()
if (n.compareTo(other.getN()) > 0)
return RSASign(other.RSAEncrypt(m)); else
return other.RSAEncrypt(RSASign(m)); }
public BigInteger RSADecryptAndVerify(BigInteger c, RSAPrivateKey other) {
// two ways to go, depending on sizes of n and other.getN()
if (n.compareTo(other.getN()) > 0)
return other.RSAVerify(RSADecrypt(c)); else
return RSADecrypt(other.RSAVerify(c)); }
}
// RSATest: Test RSA Implementation import java.math.*; // for BigInteger import java.util.*; // for Random public class RSATest {
public static void main(String[] args) { long start;
long end;
start = System.currentTimeMillis();//menghitung waktu proses dalam detik
Random rnd = new Random();
BigInteger m, m1, m2, m3, c, s, s1;
RSAPrivateKey alice = new RSAPrivateKey(1024, rnd, "Alice");
RSAPrivateKey bob = new RSAPrivateKey(1024, rnd, "Bob ");
m = new BigInteger(
"1234567890987654321012345678909876543210" + "1234567890987654321012345678909876543210" + "1234567890987654321012345678909876543210" + "1234567890987654321012345678909876543210" +
(2)
"1234567890987654321012345678909876543210" + "1234567890987654321012345678909876543210"); System.out.println("Pesan Asli m:\n" + m + "\n");
c = bob.RSAEncrypt(m); // Using Bob's public key System.out.println("Pesan Hasil Enkripsi:\n" + c + "\n");
m1 = bob.RSADecrypt(c); // Using Bob's private key System.out.println("Pesan Asli Setelah di
Dekripsi:\n" + m1 + "\n");
end = System.currentTimeMillis();
System.out.println("\nTime : " + ((end - start) / 1000.0) + " detik");
} }
// RSAPublicKey: RSA public key
import java.math.*; // for BigInteger public class RSAPublicKey {
public BigInteger n; // public modulus
public BigInteger e = new BigInteger("3"); // encryption exponent
public String userName; // attach name to each public/private key pair
public RSAPublicKey(String name) { userName = name;
}
// setN: to give n a value in case only have public key public void setN(BigInteger newN) {
n = newN; }
// getN: provide n
public BigInteger getN() { return n;
}
// RSAEncrypt: just raise m to power e (3) mod n public BigInteger RSAEncrypt(BigInteger m) { return m.modPow(e, n);
}
// RSAVerify: same as encryption, since RSA is symmetric
(3)
return s.modPow(e, n); }
}
// RSAPrivateKeyFast: RSA private key, using fast CRT algorithm
import java.math.*; // for BigInteger import java.util.*; // for Random
public class RSAPrivateKeyFast extends RSAPublicKey{ private final BigInteger TWO = new BigInteger("2"); private final BigInteger THREE = new BigInteger("3"); private BigInteger p; // first prime
private BigInteger q; // second prime
private BigInteger d; // decryption exponent
private BigInteger p1, pM1, q1, qM1, phiN; // for key generation
private BigInteger dp, dq, c2; // for fast decryption public RSAPrivateKeyFast(int size, Random rnd, String name) {
super(name); generateKeyPair(size, rnd); }
public void generateKeyPair(int size, Random rnd) { // size = n in bits
// want sizes of primes close, but not too close. Here 10-20 bits apart.
int size1 = size/2; int size2 = size1;
int offset1 = (int)(5.0*(rnd.nextDouble()) + 5.0); int offset2 = -offset1;
if (rnd.nextDouble() < 0.5) {
offset1 = -offset1; offset2 = -offset2; }
size1 += offset1; size2 += offset2;
// generate two random primes, so that p*q = n has size bits
p1 = new BigInteger(size1, rnd); // random int p = nextPrime(p1);
pM1 = p.subtract(BigInteger.ONE); q1 = new BigInteger(size2, rnd); q = nextPrime(q1);
qM1 = q.subtract(BigInteger.ONE); n = p.multiply(q);
phiN = pM1.multiply(qM1); // (p-1)*(q-1) d = e.modInverse(phiN);
(4)
// remaining stuff needed for fast CRT decryption dp = d.remainder(pM1);
dq = d.remainder(qM1); c2 = p.modInverse(q); }
// nextPrime: next prime p after x, with p-1 and 3 relatively prime
public BigInteger nextPrime(BigInteger x) {
if ((x.remainder(TWO)).equals(BigInteger.ZERO)) x = x.add(BigInteger.ONE);
while(true) {
BigInteger xM1 = x.subtract(BigInteger.ONE); if
(!(xM1.remainder(THREE)).equals(BigInteger.ZERO)) if (x.isProbablePrime(10)) break; x = x.add(TWO);
}
return x; }
// RSADecrypt: decryption function, fast CRT version public BigInteger RSADecrypt(BigInteger c) {
// See 14.71 and 14.75 in Handbook of Applied Cryptography, by
// Menezes, van Oorschot and Vanstone // return c.modPow(d, n);
BigInteger cDp = c.modPow(dp, p); BigInteger cDq = c.modPow(dq, q); BigInteger u =
((cDq.subtract(cDp)).multiply(c2)).remainder(q);
if (u.compareTo(BigInteger.ZERO) < 0) u = u.add(q); return cDp.add(u.multiply(p));
}
// RSASign: same as decryption for RSA (since it is a symmetric PKC)
public BigInteger RSASign(BigInteger m) { // return m.modPow(d, n);
return RSADecrypt(m); // use fast CRT version }
public BigInteger RSASignAndEncrypt(BigInteger m, RSAPublicKey other) {
// two ways to go, depending on sizes of n and other.getN()
if (n.compareTo(other.getN()) > 0)
return RSASign(other.RSAEncrypt(m)); else
(5)
return other.RSAEncrypt(RSASign(m)); }
public BigInteger RSADecryptAndVerify(BigInteger c, RSAPrivateKeyFast other) {
// two ways to go, depending on sizes of n and other.getN()
if (n.compareTo(other.getN()) > 0)
return other.RSAVerify(RSADecrypt(c)); else
return RSADecrypt(other.RSAVerify(c)); }
}
// RSATestFast: Test Fast RSA Implementation import java.math.*; // for BigInteger
import java.util.*; // for Random public class RSATestFast {
public static void main(String[] args) { long start;
long end;
start = System.currentTimeMillis();//menghitung waktu proses dalam detik
Random rnd = new Random();
BigInteger m, m1, m2, m3, c, s, s1; RSAPrivateKeyFast alice = new
RSAPrivateKeyFast(1024, rnd, "Alice"); RSAPrivateKeyFast bob = new RSAPrivateKeyFast(1024, rnd, "Bob "); m = new BigInteger(
"1234567890987654321012345678909876543210" + "1234567890987654321012345678909876543210" + "1234567890987654321012345678909876543210" + "1234567890987654321012345678909876543210" + "1234567890987654321012345678909876543210" + "1234567890987654321012345678909876543210"); System.out.println("Pesan Asli m:\n" + m + "\n"); c = bob.RSAEncrypt(m); // Using Bob's public key System.out.println("Pesan setelah Di Enkripsi :\n" + c + "\n");
m1 = bob.RSADecrypt(c); // Using Bob's private key System.out.println("Pesan Asli setelah di
Dekripsi:\n" + m1 + "\n");
(6)
System.out.println("\nTime : " + ((end - start) / 1000.0) + " detik");