APLIKASI FUNGSI HASH MD5 DAN ALGORITMA RSA UNTUK PEMBUATAN SIDIK DIJITAL
oleh HIMAWAN YUSUF M0102027
SKRIPSI ditulis dan diajukan untuk memenuhi sebagian persyaratan memperoleh gelar Sarjana Sains Matematika
FAKULTAS MATEMATIKA DAN ILMU PENGETAHUAN ALAM UNIVERSITAS SEBELAS MARET SURAKARTA 2006
PENGESAHAN SKRIPSI APLIKASI FUNGSI HASH MD5 DAN ALGORITMA RSA UNTUK PEMBUATAN SIDIK DIJITAL yang disiapkan dan disusun oleh HIMAWAN YUSUF NIM. M0102027 Dibimbing oleh Pembimbing I
Pembimbing II
Drs. Wiranto, M. Kom
Drs. Sugiyanto, M.Si
NIP. 132 044 769 NIP. 132 000 804 Telah dipertahankan di depan Dewan Penguji Pada hari Kamis, tanggal 19 Oktober 2006 dan dinyatakan telah memenuhi syarat. Anggota Tim Penguji 1. Dr. Sutanto, S.Si, DEA
Tanda Tangan 1.
NIP. 132 149 079 2. Umi Salamah, M.Kom
2.
NIP. 132 162 555 3. Sri Kuntari, M.Si
3.
NIP. 132 240 173 Surakarta, 1 November 2006 Disahkan oleh Fakultas Matematika dan Ilmu pengetahuan Alam Dekan,
Ketua Jurusan Matematika,
Drs. Marsusi, M.S.
Drs. Kartiko, M.Si.
NIP. 130 906 776
NIP. 131 569 203
ABSTRAK Himawan Yusuf, 2006. APLIKASI FUNGSI HASH MD5 DAN ALGORITMA RSA UNTUK PEMBUATAN SIDIK DIJITAL, Fakultas Matematika dan Ilmu Pengetahuan Alam, Universitas Sebelas Maret. Pengamanan data tidak hanya sebatas data tersebut tidak dapat dibaca orang lain, tetapi juga bagaimana agar data tersebut tidak dapat diubah dan dapat dipastikan dikirim oleh orang yang benar. Selama berabad-abad lamanya tanda tangan telah digunakan untuk membuktikan keabsahan dokumen. Oleh karena itu, data yang dikirim perlu diberi suatu tanda bahwa data tersebut sah. Dari pemikiran tersebut, munculah ide untuk membuat sidik dijital (digital signature). Salah satu cara untuk membuat sidik dijital adalah dengan menggunakan fungsi hash MD5 dan algoritma RSA. Tujuan dari penelitian ini adalah mengetahui kinerja dari fungsi hash MD5 dan algoritma RSA dalam membuat sidik dijital dan membuktikan keabsahan data dengan menggunakan sidik dijital. Selanjutnya dilakukan analisis untuk mengetahui apakah sidik dijital tersebut mampu menjaga keabsahan data. Dari penelitian yang telah dilakukan, diketahui bahwa fungsi hash MD5 dan algoritma RSA membuat sidik dijital dengan cara algoritma RSA mengenkripsikan message digest (pesan ringkas) yang dibuat oleh fungsi hash MD5. Kemudian untuk membuktikan keabsahan data, hasil dekripsi sidik dijitalnya disamakan dengan message digest dari data yang diterima. Setelah diadakan pengujian dan analisa dapat diambil kesimpulan bahwa fungsi hash MD5 dan algoritma RSA mampu membuat sidik dijital yang dapat digunakan untuk menjaga keabsahan data. Kata Kunci : sidik dijital, fungsi hash MD5, algoritma RSA, message digest, keabsahan data
ABSTRACT Himawan Yusuf, 2006. THE APPLICATION OF MD5 HASH FUNCTION AND RSA ALGORITHM FOR MAKING DIGITAL SIGNATURE. Faculty of Mathematics and Natural Sciences Sebelas Maret University. Data security is not merely limited to only prohibit acces from other people, but it also keeps the data unchanged by making sure it is completely delivered to right person. For centuries, the hand signature have been used to prove that the document is valid. So, the data which is sent to the second party needs a proof of validity or legality. The tought concerning to that system grows an idea for making digital signature. One of the ways for making digital signature is by employing MD5 hash function and RS algorithm. The aim of the research is to know the working system of MD5 hash function and RSA algorithm for making digital signature and to prove data validity by using digital signature system. Then the analysis is conducted to know the ability of digital signature in keeping data validity. From this research, it is known that MD5 hash function and RSA algorithm make digital signature in the way that RSA algorithm encrypts the message digest made by MD5 hash function. To prove data validity, the result of digital signature decryption must be equal to message digest from data received. After the test and analysis are conducted, it is concluded that MD5 hash function and RSA algorithm is able to make digital signature to keep data validity. Keys : digital signature, MD5 hash function, RSA algorithm, message digest, data validity
MOTO Tiga kunci sesoeorang untuk mencapai keberhasilan adalah 1. ilmu, 2. usaha, 3. rahmat Allah. (Penulis) Allah tidak akan memberi beban kepada hambanya melainkan sesuai dengan kemampuannya. (QS Al Baqarah : 286)
PERSEMBAHAN
Karya ini kupersembahkan untuk : - Ibunda tersayang, metode kesabaran dan kurikulum berbasis kasih sayang yang kau berikan adalah pendidikan terbaik yang pernah kuterima sepanjang hidupku, terimakasih bunda. - Ayahanda, semoga anakmu ini bisa membuatmu bangga. - Mas dan Mbakku yang selalu mendukung dan mendo’akanku Mas Sholikin, Mbak Mung, Mas Nang, Mbak Endah, Mbak Ren, Mas Santoso,dan Ubub. - 7 keponakanku yang lucu-lucu: Fahri, Ali, Sisil, Sasa, Rahil, Aviv, dan Friday. - Calon istriku, semoga engkau bisa menjadi istri yang sholehah. - Pengurus HIMATIKA 2004/2005, the best team in my life.
KATA PENGANTAR Assalaamu’alaikum Wr. Wb. Alhamdulillah, puji syukur penulis panjatkan kepada Allah SWT yang telah melimpahkan rahmat dan kasih sayangnya sehingga skripsi ini dapat terselesaikan. Sholawat dan salam semoga selalu tercurah kepada suri tauladan Rasulullah Muhammad SAW, serta keluarga, sahabat, dan orang-orang yang istiqomah di jalan-Nya. Terselesaikannya skripsi ini tidak terlepas dari bantuan beberapa pihak. Untuk itu penulis mengucapkan terimakasih kepada : 1. Drs. Wiranto, M.Kom, selaku pembimbing I yang telah meluangkan waktunya untuk memberikan bimbingan dan motivasi kepada penulis. 2. Drs. Sugiyanto, M.Si, selaku pembimbing II yang juga telah banyak membantu penulis dalam menyelesaikan skripsi ini. 3. Dra. Sri Subanti, M.Si, selaku pembimbing akademis yang telah memberikan perhatian dan bimbingan kepada penulis. 4. Lisda, Ardina, dan Misbachul yang telah memberikan banyak bantuan kepada penulis. 5. Eko Pramudyo Hadi, S.Si dan Winarno, S.Si yang telah memberi inspirasi, motivasi dan bimbingan kepada penulis. 6. Najib dan Karin yang telah memberikan bantuan, saran, dan kritik kepada penulis. 7. Teman-teman angkatan 2002 dan 2003 yang memberikan bantuan dan motivasi. 8. SAT UNS dan TEAM SAT UNS 2006 yang telah memberikan bantuan dan fasilitas kepada penulis. 9. UPT PUSKOM UNS yang telah meminjamkan fasilitas kepada penulis. 10. Semua pihak yang telah membantu penulis dalam menyusun skripsi ini.
Semoga Allah SWT membalas segala bantuan yang telah diberikan kepada penulis. Semoga skripsi ini dapat bermanfaat bagi semua pihak yang membutuhkan. Surakarta, 12 Oktober 2006 Penulis
DAFTAR ISI JUDUL
i
PENGESAHAN
ii
ABSTRAK
iii
ABSTRACT
iv
MOTO
v
PERSEMBAHAN
vi
KATA PENGANTAR
vii
DAFTAR ISI
ix
DAFTAR TABEL
xi
DAFTAR GAMBAR
xii
DAFTAR LAMPIRAN
xiii
DAFTAR NOTASI
xiv
I
PENDAHULUAN
1
1.1. Latar Belakang Masalah .............................................................
1
1.2. Perumusan Masalah ....................................................................
2
1.3. Batasan Masalah .........................................................................
3
1.4. Tujuan .........................................................................................
3
1.5. Manfaat .......................................................................................
3
II LANDASAN TEORI
4
2.1. Kajian Pustaka ............................................................................
4
2.1.1. Keamanan Data ..............................................................
5
2.1.2. Kriptografi ......................................................................
6
2.1.3. Fungsi Hash ....................................................................
7
2.1.4. Algoritma MD5 ..............................................................
10
2.1.4. RSA Cryptosystem .........................................................
17
2.1.5. Sidik Dijital ....................................................................
19
2.2. Kerangka Pemikiran ...................................................................
20
III METODOLOGI PENELITIAN
22
IV PEMBAHASAN
23
4.1. Pembuatan Sidik Dijital..............................................................
23
4.1.1. Prosedur Pembuatan Message Digest..............................
24
4.1.2. Prosedur Menghasilkan Kunci Untuk Setiap Pemakai ...
24
4.1.3. Prosedur Enkripsi Untuk Pengirim .................................
25
4.2. Analisis Keabsahan Data .............................................................. 25 4.2.1. Prosedur Dekripsi Untuk Penerima .................................. 26 4.2.2. Prosedur Verifikasi Sidik Dijital ...................................... 26 4.3. Penerapan Kasus ........................................................................... 27 4.3.1. Tahap Pembuatan Sidik Dijital ......................................... 28 4.3.1.1. Tahap Pembuatan Message Digest .................... 28 4.3.1.2. Tahap Menghasilkan Kunci Pribadi dan Kunci Publik ................................................................. 28 4.3.1.3. Tahap Enkripsi Untuk Operator ........................... 29 4.3.2. Tahap Analisis Keabsahan Data ....................................... 31 4.4. Pembuatan dan Pengujian Aplikasi .............................................. 32 4.4.1. Pembuatan Aplikasi Untuk Pengirim ................................. 33 4.4.2. Pengujian Aplikasi Untuk Pengirim ................................... 37 4.4.3. Pembuatan Aplikasi Untuk Penerima ................................. 42 4.4.4. Pengujian Aplikasi Untuk Penerima ................................... 44 4.5. Analisis Kelebihan dan Kelemahan Pembuatan Sidik Dijital dengan Menggunakan Fungsi Hash MD5 dan Algoritma RSA .. 46 V PENUTUP
48
5.1. Kesimpulan ................................................................................... 48 5.2. Saran ............................................................................................. 48 DAFTAR PUSTAKA .................................................................................. 49 LAMPIRAN ................................................................................................ 50
DAFTAR TABEL Tabel 2.1.
Fungsi-fungsi dasar MD5 ................................................ 14
Tabel 2.2.
Nilai T[i] .......................................................................... 14
Tabel 2.3.
Rincian operasi pada fungsi F (b, c, d) (kiri) dan fungsi G (b, c, d) (kanan) ................................................. 15
Tabel 2.4.
Rincian operasi pada fungsi H (b, c, d) (kiri) dan fungsi I (b, c, d) (kanan) .................................................. 16
DAFTAR GAMBAR Gambar 2.1. Hubungan kebijakan dan mekanisme keamanan ............. 5 Gambar 2.2. Proses enkripsi dan deskripsi sederhana .......................... 6 Gambar 2.3. Proses enkripsi dan deskripsi kunci simetris .................... 7 Gambar 2.4. Proses enkripsi dan dekripsi kunci asimetris ................... 8 Gambar 2.5. Pembuatan message digest dengan algoritma MD5 ....... 10 Gambar 2.6. Pengolahan blok 512 bit (Proses HMD5) ........................... 12 Gambar 2.7. Operasi dasar MD5 ........................................................... 13 Gambar 4.1. Skema pembuatan sidik dijital dengan menggunakan fungsi hash ........................................................................ 23 Gambar 4.2. Otentikasi dengan sidik dijital menggunakan fungsi hash satu-arah ................................................................... 26 Gambar 4.3. Form regristrasi pelanggan prabayar ................................ 27 Gambar 4.4. Skema regristrasi pengguna kartu prabayar ...................... 28 Gambar 4.5. Alur sistem pembuatan sidik dijital .................................. 33 Gambar 4.6. Form petunjuk pemakaian aplikasi ................................... 37 Gambar 4.7. Form regristrasi ................................................................. 38 Gambar 4.8. Form pembuatan message digest ...................................... 38 Gambar 4.9. Peringatan apabila kunci yang dimasukkan tidak prima .. 39 Gambar 4.10. Form pembuatan kunci ................................................... 39 Gambar 4.11. Kunci publik yang dikirimkan kepada penerima ............ 40 Gambar 4.12. Form enkripsi message digest ......................................... 40 Gambar 4.13. Sidik dijital hasil dari enkripsi message digest ............... 41 Gambar 4.14. Alur sistem verifikasi sidik dijital ................................... 42 Gambar 4.15. Form petunjuk pemakaian aplikasi ................................. 44 Gambar 4.16. Tampilan form verifikasi sidik dijital ketika data sah .... 45 Gambar 4.17. Tampilan form verifikasi sidik dijital ketika data tidak sah .................................................................. 45
DAFTAR LAMPIRAN Fungsi dan prosedur yang digunakan dalam aplikasi ............................ 51 Source code fungsi hash MD5 ............................................................... 56 (dari www.ficthner.net/delphi/md5.delphi.phtml) Source code aplikasi pembuatan sidik dijital ......................................... 64 Source code aplikasi verifikasi sidik dijital ......................................... 70
DAFTAR NOTASI h
: Nilai hash.
g
: Salah satu fungsi F, G, H, I.
CLSs
: Circular left shift sebanyak s bit.
X[k]
: Kelompok 32-bit ke-k dari blok 512 bit message ke-q. Nilai k=0 sampai 15.
T[i]
: Elemen Tabel T ke-i (32 bit).
+
: Operasi penjumlahan modulo 232.
IV
: Initial vector dari penyangga ABCD, yang dilakukan pada proses inisialisasi penyangga.
Yq
: Blok pesan berukuran 512-bit ke-q.
L
: Jumlah blok pesan.
MD
: Nilai akhir message digest.
p
: Kunci bilangan prima ke-1.
q
: Kunci bilangan prima ke-2.
r
: Perkalian p dan q.
φ(r)
: Perkalian (p – 1) dan (q – 1).
PK
: Kunci publik.
SK
: Kunci Rahasia.
X
: Plaintext.
Y
: Chipertext
S
: Sidik dijital.
BAB I PENDAHULUAN 1.1. Latar Belakang Kemajuan di bidang teknologi informasi telah memungkinkan seseorang untuk melakukan komunikasi dan transaksi bisnis secara on-line. Kegiatan-kegiatan tersebut tentu saja akan menimbulkan resiko apabila informasi yang sensitif dan berharga itu diakses oleh orang-orang yang tidak berhak. Dengan berpindahnya data dari titik A ke titik B di internet, data itu akan melalui beberapa titik lain selama perjalanan dan membuka kesempatan bagi pihak lain untuk memotong, membaca, merusak, atau merubah tujuan data (Nursanto, 2003). Misalnya, informasi mengenai data pengguna kartu prabayar yang melakukan regristrasi, apabila informasi ini jatuh kepada orangorang jahat dimungkinkan beberapa data seperti nomor kartu atau nomor id diubah, sehingga ketika nomor kartu yang digantikan itu melakukan tindakan kriminal, yang tertangkap adalah orang yang sebenarnya tidak mengetahui apa-apa. Beberapa cara telah dikembangkan untuk menangani masalah keamanan ini, salah satu teknik mengamankan data dari suatu sistem informasi adalah dengan algoritma penyandian data atau yang biasa disebut dengan kriptografi. Kriptografi merupakan bagian dari suatu cabang ilmu matematika (cryptology) yang dapat dimanfaatkan untuk kepentingan keamanan pesan (Nursanto, 2003). Pengamanan data tidak hanya sebatas data tersebut tidak dapat dibaca orang lain, tetapi juga bagaimana agar data tersebut tidak dapat diubah dan dapat dipastikan dikirim oleh orang yang benar. Selama berabad-abad lamanya tanda tangan telah digunakan untuk membuktikan keabsahan dokumen. Oleh karena itu, data yang dikirim perlu diberi suatu tanda bahwa data tersebut sah. Dari pemikiran tersebut, munculah ide untuk membuat sidik dijital (digital signature). Menurut Munir (2004), sidik dijital bukanlah tanda tangan yang didijitasi dengan alat scanner, tetapi suatu nilai kriptografis yang
bergantung pada pesan dan pengirim pesan (hal ini kontras dengan tanda tangan pada dokumen kertas yang bergantung hanya pada pengirim dan selalu sama untuk semua dokumen). Sidik dijital dapat dibuat dengan mengubah data menjadi message digest oleh fungsi hash tertentu. Kemudian dari message digest tersebut dibuat sidik dijital dengan algoritma kriptografi. Pada tahun 1991, Ronald Rivest memperkenalkan fungsi hash MD5 (Message Digest Algorithm 5). MD5 adalah fungsi hash kriptografik yang digunakan secara luas dengan hash value 128-bit. Pada standar internet (RFC 1321), MD5 telah dimanfaatkan secara bermacam-macam pada aplikasi keamanan, dan MD5 juga umum digunakan untuk melakukan pengujian integritas sebuah file. Sebelumnya, pada tahun 1977 Rivest bersama Shamir dan Adleman membuat sebuah algoritma untuk teori penomoran pada sebuah public-key cryptosystem, algoritma ini dikenal dengan RSA cryptosystem. Algoritma RSA (Rivest Shamir Adleman) menggunakan kunci asimetris yang menggunakan dua kunci dalam proses enkripsi dekripsi, sehingga mempunyai tingkat keamanan lebih tinggi dibandingkan algortima yang menggunakan kunci simetris. Menurut Munir (2004) untuk membuat sidik dijital, algoritma yang cocok digunakan hanyalah algoritma kunci publik. Dengan fungsi hash MD5 dan algoritma RSA, diharapkan dapat menghasilkan sidik dijital yang mampu menjamin keabsahan data. 1.2. Perumusan Masalah Dari latar belakang masalah tersebut, dapat dirumuskan permasalahan yang sedang dihadapi, yaitu : 1. Bagaimana kinerja dari fungsi hash MD5 dan algoritma RSA dalam membuat sidik dijital. 2. Bagaimana membuktikan keabsahan data dengan menggunakan sidik dijital. 3. Bagaimana kemampuan sidik dijital yang dibuat oleh fungsi hash MD5 dan algoritma RSA dalam menjaga keabsahan data.
1.3. Batasan Masalah Dalam penelitian ini, permasalahan yang dibahas dibatasi pada pembahasan mengenai sidik dijital saja. Penyandian (enkripsi atau dekripsi) data tidak dibahas disini. 1.4. Tujuan Tujuan dari penelitian ini adalah sebagai berikut. 1.
Mengetahui kinerja dari fungsi hash MD5 dan algoritma RSA dalam membuat sidik dijital.
2.
Dapat membuktikan keabsahan suatu data dengan menggunakan sidik dijital.
3.
Mengetahui sidik dijital yang dibuat oleh fungsi hash MD5 dan algoritma RSA mampu menjaga keabsahan data. 1.5. Manfaat Dari penelitian ini diharapkan pembuatan sidik dijital dengan
menggunakan fungsi hash MD5 dan algoritma RSA dapat diaplikasikan untuk mengatasi masalah pemalsuan dokumen, sabotase informasi, dan masalah kejahatan lain yang melibatkan pengubahan isi data maupun pengirimnya.
BAB II LANDASAN TEORI 2.1. Tinjauan Pustaka Untuk mencapai tujuan penelitian, diperlukan pengertian dan teoriteori yang melandasinya. Pada bab ini diberikan penjelasan tentang keamanan data, kriptografi, fungsi hash, algoritma MD5, RSA cryptosystem, dan sidik dijital yang diperoleh dari beberapa referensi.
2.1.1. Keamanan Data Data atau pesan yang diperhatikan dan perlu diamankan adalah yang bersifat rahasia. Menurut Susanto (2004), tujuan utama adanya keamanan adalah untuk membatasi akses terhadap informasi dan hanya untuk pemakai yang memiliki hak akses. Beberapa ancaman yang harus diperhatikan dalam sistem keamanan data adalah 1. leakage (kebocoran), yaitu pengambilan informasi oleh penerima yang tidak berhak, 2. tampering, yaitu pengubahan informasi yang tidak legal, 3. validasm (perusakan), yaitu gangguan operasi sistem tertentu. Beberapa metode penyerangan terhadap keamanan, yaitu 1. eavesdropping, yaitu mendapatkan duplikasi pesan tanpa ijin, 2. masquerading, yaitu mengirim atau menerima pesan menggunakan identitas lain tanpa seizin pemilik, 3. message tampering, yaitu menghadang atau menangkap pesan dan mengubah isinya sebelum dilanjutkan ke penerima sebenarnya. Dalam keamanan data perlu diadakan pemisahan antara kebijakan dan mekanisme keamanan, yang akan membantu memisahkan kebutuhan implementasinya, karena kebijakan dapat menspesifikasikan kebutuhan dan mekanisme dapat menerapkan spesifikasi kebijakan tersebut.
Berdasarkan spesifikasi dari OSI (Open Systems Interconnection), sebuah layanan (kebijakan) keamanan meliputi 1. access control, yaitu perlindungan data terhadap pemakaian tak legal, 2. authentication, yaitu menyediakan jaminan identitas seseorang, 3. confidentiality (kerahasiaan), yaitu pengungkapan terhadap identitas tak legal, 4. integrity, yaitu melindungi dari pengubahan data, 5. non-repudiation (penyangkalan), yaitu melindungi terhadap penolakan komunikasi yang sudah pernah dilakukan. Untuk mencapai keamanan tersebut, menurut Susanto (2004) mekanisme-mekanisme yang dapat diterapkan, yaitu 1. enkripsi, dapat digunakan untuk menyediakan kerahasiaan pesan, dapat menyediakan authentication dan perlindungan identitas, 2. sidik dijital (digital signature), dapat digunakan untuk menyediakan authentication, perlindungan indentitas, dan non-repudiation, 3. algoritma checksum atau hash, dapat digunakan untuk menyediakan perlindungan integritas, dan dapat menyediakan authentication. Dalam keamanan data, hubungan antara kebijakan (layanan) dengan mekanisme keamanan dapat digambarkan sebagai berikut.
Kebijakan
SSL Enkripsi
RSA
DES
Signature
DSA
RSA
Hashing
SHA1
MD5
Mekanisme
Algoritma
Gambar 2.1. Hubungan kebijakan dan mekanisme keamanan.
2.1.2. Kriptografi 1. Terminologi Kriptografi
(Cryptography)
merupakan
seni
dan
ilmu
menyembunyikan informasi dari penerima yang tidak berhak. Kriptografi (Cryptography) berasal dari bahasa Yunani yaitu dari kata “cryptos” berarti tersembunyi dan “graphien” yang berarti menulis. Jadi kriptografi (cryptography) artinya penulisan tersembunyi atau penulisan rahasia (Rahayu, 2005). Dalam menjaga kerahasiaan data, kriptografi mentransformasikan data asli (plaintext) ke dalam bentuk data sandi (ciphertext) yang tidak dapat dikenali. Ciphertext inilah yang kemudian dikirimkan oleh pengirim (sender) kepada penerima (receiver). Setelah sampai di penerima, ciphertext tersebut ditranformasikan kembali ke dalam bentuk plaintext agar dapat dikenali (Sukaridhoto, 2005). Proses tranformasi dari plaintext menjadi ciphertext disebut proses encipherment
atau
enkripsi
(encryption),
sedangkan
proses
mentransformasikan kembali ciphertext menjadi plaintext disebut proses dekripsi (decryption). Dalam melakukan enkripsi dan dekripsi data, kriptografi menggunakan suatu algoritma (cipher) dan kunci (key). Cipher adalah fungsi matematika yang digunakan untuk mengenkripsi dan mendekripsi. Sedangkan kunci merupakan sederetan bit yang diperlukan untuk mengenkripsi dan mendekripsi data. Plaintex t
Enkripsi
Kunci
Chipertex t
Dekripsi
Kunci
Gambar 2.2. Proses enkripsi dan deskripsi sederhana
Plaintex t
Algoritma kriptografi modern tidak lagi mengandalkan kerahasiaan algoritma tetapi kerahasiaan kunci. Jadi algoritma kriptografi dapat bersifat umum dan boleh diketahui siapa saja, karena tanpa pengetahuan tentang kunci maka data yang tersandi tetap saja tidak dapat dipecahkan. Akan tetapi berlaku sebaliknya untuk kunci, karena plaintext yang sama bila disandikan dengan kunci yang berbeda akan menghasilkan ciphertext yang berbeda, walaupun dengan algoritma yang sama. Istilah-istilah dalam kriptografi, antara lain cryptosystem, Cryptographers, cryptanalysis, Cryptanalyst, dan cryptology. Cryptosystem adalah sebuah algoritma kriptografi ditambah semua kemungkinan plaintext, ciphertext dan kunci. Para pelaku atau praktisi kriptografi disebut Cryptographers. Cryptanalysis adalah aksi untuk memecahkan mekanisme kriptografi dengan cara mendapatkan plaintext atau kunci dari ciphertext yang digunakan untuk mendapatkan informasi berharga kemudian mengubah atau memalsukan pesan dengan tujuan untuk menipu penerima yang sesungguhnya, atau memecahkan ciphertext. Cryptanalyst adalah pelaku atau praktisi yang menjalankan cryptanalysis. Cryptology merupakan gabungan dari cryptography dan cryptanalysis (Rahayu, 2005).
2. Algoritma Kriptografi Berdasarkan kunci yang dipakai, algoritma kriptografi modern dibagi menjadi dua macam, yaitu : a. Kunci Simetris Pada kunci simetris jenis kunci yang digunakan untuk membuat pesan yang disandikan (enkripsi) sama dengan kunci untuk membuka pesan yang disandikan (dekripsi). Jadi pengirim dan penerima pesan harus memiliki kunci yang sama (Budiyono, 2004). Proses enkripsi-dekripsi dengan algoritma kunci simetris dapat dilihat pada gambar 2.3.
Plaintex t
Enkripsi
Chipertex t
Kunci Rahasia
Dekripsi
Plaintex t
Kunci Rahasia
Gambar 2.3. Proses enkripsi dan deskripsi kunci simetris Contoh algoritma kunci simetris adalah DES (Data Encryption Standard), AES (Advanced Encryption Standard), Blowfish, IDEA (International Data Encryption Algorithm), OTP (One-Time-Pad), dan lain-lain. b. Kunci Asimetris Pada kunci asimetris jenis kunci yang digunakan untuk enkripsi tidak sama dengan kunci untuk dekripsi. Kunci publik digunakan untuk mengenkripsi suatu pesan dimiliki oleh semua orang, dan kunci pribadi digunakan untuk mendekripsikan pesan yang dikirim untuknya dimiliki satu orang (Budiyono, 2004). Proses enkripsi-dekripsi dengan algoritma kunci asimetris dapat dilihat pada gambar 2.4. Plaintex t
Enkripsi
Kunci Publik
Chipertex t
Dekripsi
Plaintex t
Kunci Rahasia
Gambar 2.4. Proses enkripsi dan dekripsi kunci asimetris Dengan menggunakan kunci asimetris ini, semua orang dapat mengenkripsi pesan dengan memakai public key penerima yang telah diketahui secara umum. Akan tetapi pesan yang telah terenkripsi, hanya dapat didekripsi dengan menggunakan private key yang hanya diketahui oleh penerima pesan. Contoh dari algoritma kunci asimetris adalah RSA, DSA (Digital Signature Algorithm) dan Merkle-Hellman Scheme
2.1.3. Fungsi Hash Menurut Munir (2004), fungsi hash dinamakan juga fungsi hash satuarah karena pesan yang sudah diubah menjadi message digest (pesan ringkas) oleh fungsi hash tidak dapat dikembalikan lagi menjadi bentuk semula walaupun digunakan algoritma dan kunci yang sama. Sembarang pesan M berukuran bebas dikompresi oleh fungsi hash H melalui persamaan h = H(M).
(2.1)
Sifat-sifat fungsi hash adalah sebagai berikut. a. Fungsi H dapat diterapkan pada blok data berukuran berapa saja. b. H menghasilkan nilai h dengan panjang tetap (fixed-length output). c. H(x) mudah dihitung untuk setiap nilai x yang diberikan. d. Untuk setiap h yang dihasilkan, tidak mungkin dikembalikan nilai x sedemikian sehingga H(x) = h. Itulah sebabnya fungsi H dikatakan fungsi hash satu-arah (one-way hash function). e. Untuk setiap x yang diberikan, tidak mungkin mencari y ≠ x sedemikian sehingga H(y) = H(x). f. Tidak mungkin mencari pasangan x dan y sedemikian sehingga H(x) = H(y). Nilai fungsi hash satu arah biasanya berukuran kecil, sedangkan pesan berukuran sembarang. Ada beberapa fungsi hash satu-arah yang sudah dibuat, antara lain: MD2, MD4, MD5, SHA (Secure Hash Function), Snefru, N-hash, dan RIPE-MD (Race Integrity Primitivies Evaluation Message Digest).
2.1.4. Algoritma MD5 Algoritma MD5 menerima masukan berupa pesan dengan ukuran sembarang dan menghasilkan message digest yang panjangnya 128 bit. Gambaran pembuatan message digest dengan algoritma MD5 diperlihatkan pada Gambar 2.5.
L x 512 bit K bit
K mod 264
Padding bits (1 - 512 bit)
Pesan
512
512
Y0
Y1 512
ABCD
128
HMD5
1000...000
512
...
HMD5
128
512
...
Yq
512
128
Panjang Pesan
YL - 1
512
128
HMD5
128
512
128
HMD5
128 Message Digest
Gambar 2.5. Pembuatan message digest dengan algoritma MD5 Menurut Munir (2004), langkah-langkah pembuatan message digest secara garis besar adalah sebagai berikut. a. Penambahan bit-bit pengganjal (i)
Pesan ditambah dengan sejumlah bit pengganjal sedemikian sehingga panjang pesan (dalam satuan bit) kongruen dengan 448 modulo 512. Ini berarti panjang pesan setelah ditambahi bit-bit pengganjal adalah 64 bit kurang dari kelipatan 512. Angka 512 ini muncul karena MD5 memproses pesan dalam blok-blok yang berukuran 512.
(ii)
Pesan dengan panjang 448 bit pun tetap ditambah dengan bitbit pengganjal. Jika panjang pesan 448 bit, maka pesan tersebut
ditambah dengan 512 bit menjadi 960 bit. Jadi, panjang bit-bit pengganjal adalah antara 1 sampai 512. (iii)
Bit-bit pengganjal terdiri dari sebuah bit 1 diikuti dengan sisanya bit 0.
b. Penambahan nilai panjang pesan semula (i)
Pesan yang telah diberi bit-bit pengganjal selanjutnya ditambah lagi dengan 64 bit yang menyatakan panjang pesan semula.
(ii)
Jika panjang pesan > 264 maka yang diambil adalah panjangnya dalam modulo 264. Dengan kata lain, jika panjang pesan semula adalah K bit, maka 64 bit yang ditambahkan menyatakan K modulo 264.
(iii)
Setelah ditambah dengan 64 bit, panjang pesan sekarang menjadi 512 bit.
c. Inisialisasi penyangga message digest (i)
MD5 membutuhkan 4 buah penyangga (buffer) yang masingmasing panjangnya 32 bit. Total panjang penyangga adalah 4 × 32 = 128 bit. Keempat penyangga ini menampung hasil antara dan hasil akhir.
(ii)
Keempat penyangga ini diberi nama A, B, C, dan D. Setiap penyangga diinisialisasi dengan nilai-nilai (dalam notasi HEX) sebagai berikut. A = 01234567 B = 89ABCDEF C = FEDCBA98 D = 76543210
d. Pengolahan pesan dalam blok berukuran 512 bit (i)
Pesan dibagi menjadi L buah blok yang masing-masing panjangnya 512 bit (Y0 sampai YL – 1).
(ii)
Setiap blok 512-bit diproses bersama dengan penyangga MD menjadi keluaran 128-bit, dan ini disebut proses HMD5.
Yq MDq 512
ABCD ← f F ( ABCD, Yq , T [1..16])
A
B
C
D
ABCD ← f G ( ABCD, Yq , T [17..32])
A
B
D
C
ABCD ← f H ( ABCD, Yq , T [33..48])
A
B
C
D
ABCD ← f I ( ABCD, Yq , T [ 49..64])
+
+
+
+
128
MDq + 1
Gambar 2.6. Pengolahan blok 512 bit (Proses HMD5) Proses HMD5 terdiri dari 4 buah putaran, dan masing-masing melakukan operasi dasar MD5 sebanyak 16 kali dan setiap operasi dasar memakai sebuah elemen T. Jadi setiap putaran memakai 16 elemen Tabel T. Pada Gambar 2.6, Yq menyatakan blok 512-bit ke-q dari pesan yang telah ditambah bit-bit pengganjal dan tambahan 64 bit nilai panjang pesan semula. MDq adalah nilai message digest 128-bit dari proses HMD5 ke-q. Pada awal proses, MDq berisi nilai inisialisasi penyangga MD. Fungsi-fungsi fF, fG, fH, dan fI masing-masing berisi 16 kali operasi dasar terhadap masukan, setiap operasi dasar menggunakan elemen Tabel T. Operasi dasar MD5 diperlihatkan pada Gambar 2.7.
a
b
c
d
g
+
+
X[k]
+
T[i]
CLSs
+
Gambar 2.7. Operasi dasar MD5 Operasi dasar MD5 yang diperlihatkan pada Gambar 2.7 dapat ditulis dengan sebuah persamaan sebagai berikut. a ← b + CLSs(a + g(b, c, d) + X[k] + T[i])
(2.2)
yang dalam hal ini, a, b, c, d : empat buah peubah penyangga 32-bit, g
: salah satu fungsi F, G, H, I,
CLSs : circular left shift sebanyak s bit, X[k] : kelompok 32-bit ke-k dari blok 512 bit message ke-q. Nilai k=0 sampai 15, T[i]
: elemen Tabel T ke-i (32 bit),
+
: operasi penjumlahan modulo 232.
Fungsi fF, fG, fH, dan fI adalah fungsi untuk memanipulasi masukan a, b, c, dan d dengan ukuran 32-bit. Masing-masing fungsi dapat dilihat pada Tabel 2.1. Tabel 2.1. Fungsi-fungsi dasar MD5 Na
Notasi
G(a, b, c,
ma fF
F(b, c,
d) (b ∧ c) ∨
fG
d) G(b, c,
(~b ∧ d) (b ∧ d) ∨ (c
fH
d) H(b, c,
∧ ~d) B⊕c⊕d
fI
d) I(b, c,
c ⊕ (b ∧ ~
d)
d)
Nilai T[i] dapat dilihat pada Tabel 2.2. Tabel ini disusun oleh fungsi 232 × abs(sin(i)), i dalam radian. Tabel 2.2. Nilai T[i] T[1] = D76AA478
T[17] = F61E2562
T[33] = FFFA3942
T[49] = F4292244
T[2] = E8C7B756
T[18] = C040B340
T[34] = 8771F681
T[50] = 432AFF97
T[3] = 242070DB
T[19] = 265E5A51
T[35] = 69D96122
T[51] = AB9423A7
T[4] = C1BDCEEE
T[20]= E9B6C7AA
T[36] = FDE5380C
T[52] = FC93A039
T[5] = F57C0FAF
T[21] = D62F105D
T[37] = A4BEEA44
T[53] = 655B59C3
T[6] = 4787C62A
T[22] = 02441453
T[38] = 4BDECFA9
T[54] = 8F0CCC92
T[7] = A8304613
T[23] = D8A1E681
T[39] = F6BB4B60
T[55] = FFEFF47D
T[8] = FD469501
T[24]= E7D3FBCB
T[40] = BEBFBC70
T[56] = 85845DD1
T[9] = 698098D8
T[25] = 21E1CDE6
T[41] = 289B7EC6
T[57] = 6FA87E4F
T[10] = 8B44F7AF
T[26] = C33707D6
T[42] = EAA127FA
T[58] = FE2CE6E0
T[11] = FFFF5BB1
T[27] = F4D50D87
T[43] = D4EF3085
T[59] = A3014314
T[12] = 895CD7BE
T[28] = 455A14ED
T[44] = 04881D05
T[60] = 4E0811A1
T[13] = 6B901122
T[29] = A9E3E905
T[45] = D9D4D039
T[61] = F7537E82
T[14] = FD987193
T[30] = FCEFA3F8
T[46] = E6DB99E5
T[62] = BD3AF235
T[15] = A679438E
T[31] = 676F02D9
T[47] = 1FA27CF8
T[63]= 2AD7D2BB
T[16] = 49B40821
T[32]= 8D2A4C8A
T[48] = C4AC5665
T[64] = EB86D391
Dari persamaan (2.2) dapat dilihat bahwa masing-masing fungsi fF, fG, fH, dan fI melakukan 16 kali operasi dasar. Misalkan notasi [abcd k
s
i]
menyatakan operasi a ← b + ((a + g(b, c, d) + X[k] + T[i])<<<s) yang dalam hal ini <<<s melambangkan operasi circular left shift 32-bit, operasi dasar pada masing-masing putaran dapat ditabulasikan sebagai berikut. Tabel 2.3. Rincian operasi pada fungsi F(b, c, d) (kiri) dan fungsi G(b, c, d) (kanan) No.
[abcd k s i]
No.
[abcd k s i]
1
[ABCD 0 7 1]
1
[ABCD 1 5 17]
2
[DABC 1 12 2]
2
[DABC 6 9 18]
3
[CDAB 2 17 3]
3
[CDAB 11 14 19]
4
[BCDA 3 22 4]
4
[BCDA 0 20 20]
5
[ABCD 4 7 5]
5
[ABCD 5 5 21]
6
[DABC 5 12 6]
6
[DABC 10 9 22]
7
[CDAB 6 17 7]
7
[CDAB 15 14 23]
8
[BCDA 7 22 8]
8
[BCDA 4 20 24]
9
[ABCD 8 7 9]
9
[ABCD 9 5 25]
10
[DABC 9 12 10]
10
[DABC 14 9 26]
11
[CDAB 10 17 11]
11
[CDAB 3 14 27]
12
[BCDA 11 22 12]
12
[BCDA 8 20 28]
13
[ABCD 12 7 13]
13
[ABCD 13 5 29]
14
[DABC 13 12 14]
14
[DABC 2 9 30]
15
[CDAB 14 17 15]
15
[CDAB 7 14 31]
16
[BCDA 15 22 16]
16
[BCDA 12 20 32]
Tabel 2.4. Rincian operasi pada fungsi H(b, c, d) (kiri) dan fungsi I(b, c, d) (kanan) No.
[abcd k s i]
No.
[abcd k s i]
1
[ABCD 5 4 33]
1
[ABCD 0 6 49]
2
[DABC 8 11 34]
2
[DABC 7 10 50]
3
[CDAB 11 16 35]
3
[CDAB 14 15 51]
4
[BCDA 14 23 36]
4
[BCDA 5 21 52]
5
[ABCD 1 4 37]
5
[ABCD 12 6 53]
6
[DABC 4 11 38]
6
[DABC 3 10 54]
7
[CDAB 7 16 39]
7
[CDAB 10 15 55]
8
[BCDA 10 23 40]
8
[BCDA 1 21 56]
9
[ABCD 13 4 41]
9
[ABCD 8 6 57]
10
[DABC 0 11 42]
10
[DABC 15 10 58]
11
[CDAB 3 16 43]
11
[CDAB 6 15 59]
12
[BCDA 6 23 44]
12
[BCDA 13 21 60]
13
[ABCD 9 4 45]
13
[ABCD 4 6 61]
14
[DABC 12 11 46]
14
[DABC 11 10 62]
15
[CDAB 15 16 47]
15
[CDAB 2 15 63]
16
[BCDA 2 23 48]
16
[BCDA 9 21 64]
Setelah putaran keempat, a, b, c, dan d ditambahkan ke A, B, C, dan D, dan selanjutnya algoritma memproses untuk blok data berikutnya (Yq+1).
Keluaran akhir dari algoritma MD5 adalah hasil penyambungan bit-bit di A, B, C, dan D (Munir, 2004). Dari uraian tersebut, secara umum fungsi hash MD5 dapat ditulis dalam persamaan matematis berikut. MD0 = IV
(2.3)
MDq + 1 = MDq + fI(Yq + fH(Yq + fG(YQ + fF(Yq + MDq)))) MD = MDL – 1
(2.4)
yang dalam hal ini, IV
: initial vector dari penyangga ABCD, yang dilakukan pada proses inisialisasi penyangga,
Yq
: blok pesan berukuran 512-bit ke-q,
L
: jumlah blok pesan,
MD
: nilai akhir message digest.
2.1.5. RSA Cryptosystem RSA cryptosystem adalah public-key cryptosystem yang menawarkan baik enkripsi maupun tanda tangan digital. Keamanan algoritma RSA terletak pada sulitnya memfaktorkan bilangan yang besar menjadi faktor-faktor prima (Munir, 2004). Besaran-besaran yang digunakan pada algoritma RSA adalah : •
p dan q bilangan prima
(rahasia)
•
r=p⋅q
(tidak rahasia)
•
φ(r) = (p – 1) (q – 1)
(rahasia)
•
PK
(kunci enkripsi)
(tidak rahasia)
•
SK
(kunci dekripsi)
(rahasia)
•
X
(plainteks)
(rahasia)
•
Y
(cipherteks)
(tidak rahasia).
Algoritma RSA didasarkan pada teorema Euler yang menyatakan bahwa aφ(r) ≡ 1 (mod r)
(2.5)
yang dalam hal ini, •
a harus relatif prima terhadap r,
•
φ(r) = r(1 – 1/p1)(1 – 1/p2) … (1 – 1/pn), dimana p1, p2, …, pn adalah faktor prima dari r dan φ(r) adalah fungsi yang menentukan berapa banyak dari bilangan-bilangan 1, 2, 3, …, r yang relatif prima terhadap r.
Berdasarkan sifat am ≡ bm (mod r) untuk m bilangan bulat ≥ 1, maka persamaan (2.5) dapat ditulis menjadi a mφ(r) ≡ 1m (mod r), atau amφ(r) ≡ 1 (mod r).
(2.6)
Bila a diganti dengan X, maka persamaan (2.6) menjadi Xmφ(r) ≡ 1 (mod r).
(2.7)
Berdasarkan sifat ac ≡ bc (mod r), maka bila persamaan (2.7) dikali dengan X menjadi Xmφ(r) + 1 ≡ X (mod r)
(2.8)
yang dalam hal ini X relatif prima terhadap r. Misalkan SK dan PK dipilih sedemikian sehingga SK ⋅ PK ≡ 1 (mod φ(r))
(2.9)
SK ⋅ PK = mφ(r) + 1.
(2.10)
atau
Persamaan (2.10) disubtitusikan ke dalam persamaan (2.8) menjadi X SK ⋅ PK ≡ X (mod r).
(2.11)
Persamaan (2.11) dapat ditulis kembali menjadi (X PK)SK ≡ X (mod r)
(2.12)
yang artinya, perpangkatan X dengan PK diikuti dengan perpangkatan dengan SK menghasilkan kembali X semula. Berdasarkan persamaan (2.12), maka enkripsi dan dekripsi dirumuskan sebagai berikut. EPK(X) = Y ≡ XPK mod r,
(2.13)
DSK(Y) = X ≡ YSK mod r.
(2.14)
Karena SK ⋅ PK = PK ⋅ SK, maka enkripsi diikuti dengan dekripsi ekivalen dengan dekripsi diikuti enkripsi ESK(DSK(X)) = DSK(EPK(X)) ≡ XPK mod r.
(2.15)
Oleh karena XPK mod r ≡ (X + mr)PK mod r untuk sembarang bilangan bulat m, maka tiap plainteks X, X + r, X + 2r, …, menghasilkan cipherteks yang sama. Dengan kata lain, transformasinya dari banyak ke satu. Agar transformasinya satu-ke-satu, maka X harus dibatasi dalam himpunan {0, 1, 2, …, r – 1} sehingga enkripsi dan dekripsi tetap benar seperti pada persamaan (2.13) dan (2.14). 2.1.6. Sidik Dijital Tanda tangan sering digunakan untuk menentukan keotentikan suatu data, sehingga bentuk tanda tangan seseorang dibuat selalu sama agar orang lain dapat menentukan apakah data dan orang yang memberi tandatangan tersebut sah. Sidik dijital mempunyai tujuan yang hampir sama dengan tanda tangan biasa, tetapi bentuk tanda tangan dijital (sidik dijital) dibuat tergantung pada data atau pesan yang ditandatangani, bukan siapa yang membuat tanda tangan. Dengan sidik dijital, integritas data dapat dijamin, disamping itu ia juga digunakan untuk membuktikan asal pesan. Hanya sistem kriptografi kunci-publik yang cocok untuk pemberian sidik dijital. Hal ini disebabkan karena skema sidik dijital berbasis sistem kunci-publik dapat menyelesaikan masalah non repudiation (penyangkalan), karena baik penerima maupun pengirim pesan mempunyai pasangan kunci masing-masing.
Menurut Munir (2004) ada dua metode dalam membuat sidik dijital. 1. Sidik dijital dengan algoritma kunci-publik. 2. Sidik dijital dengan menggunakan fungsi hash satu-arah. Menurut Wibowo (2004), tanda tangan dijital (sidik dijital) mempunyai sifat-sifat sebagai berikut. 1. Tanda tangan itu asli (tidak mudah ditiru oleh orang lain). Pesan dan tanda tangan pesan juga dapat menjadi barang bukti, sehingga dapat mencegah
penyangkalan
apabila
seseorang
yang
pernah
menandatangani suatu pesan tetapi tidak mengakuinya. 2. Tanda tangan itu hanya sah untuk dokumen itu saja. Tanda tangan tidak dapat dipindahkan dari suatu dokumen ke dokumen lainnya. Ini juga berarti bahwa jika dokumen itu diubah, maka tanda tangan digital dari pesan tersebut tidak lagi sah. 3. Tanda tangan itu dapat diperiksa dengan mudah. 4. Tanda tangan itu dapat diperiksa oleh pihak-pihak yang belum pernah bertemu dengan penandatangan. 5. Tanda tangan itu juga sah untuk duplikat dari dokumen yang sama. Dua algoritma signature yang digunakan secara luas adalah RSA dan Elgamal. Pada RSA, algoritma enkripsi dan dekripsi identik, sehingga proses signature dan verifikasi juga identik. Selain RSA, terdapat algoritma yang dikhususkan untuk sidik dijital, yaitu Digital Signature Algorithm (DSA), yang merupakan bakuan (standard) untuk Digital Dignature Standard (DSS). Pada DSA, algoritma signature dan verifikasi berbeda. 2.2. Kerangka Pemikiran Berdasarkan landasan teori dapat disusun kerangka pemikiran untuk menyelesaikan permasalahan yang ada. Fungsi hash MD5 adalah fungsi hash satu arah yang digunakan untuk membuat message digest, sedangkan algoritma RSA merupakan sebuah algoritma kriptografi dengan menggunakan
kunci asimetris. Sehingga sidik dijital dapat dibuat dengan menggunakan fungsi hash MD5 dan algoritma RSA. Sidik dijital tersebut digunakan oleh penerima pesan untuk membuktikan data tersebut asli dan dikirim oleh orang yang benar (sah). Selanjutnya dilakukan analisis untuk mengetahui kemampuan sidik dijital tersebut dalam menjaga keabsahan data.
BAB III METODOLOGI PENELITIAN Metode yang digunakan dalam penelitian ini adalah studi literatur dan pengembangan program komputer. Untuk mencapai tujuan dari penelitian ini diambil langkah-langkah sebagai berikut. 1.
Studi literatur tentang keamanan data, kriptografi, fungsi hash, algoritma MD5, RSA Cryptosystem dan sidik dijital.
2.
Dilakukan
proses-proses
yang
diperlukan
untuk
menjaga
keabsahan data dengan langkah-langkah sebagai berikut. a. Ditentukan data yang ingin dijaga keabsahannya. b. Dibuat sidik dijital dari data tersebut dengan menggunakan fungsi hash MD5 dan algoritma RSA (pada skripsi ini pembuatan message digest oleh fungsi hash MD5 dilakukan dengan menggunakan software yang kode sumbernya diperoleh dari internet). c. Sidik dijital dan data dikirimkan bersama-sama. d. Ditempat penerima, data tersebut dibuktikan keabsahannya. 3.
Pembuatan dan pengujian aplikasi, yaitu pembuatan aplikasi program komputer untuk pembuatan sidik dijital dan verifikasinya dengan menggunakan software tools Borland Delphi 7, kemudian mengujinya dengan membandingkan hasil dari aplikasi dengan hasil secara teori.
4.
Analisis, yaitu menganalisis kelebihan serta kelemahan pembuatan sidik dijital dengan menggunakan fungsi hash MD5 dan algoritma RSA baik dari teori maupun aplikasi yang telah dibuat.
BAB IV PEMBAHASAN 4.1. Pembuatan Sidik Dijital Dalam penelitian ini, sidik dijital dibuat dengan metode fungsi hash satu-arah. Fungsi hash yang digunakan adalah MD5 dan algoritma kriptografi yang digunakan adalah RSA. Menurut Munir (2004), skema pembuatan sidik dijital dengan menggunakan fungsi hash satu-arah adalah sebagai berikut. 1. Pesan yang hendak dikirim diubah terlebih dahulu menjadi bentuk yang ringkas yang disebut message digest. Message digest (MD) diperoleh dengan mentransformasikan pesan M dengan menggunakan fungsi hash satu-arah (one-way) H, MD = H(M)
(4.1)
2. Selanjutnya, message digest MD dienkripsikan dengan algoritma kunci-publik menggunakan kunci rahasia (SK) pengirim menjadi sidik dijital S, S = ESK(MD)
(4.2)
3. Pesan M disambung (append) dengan sidik dijital S, lalu keduanya dikirim melalui saluran komunikasi. Dalam hal ini, kita katakan bahwa pesan M sudah ditandatangani oleh pengirim dengan sidik dijital S. Pesan yang dikirim tidak hanya pesan dalam bentuk teks, tetapi dapat juga berformat .dat, .mp3, .pdf, .wmf, dan sebagainya. Langkah-langkah dalam pembuatan sidik dijital dari pesan M dapat dilihat sebagai berikut. Secret Key Message
Fungsi Hash
Message Digest
Signin
Signature
g
Gambar 4.1. Skema pembuatan sidik dijital dengan menggunakan fungsi hash
4.1.1. Prosedur Pembuatan Message Digest Untuk membuat message digest, terdapat empat langkah utama yang dilakukan, seperti yang telah dijelaskan pada landasan teori. Adapun langkah– langkah tersebut adalah 1. penambahan bit, 2. penambahan panjang pesan, 3. inisialisasi penyangga MD5, 4. proses pengolahan pesan dalam blok berukuran 512 bit, 4.1.2. Prosedur Menghasilkan Kunci Untuk Setiap Pemakai Algoritma RSA menggunakan dua buah kunci, yaitu kunci pribadi yang digunakan oleh pembuat sidik dijital dan kunci publik yang digunakan oleh penerima pesan. Prosedur Pembuatan Pasangan Kunci. 1. Dipilih dua buah bilangan prima sembarang, p dan q. 2. Dihitung r = p ⋅ q. Sebaiknya p ≠ q, sebab jika p = q maka r = p2 sehingga p dapat diperoleh dengan menarik akar pangkat dua dari r. 3. Dihitung φ(r) = (p – 1)(q – 1). 4. Dipilih kunci publik PK yang prima relatif terhadap φ(r). 5. Dibangkitkan kunci rahasia dengan menggunakan persamaan (2.9), yaitu SK ⋅ PK ≡ 1 (mod φ(r)). SK ⋅ PK ≡ 1 (mod φ(r)) ekivalen dengan SK ⋅ PK = 1 + mφ(r), sehingga SK dapat dihitung dengan SK =
1 + mφ (r ) , PK
terdapat bilangan bulat m yang menghasilkan bilangan bulat SK.
(4.3)
4.1.3. Prosedur Enkripsi Untuk Pengirim Untuk membuat sidik dijital, message digest yang telah dihasilkan oleh fungsi hash MD5 dienkripsi menggunakan kunci pribadi. Langkah-langkah yang diperlukan dalam proses enkripsi adalah sebagai berikut. 1.
Plaintext disusun menjadi blok-blok x1, x2, …, xn sedemikian sehingga setiap blok merepresentasikan nilai di dalam rentang 0 sampai r – 1.
2.
Setiap blok xi dienkripsi menjadi blok si dengan rumus si = xi SK mod r.
(4.4)
4.2. Analisis Keabsahan Data Data atau pesan yang diterima harus diteliti bahwa selama perjalanan, data tersebut tidak diubah, dihapus atau dikirimkan oleh orang yang tidak dikehendaki. Menurut Munir (2004), skema verifikasi keabsahan data atau pesan sebagai berikut. 1. Sidik dijital S didekripsi menggunakan kunci publik (PK) pengirim pesan, menghasilkan message digest semula, MD, sebagai berikut MD = DPK(S).
(4.5)
2. Pesan M kemudian diubah menjadi message digest MD’ menggunakan fungsi hash satu-arah yang sama dengan fungsi hash yang digunakan oleh pengirim. 3. Jika MD’ = MD, berarti pesan yang diterima masih asli dan berasal dari pengirim yang benar. Untuk membuktikan data yang dikirim masih asli dan dikirim oleh orang yang benar, dilakukan langkah-langkah analisis keabsahan data dengan menggunakan sidik dijital seperti ditunjukkan pada Gambar 4.2.
Message
Message Signature
Signature Fungsi Hash
Public Key Verify
Message Digest
? =
Message Digest
Gambar 4.2. Otentikasi dengan sidik dijital menggunakan fungsi hash satu-arah
4.2.1. Prosedur Dekripsi Untuk Penerima Untuk mendapatkan plaintext yang merupakan message digest dari data yang dikirim, dilakukan dengan cara setiap blok cipherteks yi didekripsi kembali menjadi blok xi dengan rumus xi = yi PK mod r
(4.6)
4.2.2. Prosedur Verifikasi Sidik Dijtal Untuk menguji keaslian data dan kebenaran pengirim, dilakukan proses verifikasi sidik dijital dengan langkah-langkah sebagai berikut. 1. Pesan M (yang diterima bersama sidik dijitalnya) diubah menjadi message digest dengan menggunakan fungsi hash yang sama (MD5). 2. Message digest tersebut kemudian dicocokkan dengan hasil dekripsi sidik dijital dari data atau pesan yang dikirim. Apabila sama berarti data atau pesan tersebut masih asli dan dikirim oleh orang yang benar, jika tidak berarti data sudah tidak sah (data diubah atau dikirim oleh orang yang tidak diharapkan).
4.3. Penerapan Kasus Untuk menjelaskan mengenai mekanisme proses pembuatan sidik dijital dan verifikasinya, berikut diberikan contoh kasus pada proses regristrasi pengguna kartu prabayar secara manual, yang mempunyai urutan langkah sebagai berikut. 1. Pelanggan datang ke dealer operator kartu tertentu. 2. Data diri diisi dan diserahkan kepada operator. 3. Operator mengirimkan data tersebut kepada pemerintah. Untuk memudahkan pemahaman terhadap proses yang berlangsung, dimisalkan data yang diserahkan pelanggan prabayar kepada operator adalah
PT EXELCOMINDO PRATAMA FORM REGRISTRASI PELANGGAN PRABAYAR Nomor HP
: 081802510001
Nama
: Joko Wijoyo
Jenis ID(KTP/SIM/PASPOR): KTP No ID (KTP/SIM/PASPOR) : 08011234081084 Tempat/Tanggal Lahir
: Karanganyar, 8 Oktober 1984
Jenis Kelamin
: Laki-laki
Alamat
: Jl. Slamet No 32
Kota
: Surakarta Gambar 4.3. Form regristrasi pelanggan prabayar
Data tersebut kemudian disimpan melalui notepad dengan format teks (*.txt) atau menggunakan format yang lain. Data yang telah diterima operator sebaiknya tidak langsung dikirim kepada pemerintah, karena dalam perjalanan dimungkinkan data tersebut disabotase oleh orang-orang yang tidak bertanggungjawab. Informasi di dalamnya seperti nomor telepon, nomor id, nama dan yang lainnya dapat diubah tanpa sepengetahuan yang bersangkutan. Sehingga, pihak operator perlu menjamin bahwa data yang dikirimkan tersebut aman dan asli. Untuk mengantisipasi hal-hal yang tidak diinginkan, sidik dijital dapat digunakan untuk mengatasi masalah ini. Pihak operator dan
pemerintah dapat bekerjasama dalam bertukar informasi mengenai kunci yang digunakan. Selanjutnya data tersebut dibuat sidik dijital dan dikirimkan kepada pemerintah bersama data aslinya. Seperti yang ditunjukkan Gambar 4.4. Pengguna Kartu Prabayar
Data Pribadi
Operator Seluler
Sidik Dijital
Pemerintah Data Pribadi
Gambar 4.4. Skema regristrasi pengguna kartu prabayar 4.3.1. Tahap Pembuatan Sidik Dijital Data yang sudah diisi disimpan di komputer operator dengan nama regristrasi. Selanjutnya data tersebut dibuat pesan ringkas (message digest) kemudian dienkripsi setelah sebelumnya ditentukan terlebih dahulu kunci untuk enkripsi dan dekripsi. 4.3.1.1. Tahap Pembuatan Message Digest Data dari pelanggan yang melakukan regristrasi tersebut kemudian diubah menjadi message digest menggunakan algoritma fungsi hash MD5 (source code terdapat pada lampiran), sehingga diperoleh message digest MD = d5ee40d2753128d165783ba4273bc44f. 4.3.1.2. Tahap Menghasilkan Kunci Pribadi dan Kunci Publik Misalkan dipilih p = 397 dan q = 229 (keduanya harus bilangan prima), selanjutnya dihitung nilai r = p . q = 90913, dan
φ(r)= (p – 1)(q – 1) = 90288. Dipilih kunci publik PK = 5, karena 5 relatif prima dengan 90288. PK dan r dipublikasikan ke pemerintah untuk proses otentikasi sidik dijital. Selanjutnya dihitung kunci rahasia SK dengan menggunakan persamaan (4.3),
SK =
1 + (m × 90288) . 5
Dengan mencoba nilai-nilai m = 1, 2, 3,…, diperoleh nilai SK yang bulat adalah 54173. Ini adalah kunci enkripsi yang harus dirahasiakan.
4.3.1.3. Tahap Enkripsi Untuk Operator Plaintext (message digest dari data regristrasi) disusun menjadi blokblok x1, x2, …, xn sedemikian sehingga setiap blok merepresentasikan nilai di dalam rentang 0 sampai r – 1. Plaintext yang dienkripsikan yaitu X = MD = d5ee40d2753128d165783ba4273bc44f atau dalam sistem desimal (pengkodean ASCII) adalah “100 53 101 101 52 48 100 50 55 53 51 49 50 56 100 49 54 53 55 56 51 98 97 52 50 55 51 98 99 52 52 102” X dibagi menjadi blok yang lebih kecil, misalnya X dipecah menjadi 24 blok yang berukuran 3 digit : x1 = 100
x9 = 514
x17 = 897
x10 = 950
x18 = 525
x2 = 531
x11 = 561
x19 = 055
x3 = 011
x12 = 004
x20 = 519
x4 = 015
x13 = 954
x21 = 899
x5 = 248
x14 = 535
x22 = 525
x6 = 100
x15 = 556
x23 = 210
x7 = 505
x16 = 519
x24 = 002
x8 = 553
Nilai-nilai xi ini masih terletak di dalam rentang 0 sampai 90913 – 1 (agar transformasi menjadi satu-ke-satu). Selanjutnya setiap blok xi dienkripsi menjadi blok si dengan rumus si = xi SK mod r. Blok-blok plaintext dienkripsikan sebagai berikut. 10054173 mod 90913 = 65072 = s1
51954173 mod 90913 = 44011 = s20
53154173 mod 90913 = 64568 = s2
89954173 mod 90913 =18384= s21
01154173 mod 90913 =45815 = s3
52554173 mod 90913 = 5409 = s22
01554173 mod 90913 = 44410 = s4
21054173 mod 90913 = 1326 = s23
24854173 mod 90913 = 18597 = s5
00254173 mod 90913 = 29890 = s24
10054173 mod 90913 = 65072 = s6 50554173 mod 90913 = 63270= s7 55354173 mod 90913 = 58301 = s8 51454173 mod 90913 = 86252= s9 95054173 mod 90913 = 67432 = s10 56154173 mod 90913 = 11110 = s11 00454173 mod 90913 = 10049 = s12 95454173 mod 90913 = 39652 = s13 53554173 mod 90913 = 15830 = s14 55654173 mod 90913 = 27211 = s15 51954173 mod 90913 = 44011 = s16 89754173 mod 90913 = 24684 = s17 52554173 mod 90913 = 5409 = s18 05554173 mod 90913 = 62459 = s19
Jadi, ciphertext yang dihasilkan adalah S = 65072 64568 45815 44410 18597 65072 63270 58301 86252 67432 11110 10049 39652 15830 27211 44011 24684 5409 62459 44011 18384 5409 1326 29890. Ciphertext tersebut merupakan sidik dijital yang telah dibuat dengan menggunakan algoritma RSA, selanjutnya sidik dijital tersebut dikirimkan kepada pemerintah besama dengan data aslinya.
4.3.2. Tahap Analisis Keabsahan Data Pemerintah menerima data dan sidik dijital dari operator, kemudian menyimpannya dalam basis data daftar pengguna kartu prabayar. Pemerintah harus menyimpan keduanya (tidak hanya data pengguna kartu prabayar saja) untuk mengantisipasi apabila pada suatu saat terjadi tindakan kriminal dari salah satu nomor yang sudah terdaftar, sedangkan orang yang memiliki nomor tersebut tidak mengakui perbuatannya. Sebelum melakukan tindakan lebih lanjut, pihak yang berwajib melakukan verifikasi terlebih dahulu apakah data tersebut benar dan belum diubah oleh siapapun dalam perjalanan dari operator ke pemerintah. Sebagai contoh akan diperiksa data dari Joko Wijoyo, pengguna kartu prabayar dengan nomor handphone 081802510001 yang tidak mengaku telah melakukan tindakan penipuan melalui SMS. Langkah pertama yang dilakukan adalah sidik dijitalnya, S = 65072 64568 45815 44410 18597 65072 63270 58301 86252 67432 11110 10049 39652 15830 27211 44011 24684 5409 62459 44011 18384 5409 1326 29890 didekripsi dengan menggunakan kunci publik untuk mendapatkan kembali message digest dari data tersangka. Dengan menggunakan kunci publik PK=5, blok-blok ciphertext didekripsikan sebagai berikut. 650725 mod 90913 = 100 = x1 645685 mod 90913 = 531 = x2
458155 mod 90913 = 011= x3 444105 mod 90913 = 015 = x4 185975 mod 90913 = 248= x5 650725 mod 90913 = 100 = x6 632705 mod 90913 = 505 = x7 583015 mod 90913 = 553 = x8 862525 mod 90913 = 514 = x9 674325 mod 90913 = 950 = x10 111105 mod 90913 = 561 = x11 100495 mod 90913 = 004 = x12 396525 mod 90913 = 954 = x13 158305 mod 90913 = 535 = x14 272115 mod 90913 = 556 = x15 440115 mod 90913 = 519 = x16 246845 mod 90913 = 897 = x17 54095 mod 90913 = 525 = x18 624595 mod 90913 = 055 = x19 440115 mod 90913 = 519 = x20 183845 mod 90913 = 899 = x21 5409 5 mod 90913 = 525 = x22 1326 5 mod 90913 = 210 = x23 298905 mod 90913 = 2 = x24 Sehingga diperoleh kembali plaintext
X = “100 531 011 015 248 100 505 553 514 950 561 004 954 535 556 519 897 525 055 519 899 525 210 2”, yang dalam karakter ASCII adalah X = d5ee40d2753128d165783ba4273bc44f. Selanjutnya data tersangka diubah menjadi message digest dengan menggunakan fungsi hash yang sama dengan fungsi hash yang digunakan oleh operator. Data dari pengguna bernomor handphone 081802510001 tesebut setelah dibuat message digest dengan menggunakan fungsi hash MD5 diperoleh
MD’
=
d5ee40d2753128d165783ba4273bc44f.
MD’
yang
dihasilkan tersebut ternyata sama dengan hasil dekripsi sidik dijitalnya. Dengan demikian data tersebut asli dan dikirim oleh orang yang benar (sah), sehingga pihak yang berwajib dapat melakukan tindakan lebih lanjut. Apabila data tersebut sudah diubah, misalkan nomor handphone diubah oleh seseorang dari 081802510001 menjadi 081802510002 dengan menggunakan fungsi hash MD5, message digest yang dihasilkan adalah ”9a91d15b4e789989455277caa3a49ee0”.
Message
digest
tersebut
jauh
berbeda dengan ”d5ee40d2753128d165783ba4273bc44f” walaupun hanya satu angka saja yang diubah, sehingga dapat ditebak pada tahap analisis keabsahan data, hasil dari dekripsi sidik dijital tidak sama dengan message digest dari data yang telah diubah tersebut. 4.4. Pembuatan dan Pengujian Aplikasi Dalam penelitian ini, setelah mengetahui kinerja fungsi hash MD5 dan algoritma RSA dalam membuat sidik dijital dan cara menguji keabsahan data menggunakan sidik dijital, dapat diketahui terdapat dua buah aplikasi yang harus dibuat. Pertama pembuatan sidik dijital oleh pengirim dan kedua verifikasi sidik dijital (untuk menguji keabsahan data) oleh penerima. Pada penelitian ini software tool yang digunakan dalam pembuatan aplikasi adalah Delphi 7.
4.4.1. Pembuatan Aplikasi Untuk Pengirim
Pada aplikasi pembuatan sidik dijital, dibuat dengan empat tampilan utama, yaitu petunjuk penggunaan aplikasi, proses pembuatan message digest, proses menghasilkan kunci enkripsi dan dekripsi, dan proses enkripsi (pembuatan sidik dijital). Alur proses yang berlangsung pada aplikasi pembuatan sidik dijital ditunjukkan pada Gambar 4.5. Mulai
Memasukkan Data
Memasukkan dua buah kunci bilangan prima
Membuat Message Digest
Bilangan Prima
Tidak
Ya Message Digest Kunci Enkripsi dan Dekripsi Enkripsi
Kunci Enkripsi
Sidik Dijital
Selesai Gambar 4.5. Alur sistem pembuatan sidik dijital Berikut diberikan pseudocode (algortima) beserta penjelasan pada masing-masing proses yang berlangsung. 1. Proses pembuatan message digest //Mendefinisikan variabel var r,k : int64;
var
h0,h1,h2,h3 : int;
var a,b,c,d: int; r[ 0..15]:=(7,12,17,22,7,12,17,22,7,12,17,22,7,12,17,22); r[16..31]:=(5,9,14,20,5,9,14,20,5,9,14,20,5,9,14,20); r[32..47]:=(4,11,16,23,4,11,16,23,4,11,16,23,4,11,16,23); r[48..63]:=(6,10,15,21,6,10,15,21,6,10,15,21,6,10,15,21); //Menggunakan bagian fraksional biner dari integral sinus sebagai konstanta: for i:=0 to 63 do k[i] := round(abs(sin(i + 1)) × 2^32); //Inisialisasi variabel: h0 := 0x67452301; h1 := 0xEFCDAB89; h2 := 0x98BADCFE; h3 := 0x10325476; //Pemrosesan awal: append "1" bit to message; append "0" bits until message length in bits ≡ 448 (mod 512); append bit length of message as 64-bit little-endian integer to message; //Pengolahan pesan paada blok 512-bit: for each 512-bit chunk of message break chunk into sixteen 32-bit little-endian words; w(i), 0 ≤ i ≤ 15 //Inisialisasi nilai hash pada blok ini: a := h0; b := h1; c := h2; d := h3; //Kalang utama: for i:=0 to 63 do if 0 ≤ i ≤ 15 then begin f := (b and c) or ((not b) and d); g := I; end else if 16 ≤ i ≤ 31 then
begin f := (d and b) or ((not d) and c); g := (5×i + 1) mod 16; end else if 32 ≤ i ≤ 47 then begin f := b xor c xor d; g := (3×i + 5) mod 16; end else if 48 ≤ i ≤ 63 begin f := c xor (b or (not d)); g := (7×i) mod 16; end; temp := d; d := c; c := b; b := ((a + f + k(i) + w(g)) leftrotate r(i)) + b; a := temp; //Tambahkan hash dari pengolahan blok 512 bit sebagai hasil h0 := h0 + a; h1 := h1 + b; h2 := h2 + c; h3 := h3 + d; mesaggedigest := h0 append h1 append h2 append h3
2. Proses menghasilkan kunci enkripsi (d) dan kunci dekripsi (e) //Mendefinisikan variabel var p,q,e,d,phi:int64; //Menguji bahwa input p dan q adalah bilangan prima if prime(p)=true and prime(q)=true then phi:=(p-1)*(q-1); //Menguji nilai e yang diinput if GCD(e,phi)<>1 then e:=FALSE else
begin m:=1; while ((1+m*phi) mod e)<>0 do m:=m+1; end; //Menentukan nilai kunci enkripsi (d) d:=(1+m*phi) div e;
3. Proses enkripsi (pembuatan sidik dijital) // Mendefinisikan variabel var n,d: int64; messagedigest,ascii,semua,sidikdijital:string; // Mencari deret nilai ascii message digest ascii_md:=''; for i:=1 to length(messagedigest) do begin hargaascii[i]:=ord(messagedigest [i]); ascii_md:=concat(ascii_md,inttostr(hargaascii[i])); end; //Menentukan panjang blok dan lebarblok lebarblok:= length(n)-1; If length(ascii_md) mod lebarblok<>0 then banyakblok:=(length(ascii_md)div lebarblok)+1 else banyakblok:=length(ascii_md)div lebarblok; //Tahap enkripsi mulai:=1; sidikdijital:=''; for i:=1 to banyakblok do begin x[i]:=copy(ascii_md,mulai,lebarblok); s[i]:=enkripsi(strtoint(x1[i]),d,n); chipertext[i]:=chr(strtoint(s[i])); mulai:=mulai+lebarblok; //Nilai sidik dijital sidikdijital:=concat(sidikdijital,chipertext[i]); end;
4.4.2. Pengujian Aplikasi Untuk Pengirim Dalam subbab ini dilakukan pengujian terhadap aplikasi untuk pengirim yang meliputi : proses pembuatan message digest, proses menghasilkan kunci enkripsi dan dekripsi, dan proses enkripsi (pembuatan sidik dijital). Ketika aplikasi dijalankan, terlebih dahulu muncul user guide (petunjuk pemakaian aplikasi) seperti ditunjukkan pada Gambar 4.6.
Gambar 4.6. Form petunjuk pemakaian aplikasi Berikut ini diberikan contoh pengujian terhadap masing-masing proses yang dijalankan. 1. Proses pembuatan message digest Apabila tombol ”PROSES” dibawah tulisan message digest ditekan maka muncul tampilan seperti ditunjukkan Gambar 4.8.
Gambar 4.7. Form regristrasi
Misal dimasukkan file regristrasi.txt, kemudian tombol ”BUAT MESSAGE DIGEST” ditekan maka dihasilkan message digest dari data yang dimasukkan tersebut.
Gambar 4.8. Form pembuatan message digest 2. Proses menghasilkan kunci enkripsi dan dekripsi Pada proses ini kunci yang dimasukkan kunci dua bilangan prima yang berbeda. Pada aplikasi ini disediakan juga sejumlah bilangan prima yang dapat dibangkitkan secara random berdasarkan ukuran kuncinya. Jika kunci yang dimasukkan bukan bilangan prima maka muncul peringatan agar mengganti bilangan yang tidak prima menjadi bilangan prima. Apabila dua buah kunci yang dimasukkan merupakan bilangan prima, maka proses dilanjutkan.
Gambar 4.9. Peringatan apabila kunci yang dimasukkan tidak prima
Setelah itu user diminta memasukkan sembarang bilangan yang prima relatif dengan φ(r). Bilangan ini adalah kunci dekripsi (e). Pada aplikasi ini juga disediakan pembangkit kunci dekripsi dengan menekan tombol ”BANGKITKAN E” sehingga user tidak perlu mencoba-coba memasukkan bilangan e yang akan memakan waktu. Setelah e dimasukkan atau dibangkitkan, didapat nilai d (kunci enkripsi) seperti ditunjukkan Gambar 4.10.
Gambar 4.10. Form pembuatan kunci Setelah mendapatkan kunci enkripsi dan dekripsi, kunci publik disimpan sebelum dikirimkan kepada penerima.
Gambar 4.11. Kunci publik yang dikirimkan kepada penerima 3. Proses enkripsi (pembuatan sidik dijital)
Dalam proses ini message digest yang diperoleh dari proses pertama dienkripsi menggunakan kunci pribadi (d) yang diperoleh pada proses kedua. User dapat juga memasukkan message digest yang diperoleh dari software lain dengan menekan tombol ”MD LAIN”.
Gambar 4.12. Form enkripsi message digest Apabila tombol ”LIHAT PROSES” ditekan, seluruh proses yang dijalankan seperti kode ascii message digest, blok enkripsi, banyak blok, lebar blok, dan huruf chipertext ditampilkan. Selanjutnya sidik dijital disimpan sebelum dikirimkan kepada penerima.
Gambar 4.13. Sidik dijital hasil dari enkripsi message digest Dari proses yang berlangsung dapat diketahui nilai dari message digest, kunci dekripsi dan enkripsi, dan sidik dijital yang diperoleh dari aplikasi sama dengan sidik dijital yang diperoleh secara teori.
4.4.3. Pembuatan Aplikasi Untuk Penerima Pada aplikasi verifikasi sidik dijital, terdapat tiga proses yang berlangsung, yaitu proses pembuatan message digest, proses dekripsi sidik dijital, dan proses verifikasi. Alur proses yang berlangsung pada aplikasi verifikasi sidik dijital ditunjukkan pada Gambar 4.14. Mulai
Memasukkan Data
Memasukkan Sidik Dijital Kunci Dekripsi
Membuat Message Digest
Dekripsi
Message Digest
Ya
Plaintext
Plaintext = Message Digest
Data Sah
Tidak
Data Tidak Sah
Selesai Gambar 4.14. Alur sistem verifikasi sidik dijital
Berikut diberikan pseudocode (algoritma) beserta penjelasan pada masing-masing proses yang berlangsung. 1. Proses pembuatan message digest Pseudocode pembuatan message digest pada aplikasi verifikasi sidik dijital sama dengan pseudocode pembuatan message digest pada aplikasi pembuatan sidik dijital. 2. Proses dekripsi sidik dijital //Mendefinisikan variabel var ascii_md,sidikdijital,messagedigest,hasildekrip:string; n,e:int64; //Mencari deret nilai ascii message digest ascii_md:=''; for i:=1 to length(messagedigest) do begin hargaascii[i]:=ord(messagedigest[i]); ascii_md:=concat(ascii_md,inttostr(hargaascii[i])); end; //Tahap Dekripsi hasildekripsi:=’’; for i:=1 to length(sidikdijital) do begin plaintext[i]:=dekripsi(strtoint(sidikdijital[i]),e,n); hasildekrip:=concat(hasildekrip,inttostr(plaintext[i])); end;
3. Proses verifikasi sidik dijital //Mendefinisikan variabel var ascii_md,hasildekrip,verifikasi:string; //Tahap verifikasi if ascii_md = hasildekrip then verifikasi:=TRUE else verifikasi:=FALSE;
4.4.4. Pengujian Aplikasi Untuk Penerima Dalam subbab ini dilakukan pengujian terhadap aplikasi untuk penerima yang meliputi : proses pembuatan message digest, proses dekripsi sidik dijital, dan proses verifikasi sidik dijital. Ketika aplikasi dijalankan, terlebih dahulu muncul user guide seperti ditunjukkan pada Gambar 4.15.
Gambar 4.15. Form petunjuk pemakaian aplikasi Berikut ini diberikan contoh pengujian terhadap masing-masing proses. 1. Proses pembuatan message digest Misal dimasukkan file regristrasi.txt, kemudian tombol ”DIGEST” ditekan dihasilkan message digest dari data yang dimasukkan tersebut. 2. Proses dekripsi sidik dijital Pada proses ini kunci dekripsi dan sidik dijital yang telah diterima dimasukkan,
kemudian
tombol
”VERIFIKASI”
ditekan
untuk
mendapatkan plaintext dari sidik dijital. 3. Proses verifikasi sidik dijital Pada proses ini message digest yang didapat pada proses 1 disamakan dengan hasil dekripsi sidik dijital pada proses 2. Ternyata message digest dari file regristrasi.txt sama dengan hasil dekripsi dari sidik
dijitalnya, muncul tampilan form seperti ditunjukkan pada Gambar 4.16. Tetapi ketika isi dari file regristrasi.txt diubah, muncul tampilan form seperti ditunjukkan pada Gambar 4.17.
Gambar 4.16. Tampilan form verifikasi sidik dijital ketika data sah
Gambar 4.17. Tampilan form verifikasi sidik dijital ketika data tidak sah
Dari proses yang berlangsung dapat diketahui nilai dari message digest, dan hasil dekripsi sidik dijital yang diperoleh dari aplikasi sama dengan yang diperoleh secara teori. 4.5. Analisis Kelebihan dan Kelemahan Pembuatan Sidik Dijital Dengan Menggunakan Fungsi Hash MD5 dan Algoritma RSA Pada subbab ini dibahas mengenai kekuatan dan kelemahan pembuatan sidik dijital dengan menggunakan fungsi hash MD5 dan algoritma RSA baik secara teori maupun aplikasi yang telah dibuat. Kelebihan sidik dijital yang dibuat oleh fungsi hash MD5 adalah jaminan bahwa file yang diterima belum terdapat perubahan. Hal ini dikarenakan untuk setiap message digest (h) yang dihasilkan, tidak mungkin dikembalikan menjadi plaintext (x) sedemikian sehingga H(x) = h. Oleh karena itu, MD5 juga dapat memberikan perlindungan terhadap virus komputer yang terdapat pada file yang diterima. Kemudian algoritma RSA mempunyai kelebihan yang terletak pada sulitnya memfaktorkan bilangan besar menjadi faktor-faktor prima (Munir, 2004). Menurut Stinson (1995), agar algoritma RSA lebih aman kunci yang dimasukkan sebaiknya lebih dari 100 dijit atau sekitar 512 bit. Selain itu, dua buah kunci yang dibuat sebaiknya tidak berpola (acak) untuk menyulitkan seorang Cryptanalyst dalam memecahkan sandi. Kelemahan dari pembuatan sidik dijital dengan fungsi hash MD5 dan algoritma RSA adalah adanya kemungkinan diperoleh message digest yang sama dari data yang berbeda. Hal ini dapat terjadi karena terdapat bilangan yang terbatas pada keluaran MD5 (2128), tetapi terdapat bilangan yang tak terbatas sebagai masukannya. Tetapi perlu diketahui menemukan hash yang sama dari dua data yang berbeda adalah hal yang sulit. Sedangkan algoritma RSA mempunyai masalah apabila metode faktorisasi yang cepat telah dikembangkan.
Meskipun
banyak
metode
dari
Cryptanalyst
untuk
memecahkan sandi dari algoritma RSA, tetapi selama ini belum ditemukan
adanya metode yang lebih mudah selain dengan memfaktorkan kunci publik. Oleh karena itu, untuk menjaga agar algoritma RSA tetap aman, cara yang terbaik selain membuat kunci dengan bilangan yang sangat besar (karena dengan kunci yang sangat besar menyebabkan proses enkripsi dan dekripsi menjadi lebih lama) adalah menjaga distribusi kunci publik agar tidak jatuh kepada orang-orang yang tidak berhak. Dari aplikasi yang telah dibuat dapat diketahui bahwa aplikasi tersebut mempunyai kelebihan sebagai berikut. 1. Hasil yang diperoleh aplikasi sama dengan hasil yang diperoleh secara teori, sehingga aplikasi tersebut layak untuk digunakan sebagai software pembuat sidik dijital dan verifikasinya. 2. Aplikasi tersebut dibuat dengan menggunakan Borland Delphi 7 yang bersifat user friendly, sehingga mudah digunakan. Kemudian tampilan form pada aplikasi tersebut didesain dengan Coreldraw 12, sehingga terlihat menarik. Sedangkan kelemahan dari aplikasi tersebut adalah kunci yang dimasukkan dibatasi sebesar 32 bit. Hal ini disebabkan kemampuan dari Delphi 7 yang hanya mempunyai kemampuan perhitungan maksimal sebesar 64 bit. Hal ini dijelaskan sebagai berikut. Diambil contoh pada proses enkripsi. Pada proses ini dilakukan operasi matematika a b mod r, nilai maksimal dari a adalah r-1 dan nilai minimal dari b adalah 2, sehingga a b mod r dapat dituliskan sebagai berikut. (r-1) 2 < r 2 < 2 64 (r-1) < 2 32 r < 2 32 +1 Oleh karena itu, apabila nilai kunci yang dimasukkan lebih dari 32 bit +1, maka hasil perhitungan dari aplikasi tidak sesuai dengan yang diharapkan.
BAB V PENUTUP 5.1. Kesimpulan Berdasarkan pembahasan, diperoleh kesimpulan sebagai berikut. 1.
Fungsi hash MD5 dan algoritma RSA membuat sidik dijital dengan cara algoritma RSA mengenkripsikan message digest yang dibuat oleh fungsi hash MD5.
2.
Untuk membuktikan keabsahan data, sidik dijital dari pengirim didekripsikan menggunakan kunci publik. Setelah itu data yang diterima diubah menjadi message digest menggunakan fungsi hash MD5. Apabila hasil dekripsi sidik dijitalnya sama dengan message digest dari data yang diterima, data masih asli dan dikirim oleh pengirim yang benar.
3.
Setelah diadakan pengujian dan analisa, baik secara teori maupun dari aplikasi, fungsi hash MD5 dan algoritma RSA mampu membuat sidik dijital yang dapat digunakan untuk menjaga keabsahan data.
5.2. Saran Pada penelitian ini sidik dijital yang dihasilkan berformat .txt. Selanjutnya dapat dikembangkan sidik dijital yang berformat .mp3, .dat, dan sebagainya.
DAFTAR PUSTAKA Budiyono, A. (2004). Enkripsi Data Kunci Simetri dengan Algoritma Kriptografi LOKI97. Program Magister Teknologi Informasi Departemen Elektro Institut Teknologi Bandung, Bandung. Fichtner,
M. (1997). The MD5 Message-Digest http://www.fichtner.net/delphi/md5.delphi.phtml
Algorithm.
Munir, R. (2004). Bahan Kuliah Kriptografi : Pengantar Kriptografi. Departemen Teknik Informatika, Institut Teknologi Bandung, Bandung. Nursanto, J. (2003). Tugas Akhir Kuliah Keamanan Jaringan Informasi : Tinjauan Mengenai Aplikasi Metode Montgomery MultiflicationChinese Remainder Theorem (Crt) dalam Mempercepat Deskripsi RSA. Program Magister Teknologi Elektro Institut Teknologi Bandung, Bandung. Rahayu, F. S. (2005). Suplemen Bahan Ajar Mata Kuliah Proteksi dan Teknik Keamanan Sistem Informasi. Magister Teknologi Informasi Universitas Indonesia, Jakarta. Stinson, D. (1995). Cryptography. Computer Science and Engineering Departement, University of Nebraska, Lincoln. Sukaridhoto, S. Dkk. (2005). Teknik Keamanan pada VoIP dengan Virtual Private Networking dan Kriptografi Serta Korelasi Terhadap Bandwidth dan Intelligibility Suara. Institut Teknologi Sepuluh Nopember (ITS), Surabaya. Susanto, Budi. (2004). Keamanan Jaringan. http://lecturer.ukdw.ac.id/budsus/ Wibowo, A. (2004). Digital Security. Universitas Indonesia, Jakarta.
LAMPIRAN • Fungsi dan prosedur yang digunakan dalam aplikasi •
Source code fungsi hash MD5 (dari www.fichtner.net/delphi/md5.delphi.phtml)
•
Source code aplikasi pembuatan sidik dijital
•
Source code aplikasi verifikasi sidik dijital
FUNGSI DAN PROSEDUR YANG DIGUNAKAN DALAM APLIKASI //FUNGSI UNTUK MENGECEK BILANGAN PRIMA Function cekprime(bil:int64):boolean; var bil1:int64; i:longint; cek:boolean; begin if (bil<=1) then cek:=false else if (bil=2)or(bil=3) then cek:=true else begin for i:=2 to (bil div 2) do begin bil1:=bil mod i; if bil1=0 then cek:=false; end; end; if cek=false then cekprime:=false else cekprime:=true; end; //FUNGSI UNTUK MENCARI FAKTOR PERSEKUTUAN TERBESAR Function fpb(ei,phei:int64):int64; var temp1,temp2,hasil:int64; begin if ei=phei then hasil:=0 else if(ei>phei)then begin while(ei mod phei <> 0) do begin temp1:=ei mod phei; ei:=phei; phei:=temp1; end; hasil:=phei; end else begin
while(phei mod ei <> 0)do begin temp2:=phei mod ei; phei:=ei; ei:=temp2; end; hasil:=ei; end; fpb:=hasil; end; //FUNGSI UNTUK MENCARI NILAI E(KUNCI PUBLIK/DEKRIPSI) Function carie(phei:int64):int64; var hasil,ei:int64; begin hasil:=0; ei:=2; while (hasil<>1) do begin ei:=ei+1; hasil:=fpb(ei,phei); end; carie:=ei; end; //FUNGSI UNTUK MENCARI NILAI ENKRIPSI Function enkripsi(nilaix:integer;SK,en:int64):int64; var sum:int64; i:longint; begin sum:=1; for i:=1 to SK do begin if sum=0 then sum:=1; sum:=(nilaix*sum)mod en; end; enkripsi:=sum; end; //FUNGSI UNTUK MENCARI MESSAGE DIGEST Function LogEntry(Cmd, Msg: string; Dig: MD5Digest): string; begin Result := Format('%s(''%s'') =' + #13#10 + ' %s', [Cmd, Msg, MD5Print(Dig)]); end; //PROSEDUR UNTUK MENAMPILKAN MESSAGE DIGEST Procedure TForm1.Button6Click(Sender: TObject);
var mesdig:string; begin Screen.Cursor := crHourGlass; display.Text:=''; with Display.Lines do begin if Count > 0 then Add(''); Add(LogEntry('MD5File',pesan.Text,MD5File(pesan.Text))) ; end; Screen.Cursor := crDefault; mesdig:=display.text; edit3.text:=copy(mesdig,length(mesdig)-33,32); end; //PROSEDUR MEMBANGKITKAN NILAI E (KUNCI DEKRIPSI/PUBLIK) Procedure TForm1.Button9Click(Sender: TObject); begin e:=carie(phi); kuncie.Text:=inttostr(e); memo6.Lines.Add('E = '+inttostr(E)); end; //PROSEDUR UNTUK MEMBUAT KUNCI BILANGAN PRIMA ACAK Procedure TForm1.Button7Click(Sender: TObject); var acak81,acak82:array[0..1]of integer; acak161,acak162:array[0..3]of integer; acak241,acak242:array[0..5]of integer; acak321,acak322,acak322n:array[0..5]of integer; pilihan1,pilihan2:word; begin acak81[0]:=5;acak81[1]:=7; acak82[0]:=29;acak82[1]:=31; acak161[0]:=1453;acak161[1]:=1451;acak161[2]:=1459;acak161[3 ]:=1483; acak162[0]:=31;acak162[1]:=29;acak162[2]:=23;acak162[3]:=37; acak241[0]:=2137;acak241[1]:=2131;acak241[2]:=2129;acak241[3 ]:=2113;acak241[4]:=2111;acak241[5]:=2099; acak242[0]:=6997;acak242[1]:=6917;acak242[2]:=6947;acak242[3 ]:=6949;acak242[4]:=6907;acak242[5]:=6899; acak322n[0]:=15485863;acak322n[1]:=15485857;acak322n[2]:=138 33997;acak322n[3]:=13012171;acak322n[4]:=11381507;acak322n[5 ]:=11868929; acak321[0]:=27449;acak321[1]:=27457;acak321[2]:=27479;acak32 1[3]:=27481;acak321[4]:=27509;acak321[5]:=22433; acak322[0]:=22447;acak322[1]:=22381;acak322[2]:=22391;acak32 2[3]:=22397;acak322[4]:=22433;acak322[5]:=22409; Case combobox1.itemindex of 0:begin pilihan1:=random(2); if pilihan1=0 then begin
pilihan1:=random(2); p:=acak81[pilihan1]; pilihan2:=random(2); q:=acak82[pilihan2]; pe.text:=inttostr(p); qi.text:=inttostr(q); end else begin pilihan1:=random(2); p:=acak82[pilihan1]; pilihan2:=random(2); q:=acak81[pilihan2]; pe.text:=inttostr(p); qi.text:=inttostr(q); end; end; 1:begin pilihan1:=random(2); if pilihan1=0 then begin pilihan1:=random(3); p:=acak161[pilihan1]; pe.text:=inttostr(p); pilihan2:=random(3); q:=acak162[pilihan2]; qi.Text:=inttostr(q); end else begin pilihan1:=random(3); p:=acak162[pilihan1]; pe.text:=inttostr(p); pilihan2:=random(3); q:=acak161[pilihan2]; qi.Text:=inttostr(q); end; end; 2:begin pilihan1:=random(2); if pilihan1=0 then begin pilihan1:=random(6); p:=acak241[pilihan1]; pe.text:=inttostr(p); pilihan2:=random(6); q:=acak242[pilihan2]; qi.Text:=inttostr(q); end else begin
pilihan1:=random(6); p:=acak242[pilihan1]; pe.text:=inttostr(p); pilihan2:=random(6); q:=acak241[pilihan2]; qi.Text:=inttostr(q); end; end; 3:begin pilihan1:=random(2); if pilihan1=0 then begin pilihan1:=random(6); p:=acak321[pilihan1]; pe.text:=inttostr(p); pilihan2:=random(6); q:=acak322[pilihan2]; qi.Text:=inttostr(q); end else begin pilihan1:=random(4); p:=acak162[pilihan1]; pe.text:=inttostr(p); pilihan2:=random(6); q:=acak322n[pilihan2]; qi.Text:=inttostr(q); end; end; end; end; //FUNGSI UNTUK MENCARI NILAI DEKRIPSI Function DEKRIP(nilaiS,PK,en:int64):int64; var sum:int64; i:longint; begin sum:=1; for i:=1 to PK do begin if sum=0 then sum:=1; sum:=(nilaiS*sum)mod en; end; DEKRIP:=sum; end;
SOURCE CODE FUNGSI HASH MD5 //MD5 Message-Digest for Delphi 4 //Delphi 4 Unit implementing the //RSA Data Security, Inc. MD5 Message-Digest Algorithm //Implementation of Ronald L. Rivest's RFC 1321 //Copyright © 1997-1999 Medienagentur Fichtner & Meyer //Written by Matthias Fichtner //See RFC 1321 for RSA Data Security's copyright and license notice! //14-Jun-97 mf Implemented MD5 according to RFC 1321 RFC 1321 //16-Jun-97 mf Initial release of the compiled unit (no source code) RFC 1321 //28-Feb-99 mf Added MD5Match function for comparing two digests RFC 1321 //13-Sep-99 mf Reworked the entire unit RFC 1321 //17-Sep-99 mf Reworked the "Test Driver" project RFC 1321 //19-Sep-99 mf Release of sources for MD5 unit and "Test Driver" project RFC 1321 unit md5; uses
Windows;
type MD5Count = array[0..1] of DWORD; MD5State = array[0..3] of DWORD; MD5Block = array[0..15] of DWORD; MD5CBits = array[0..7] of byte; MD5Digest = array[0..15] of byte; MD5Buffer = array[0..63] of byte; MD5Context = record State: MD5State; Count: MD5Count; Buffer: MD5Buffer; end; procedure MD5Init(var Context: MD5Context); procedure MD5Update(var Context: MD5Context; Input: pChar; Length: longword); procedure MD5Final(var Context: MD5Context; var Digest: MD5Digest); function MD5String(M: string): MD5Digest;
function MD5File(N: string): MD5Digest; function MD5Print(D: MD5Digest): string; function MD5Match(D1, D2: MD5Digest): boolean; // ---------------------------------------------------------------------------------------------IMPLEMENTATION // ---------------------------------------------------------------------------------------------var
PADDING: MD5Buffer = ( $80, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, );
$00, $00, $00, $00, $00, $00, $00, $00,
$00, $00, $00, $00, $00, $00, $00, $00,
$00, $00, $00, $00, $00, $00, $00, $00,
function F(x, y, z: DWORD): DWORD; begin Result := (x and y) or ((not x) and z); end; function G(x, y, z: DWORD): DWORD; begin Result := (x and z) or (y and (not z)); end; function H(x, y, z: DWORD): DWORD; begin Result := x xor y xor z; end; function I(x, y, z: DWORD): DWORD; begin Result := y xor (x or (not z)); end; procedure rot(var x: DWORD; n: BYTE); begin x := (x shl n) or (x shr (32 - n)); end;
$00, $00, $00, $00, $00, $00, $00, $00
procedure FF(var a: DWORD; b, c, d, x: DWORD; s: BYTE; ac: DWORD); begin inc(a, F(b, c, d) + x + ac); rot(a, s); inc(a, b); end; procedure GG(var a: DWORD; b, c, d, x: DWORD; s: BYTE; ac: DWORD); begin inc(a, G(b, c, d) + x + ac); rot(a, s); inc(a, b); end; procedure HH(var a: DWORD; b, c, d, x: DWORD; s: BYTE; ac: DWORD); begin inc(a, H(b, c, d) + x + ac); rot(a, s); inc(a, b); end; procedure II(var a: DWORD; b, c, d, x: DWORD; s: BYTE; ac: DWORD); begin inc(a, I(b, c, d) + x + ac); rot(a, s); inc(a, b); end; // ---------------------------------------------------------------------------------------------// Encode Count bytes at Source into (Count / 4) DWORDs at Target procedure Encode(Source, Target: pointer; Count: longword); var S: PByte; T: PDWORD; I: longword; begin S := Source; T := Target; for I := 1 to Count div 4 do begin T^ := S^; inc(S); T^ := T^ or (S^ shl 8); inc(S);
T^ := T^ or (S^ shl 16); inc(S); T^ := T^ or (S^ shl 24); inc(S); inc(T); end;
end;
// Decode Count DWORDs at Source into (Count * 4) Bytes at Target procedure Decode(Source, Target: pointer; Count: longword); var S: PDWORD; T: PByte; I: longword; begin S := Source; T := Target; for I := 1 to Count do begin T^ := S^ and $ff; inc(T); T^ := (S^ shr 8) and $ff; inc(T); T^ := (S^ shr 16) and $ff; inc(T); T^ := (S^ shr 24) and $ff; inc(T); inc(S); end; end; // Transform State according to first 64 bytes at Buffer procedure Transform(Buffer: pointer; var State: MD5State); var a, b, c, d: DWORD; Block: MD5Block; begin Encode(Buffer, @Block, 64); a := State[0]; b := State[1]; c := State[2]; d := State[3]; FF (a, b, c, d, Block[ 0], 7, $d76aa478); FF (d, a, b, c, Block[ 1], 12, $e8c7b756); FF (c, d, a, b, Block[ 2], 17, $242070db); FF (b, c, d, a, Block[ 3], 22, $c1bdceee); FF (a, b, c, d, Block[ 4], 7, $f57c0faf); FF (d, a, b, c, Block[ 5], 12, $4787c62a); FF (c, d, a, b, Block[ 6], 17, $a8304613); FF (b, c, d, a, Block[ 7], 22, $fd469501); FF (a, b, c, d, Block[ 8], 7, $698098d8);
FF FF FF FF FF FF FF GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH HH II II II II II II II II II II II II
(d, (c, (b, (a, (d, (c, (b, (a, (d, (c, (b, (a, (d, (c, (b, (a, (d, (c, (b, (a, (d, (c, (b, (a, (d, (c, (b, (a, (d, (c, (b, (a, (d, (c, (b, (a, (d, (c, (b, (a, (d, (c, (b, (a, (d, (c, (b, (a, (d, (c, (b,
a, d, c, b, a, d, c, b, a, d, c, b, a, d, c, b, a, d, c, b, a, d, c, b, a, d, c, b, a, d, c, b, a, d, c, b, a, d, c, b, a, d, c, b, a, d, c, b, a, d, c,
b, a, d, c, b, a, d, c, b, a, d, c, b, a, d, c, b, a, d, c, b, a, d, c, b, a, d, c, b, a, d, c, b, a, d, c, b, a, d, c, b, a, d, c, b, a, d, c, b, a, d,
c, b, a, d, c, b, a, d, c, b, a, d, c, b, a, d, c, b, a, d, c, b, a, d, c, b, a, d, c, b, a, d, c, b, a, d, c, b, a, d, c, b, a, d, c, b, a, d, c, b, a,
Block[ 9], Block[10], Block[11], Block[12], Block[13], Block[14], Block[15], Block[ 1], Block[ 6], Block[11], Block[ 0], Block[ 5], Block[10], Block[15], Block[ 4], Block[ 9], Block[14], Block[ 3], Block[ 8], Block[13], Block[ 2], Block[ 7], Block[12], Block[ 5], Block[ 8], Block[11], Block[14], Block[ 1], Block[ 4], Block[ 7], Block[10], Block[13], Block[ 0], Block[ 3], Block[ 6], Block[ 9], Block[12], Block[15], Block[ 2], Block[ 0], Block[ 7], Block[14], Block[ 5], Block[12], Block[ 3], Block[10], Block[ 1], Block[ 8], Block[15], Block[ 6], Block[13],
12, 17, 22, 7, 12, 17, 22, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21,
$8b44f7af); $ffff5bb1); $895cd7be); $6b901122); $fd987193); $a679438e); $49b40821); $f61e2562); $c040b340); $265e5a51); $e9b6c7aa); $d62f105d); $2441453); $d8a1e681); $e7d3fbc8); $21e1cde6); $c33707d6); $f4d50d87); $455a14ed); $a9e3e905); $fcefa3f8); $676f02d9); $8d2a4c8a); $fffa3942); $8771f681); $6d9d6122); $fde5380c); $a4beea44); $4bdecfa9); $f6bb4b60); $bebfbc70); $289b7ec6); $eaa127fa); $d4ef3085); $4881d05); $d9d4d039); $e6db99e5); $1fa27cf8); $c4ac5665); $f4292244); $432aff97); $ab9423a7); $fc93a039); $655b59c3); $8f0ccc92); $ffeff47d); $85845dd1); $6fa87e4f); $fe2ce6e0); $a3014314); $4e0811a1);
end;
II (a, b, c, d, Block[ 4], 6, $f7537e82); II (d, a, b, c, Block[11], 10, $bd3af235); II (c, d, a, b, Block[ 2], 15, $2ad7d2bb); II (b, c, d, a, Block[ 9], 21, $eb86d391); inc(State[0], a); inc(State[1], b); inc(State[2], c); inc(State[3], d);
// ---------------------------------------------------------------------------------------------// Initialize given Context procedure MD5Init(var Context: MD5Context); begin with Context do begin State[0] := $67452301; State[1] := $efcdab89; State[2] := $98badcfe; State[3] := $10325476; Count[0] := 0; Count[1] := 0; ZeroMemory(@Buffer, SizeOf(MD5Buffer)); end; end; // Update given Context to include Length bytes of Input procedure MD5Update(var Context: MD5Context; Input: pChar; Length: longword); var Index: longword; PartLen: longword; I: longword; begin with Context do begin Index := (Count[0] shr 3) and $3f; inc(Count[0], Length shl 3); if Count[0] < (Length shl 3) then inc(Count[1]); inc(Count[1], Length shr 29); end; PartLen := 64 - Index; if Length >= PartLen then begin CopyMemory(@Context.Buffer[Index], Input, PartLen); Transform(@Context.Buffer, Context.State); I := PartLen; while I + 63 < Length do begin Transform(@Input[I], Context.State); inc(I, 64);
I); end;
end; Index := 0; end else I := 0; CopyMemory(@Context.Buffer[Index], @Input[I], Length -
// Finalize given Context, create Digest and zeroize Context procedure MD5Final(var Context: MD5Context; var Digest: MD5Digest); var Bits: MD5CBits; Index: longword; PadLen: longword; begin Decode(@Context.Count, @Bits, 2); Index := (Context.Count[0] shr 3) and $3f; if Index < 56 then PadLen := 56 - Index else PadLen := 120 - Index; MD5Update(Context, @PADDING, PadLen); MD5Update(Context, @Bits, 8); Decode(@Context.State, @Digest, 4); ZeroMemory(@Context, SizeOf(MD5Context)); end; // ---------------------------------------------------------------------------------------------// Create digest of given Message function MD5String(M: string): MD5Digest; var Context: MD5Context; begin MD5Init(Context); MD5Update(Context, pChar(M), length(M)); MD5Final(Context, Result); end; // Create digest of file with given Name function MD5File(N: string): MD5Digest; var FileHandle: THandle; MapHandle: THandle; ViewPointer: pointer; Context: MD5Context; begin MD5Init(Context); FileHandle := CreateFile(pChar(N), GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE,
nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL or FILE_FLAG_SEQUENTIAL_SCAN, 0); if FileHandle <> INVALID_HANDLE_VALUE then try MapHandle := CreateFileMapping(FileHandle, nil, PAGE_READONLY, 0, 0, nil); if MapHandle <> 0 then try ViewPointer := MapViewOfFile(MapHandle, FILE_MAP_READ, 0, 0, 0); if ViewPointer <> nil then try MD5Update(Context, ViewPointer, GetFileSize(FileHandle, nil)); finally UnmapViewOfFile(ViewPointer); end; finally CloseHandle(MapHandle); end; finally CloseHandle(FileHandle); end; MD5Final(Context, Result); end; // Create hex representation of given Digest function MD5Print(D: MD5Digest): string; var I: byte; const Digits: array[0..15] of char = ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'); begin Result := ''; for I := 0 to 15 do Result := Result + Digits[(D[I] shr 4) and $0f] + Digits[D[I] and $0f]; end; // ---------------------------------------------------------------------------------------------// Compare two Digests function MD5Match(D1, D2: MD5Digest): boolean; var I: byte; begin I := 0; Result := TRUE; while Result and (I < 16) do begin Result := D1[I] = D2[I]; inc(I);
end; end; end.
SOURCE CODE APLIKASI PEMBUATAN SIDIK DIJITAL unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Menus; type TForm1 = class(TForm) Image1: TImage; Label1: TLabel; Button1: TButton; Label2: TLabel; Button2: TButton; Button3: TButton; Label3: TLabel; Button4: TButton; Image2: TImage; PESAN: TEdit; DISPLAY: TMemo; Button5: TButton; Button6: TButton; Label4: TLabel; OpenDialog1: TOpenDialog; Label5: TLabel; ComboBox1: TComboBox; Button7: TButton; PE: TEdit; QI: TEdit; Button8: TButton; Label6: TLabel; Label7: TLabel; Label8: TLabel; Label9: TLabel; Label10: TLabel; Label14: TLabel; Label11: TLabel;
Label12: TLabel; KUNCIE: TEdit; Button9: TButton; Label13: TLabel; Button10: TButton; Button11: TButton; Label15: TLabel; Label16: TLabel; Label17: TLabel; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Button12: TButton; Button13: TButton; Button14: TButton; Button15: TButton; Label18: TLabel; Label19: TLabel; Label20: TLabel; Memo1: TMemo; Memo2: TMemo; Memo3: TMemo; Memo4: TMemo; Label21: TLabel; Label22: TLabel; Label23: TLabel; Label24: TLabel; Label25: TLabel; Label26: TLabel; Memo5: TMemo; SaveDialog1: TSaveDialog; Memo6: TMemo; procedure Button4Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure Button6Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button7Click(Sender: TObject); procedure Button8Click(Sender: TObject); procedure Button9Click(Sender: TObject); procedure Button10Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button13Click(Sender: TObject); procedure Button12Click(Sender: TObject); procedure Button15Click(Sender: TObject); procedure Button14Click(Sender: TObject); procedure Button11Click(Sender: TObject); private { Private declarations } public
{ Public declarations } end; var Form1: TForm1; p,q,phi,n,m,e,d:int64; implementation {$R *.dfm} USES MD5; // MENGECEK BILANGAN PRIMA MASUKAN DARI USER Procedure TForm1.Button8Click(Sender: TObject); begin p:=strtoint64(pe.text); q:=strtoint64(qi.text); if (p*q)>=2147483649 then begin messagedlg('P dan Q yang dimasukkan terlalu besar!, ganti nilai P atau Q yang lebih kecil',mtinformation,[mbOK],0); pe.Text:=''; qi.Text:=''; end else if cekprime(p)=false then begin messagedlg('P bukan bilangan prima, masukkan P prima',mtinformation,[mbOK],0); pe.Text:=''; end else if cekprime(q)=false then begin messagedlg('Q bukan bilangan prima, masukkan Q prima',mtinformation,[mbOK],0); qi.Text:=''; end else if p=q then begin messagedlg('Anda disarankan untuk tidak memasukkan nilai P dan Q yang sama ',mtinformation,[mbOK],0); pe.Text:=''; qi.Text:=''; end else begin phi:=(p-1)*(q-1); n:=p*q; if n<=9 then
begin messagedlg('P dan Q yang dimasukkan terlalu kecil!',mtinformation,[mbOK],0); label10.caption:=''; label11.caption:=''; end else begin label10.caption:=inttostr(n); label11.caption:=inttostr(phi); memo6.Lines.Add('N = '+inttostr(N)); end; end; end; // MEMBUKTIKAN PHI RELATIF PRIMA // DENGAN E MASUKAN DARI USER SEKALIGUS MENCARI // NILAI D-NYA (KUNCI ENKRIPSI/PRIBADI) Procedure TForm1.Button10Click(Sender: TObject); Procedure TForm1.Button10Click(Sender: TObject); begin e:=strtoint64(kuncie.Text); if e<=1 then messagedlg('e yang anda masukkan tidak tepat, cari e yang lain',mtinformation,[mbok],0) else if fpb(e,phi)=1 then begin m:=1; while ((1+m*phi)mod e)<>0 do m:=m+1; d:=(1+m*phi)div e; Label14.Caption:=inttostr(d); end else begin messagedlg('e yang anda masukkan tidak relatif prime dengan phi',mtinformation,[mbok],0); kuncie.text:=''; end; end; //MEMASUKKAN MESSAGE DIGEST DARI SOFTWARE LAIN Procedure TForm1.Button13Click(Sender: TObject); var md:string; begin if edit1.text='N' then n:=p*q else n:=strtoint64(edit1.text); if edit2.text='D' then D:=d else d:=strtoint64(edit2.text);
md:=edit3.text; end;
// PEMBUATAN SIDIK DIJITAL Procedure TForm1.Button12Click(Sender: TObject); var md,ascii,semua,SIDIKDIJITAL:string; jumlahhuruf,panjangn,lebarmax,lebarblok,mulai,banyakblok,leb arbaru:integer; i,j,panjang,tambah,jumlahangka,awal:longint; hargaascii:array[1..32] of integer; x,s1:array[1..96]of string; kirim:array[1..96]of string; x1:array[1..96]of integer; s:array[1..96]of int64; huruf:array[1..96]of char; karakter:array[1..96]of byte; begin //MENCARI DERET NILAI ASCII md:=edit3.Text; panjang:=Length(md); memo1.Clear; memo2.clear; memo3.clear; memo4.clear; memo5.clear; ascii:=''; for i:=1 to panjang do begin hargaascii[i]:=ord(md[i]); memo1.lines.add(inttostr(hargaascii[i])); ascii:=concat(ascii,inttostr(hargaascii[i])); end; //MENENTUKAN PANJANG BLOK panjangn:=length(inttostr(n)); lebarmax:=panjangn-1; if lebarmax =1 then lebarblok:=lebarmax else if lebarmax=2 then lebarblok:=lebarmax else lebarblok:=3; //MENENTUKAN BANYAK BLOK if length(ascii) mod lebarblok<>0 then banyakblok:=(length(ascii)div lebarblok)+1 else banyakblok:=length(ascii)div lebarblok; Label24.caption:='banyak blok= '+inttostr(banyakblok)+', lebarblok= '+inttostr(lebarblok);
// TAHAP ENKRIPSI mulai:=1; for i:=1 to banyakblok do begin x[i]:=copy(ascii,mulai,lebarblok); x1[i]:=strtoint(x[i]); s[i]:=enkripsi(x1[i],d,n); s1[i]:=inttostr(s[i]); if odd(panjangn)=true then lebarbaru:=panjangn+1 else lebarbaru:=panjangn; tambah:=lebarbaru-length(s1[i]); for j:=1 to tambah do s1[i]:='0'+s1[i]; memo2.lines.add(s1[i]); mulai:=mulai+lebarblok; end; //hasil enkripsi semua:=''; for i:=1 to banyakblok do semua:=concat(semua,s1[i]); jumlahangka:=banyakblok*lebarbaru; jumlahhuruf:=jumlahangka div 2; Label25.caption:='banyaknya angka='+inttostr(jumlahangka); awal:=1; SIDIKDIJITAL:=''; for i:=1 to jumlahhuruf do begin kirim[i]:=copy(semua,awal,2); if kirim[i]='00' then huruf[i]:='d' else if kirim[i]='13' then huruf[i]:='e' else begin karakter[i]:=strtoint(kirim[i]); huruf[i]:=chr(karakter[i]); end; memo3.lines.add(kirim[i]); memo4.lines.Add(huruf[i]); SIDIKDIJITAL:=concat(SIDIKDIJITAL,huruf[i]); awal:=awal+2; end; MEMO5.LINES.ADD(SIDIKDIJITAL); end;
SOURCE CODE APLIKASI VERIFIKASI SIDIK DIJITAL unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) Edit1: TEdit; Edit2: TEdit; Button1: TButton; Edit4: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Button3: TButton; Memo1: TMemo; Button4: TButton; Edit5: TEdit; Label6: TLabel; Label7: TLabel; OpenDialog1: TOpenDialog; Memo2: TMemo; Edit6: TEdit; Edit7: TEdit; Label8: TLabel; Label9: TLabel; Label10: TLabel; Button5: TButton; Button6: TButton; Image1: TImage; Button7: TButton; Image2: TImage; Memo3: TMemo; Label11: TLabel; memo4: TMemo;
OpenDialog2: TOpenDialog; Button8: TButton; Edit3: TEdit; Label5: TLabel; procedure Button3Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button6Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button7Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button8Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; MD,SD:String; E,N:INT64; implementation {$R *.dfm} USES MD5; // VERIFIKASI SIDIK DIJITAL Procedure TForm1.Button3Click(Sender: TObject); VAR I,J,PANJANGBLOK,PANJANGN,PANJANGTEXT,BANYAKBLOK,AWAL,LEBARMA X,LEBARBLOK,SISA,NAMBAH:INTEGER; ASCIIMD,HASILDEKRIP,TAMBAH:STRING; BLOK1,HASIL,PLAINTEXT2:ARRAY[1..100]OF STRING; PLAINTEXT1:ARRAY[1..100]OF INT64; BLOK2:ARRAY[1..100,1..10]OF CHAR; ASCII:ARRAY[1..100,1..100]OF STRING; NILAI:ARRAY[1..100,1..10] OF STRING; begin E:=STRTOINT64(EDIT1.TEXT); N:=STRTOINT64(EDIT2.TEXT); SD:=MEMO4.Text; MD:=EDIT5.TEXT; Label6.Caption:=''; PANJANGN:=LENGTH(INTTOSTR(N)); IF ODD(PANJANGN)=TRUE THEN PANJANGN:=PANJANGN+1; PANJANGBLOK:=PANJANGN DIV 2; PANJANGTEXT:=LENGTH(SD);
BANYAKBLOK:=PANJANGTEXT DIV PANJANGBLOK; //NILAI ASCII MESSAGE DIGEST LEBARMAX:=LENGTH(INTTOSTR(N))-1; IF LEBARMAX =1 THEN LEBARBLOK:=LEBARMAX ELSE IF LEBARMAX=2 THEN LEBARBLOK:=LEBARMAX ELSE LEBARBLOK:=3; ASCIIMD:=''; FOR I:=1 TO LENGTH(MD) DO BEGIN ASCIIMD:=CONCAT(ASCIIMD,INTTOSTR(ORD(MD[I]))); END; SISA:=LENGTH(ASCIIMD) MOD LEBARBLOK; IF SISA<>0 THEN IF LEBARBLOK-SISA=1 THEN BEGIN TAMBAH:='0'+COPY(ASCIIMD,LENGTH(ASCIIMD)SISA+1,LENGTH(ASCIIMD)); DELETE(ASCIIMD,LENGTH(ASCIIMD)-SISA+1,LENGTH(ASCIIMD)); ASCIIMD:=ASCIIMD+TAMBAH; END ELSE BEGIN TAMBAH:='00'+COPY(ASCIIMD,LENGTH(ASCIIMD)SISA+1,LENGTH(ASCIIMD)); DELETE(ASCIIMD,LENGTH(ASCIIMD)-SISA+1,LENGTH(ASCIIMD)); ASCIIMD:=ASCIIMD+TAMBAH; END; EDIT6.TEXT:=ASCIIMD; //DEKRIPSI SIDIK DIJITAL AWAL:=1; HASILDEKRIP:=''; FOR I:=1 TO BANYAKBLOK DO BEGIN BLOK1[I]:=COPY(SD,AWAL,PANJANGBLOK); HASIL[I]:=''; FOR J:=1 TO PANJANGBLOK DO BEGIN BLOK2[I,J]:=BLOK1[I][J]; IF BLOK2[I,J]='d' THEN ASCII[I,J]:='00' ELSE IF BLOK2[I,J]='e' THEN ASCII[I,J]:='13' ELSE ASCII[I,J]:=INTTOSTR(ORD(BLOK2[I,J])); IF LENGTH(ASCII[I,J])=1 THEN NILAI[I,J]:='0'+ASCII[I,J] ELSE NILAI[I,J]:=ASCII[I,J]; HASIL[I]:=CONCAT(HASIL[I],NILAI[I,J]); END; MEMO3.LINES.ADD(HASIL[I]); PLAINTEXT1[I]:=DEKRIP(STRTOINT64(HASIL[I]),E,N); PLAINTEXT2[I]:=INTTOSTR(PLAINTEXT1[I]);
IF LENGTH(PLAINTEXT2[I])<>LEBARBLOK THEN BEGIN NAMBAH:=LEBARBLOK-LENGTH(PLAINTEXT2[I]); IF NAMBAH=1 THEN PLAINTEXT2[I]:=CONCAT('0',PLAINTEXT2[I]) ELSE PLAINTEXT2[I]:=CONCAT('00',PLAINTEXT2[I]); END; MEMO2.LINES.ADD(PLAINTEXT2[I]); HASILDEKRIP:=CONCAT(HASILDEKRIP,PLAINTEXT2[I]); AWAL:=AWAL+PANJANGBLOK; END; EDIT7.Text:=HASILDEKRIP; IF HASILDEKRIP=ASCIIMD THEN LaBEL6.CAPTION:='HASIL VERIFIKASI MENYATAKAN BAHWA DATA MASIH ASLI' ELSE messagedlg('Hasil dekripsi sidik dijitalnya tidak sama dengan Messae Digest Pesan, Data tidak valid!',mtinformation,[mbOK],0); end;