Penambahan Chinese Reminder Theorem Untuk Mempercepat Proses Enkripsi Dan Dekripsi Pada RSA

(1)

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 axb (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");