KRIPTOGRAFI KUNCI-PUBLIK
Sampai
akhir tahun 1975, hanya ada kriptografi kunci-simetri. Karena
kriptografi simetri menggunakan kunci yang sama untuk enkripsi dan
dekripsi, maka hal ini mengimplikasikan dua pihak yang berkomunikasi
saling mempercayai. Kedua pihak harus menjaga kerahasiaan kunci. Satu
masalah kritis di dalam sistem kriptografi kunci-simetri adalah cara
mendistribusikan kunci. Baik pengirim maupun penerima harus berbagi
kunci yang sama. Mengirim kunci dari pengirim ke penerima melalui
saluran publik (seperti melalui pos, telepon, internet, dsb) jelas tidak
aman, karena pihak lawan dapat menyadap kunci selama transmisi. Oleh
karena itu kunci harus dikirim melalui saluran kedua yang benar-benar
aman (misalnya melalui kurir) atau bertemu pada tempat yang ditentukan
untuk membagi kunci. Perhatikanlah kedua itu umumnya lambat dan mahal.
Masalah
ini dipecahkan oleh Diffie dan Hellman dengan mengusulkan kriptografi
nirsimetri (asymmetric cryptosystem) yang memungkinkan pengguna
berkomunikasi secara aman tanpa perlu berbagi kunci rahasia. Nama
lainnya adalah kriptografi kunci-publik (public-key cryptography), sebab
kunci untuk enkripsi diumumkan kepada publik sehingga dapat diketahui
oleh siapapun, sementara kunci untuk dekripsi hanya diketahui oleh
penerima pesan (karena itu rahasia). Siapapun dapat mengirim pesan yang
dienkripsi dengan kunci publik tersebut, tetapi hanya penerima pesan
yang dapat mendekripsi pesan karena hanya ia yang mengetahui kunci
privatnya sendiri. Ini berlawanan dengan kriptografi kunci simetri yang
hanya mempunya satu kunci.
Keuntungan
kriptografi kunci-publik ada dua. Pertama, tidak ada kebutuhan untuk
mendistribusikan kunci privat sebagaimana pada kriptografi
kunci-simetri. Kunci publik dapat dikirim ke penerima melalui saluran
yang sama dengan saluran yang digunakan untuk mengirim pesan. Perhatikan
bahwa saluran untuk mengirim pesan umumnya tidak aman. Kedua, jumlah
kunci dapat ditekan. Untuk komunikasi secara rahasia dengan banyak orang
tidak perlu kunci rahasia sebanyak jumlah orang tersebut, cukup membuat
dua buah kunci, yaitu kunci pulik bagi para koresponden untuk
mengenkripsi pesan, dan kunci privat untuk mendekripsi pesan. Berbeda
dengan kriptografi kunci-simetri dimana jumlah kunci yang dibuat adalah
sebanyak jumlah pihak yang diajak korespondensi.
Yang
termasuk algoritma kriptografi kunci publik adalah RSA, ElGamal,
Algoritma Pertukaran Kunci Diffie-Hellman, Algoritma Knapsack. Berikut
akan dijelaskan mengenai salah satu dari algoritma kunci publik yaitu
RSA.
RSA
Pada
tahun 1978, Ron Rivest, Adi Shamir, dan Leonard Adleman yang merupakan
tiga orang professor di MIT (Massachussets Institute of Technology),
pertama kali mempublikasikan teori secret exponents yang diberi nama RSA
(Rivest, Shamir, Adleman) yang merupakan suatu metode untuk memperoleh
Digital Signatures dan Public-Key Cryptosystems.
Algoritma
RSA adalah algoritma yang paling popular dari sekian banyak algoritma
kriptografi kunci-publik yang pernah dibuat. Algoritma RSA didasarkan
pada bukti bahwa menemukan bilangan prima yang cukup besar kemudian
mengkalikannya lebih mudah dibandingkan memfaktorkan hasil dari
perkalian dua buah bilangan prima tersebut untuk mendapatkan faktornya
yang merupakan dua buah bilangan prima itu sendiri.
Algoritma RSA memiliki besaran-besaran sbagai berikut :
1. p dan q bilangan prima (rahasia)
2. n = p . q (tidak rahasia)
3. ф(n) = (p-1)(q-1) (rahasia)
4. e (kunci enkripsi) (tidak rahasia)
5. d (kunci dekripsi) (rahasia)
6. m (plainteks) (rahasia)
7. c (cipherteks) (tidak rahasia)
Perumusan Algoritma RSA
Algoritma RSA didasarkan pada teorema Euler yang menyatakan bahwa
a ф(n) ≡ 1 (mod n)
denagn syarat :
a harus relative prima terhadap n
ф(n) = n (1 – 1/p1)(1 – 1/p2) … (1 – 1/pr), yang dalam hal ini p1,p2, …,pr adalah
faktor prima dari n. ф(n) adalah fungsi yang menentukan berapa banyak
dari bilangan-bilangan 1,2,3, …,n yang relative prima terhadap n.
Deskripsi Algoritma RSA
Secara garis besar proses dari RSA terbagi ke dalam tiga buah proses, yaitu key generation, encryption, dan decryption
a) Key Generation (Pembangkit pasangan kunci)
Public key adalah kunci publik untuk setiap user dapat diperoleh melalui prosedur berikut:
1. Pilih dua buah bilangan prima sembarang, p dan q
2. Hitung n = p . q (sebaiknya p ≠ q, sebab jika p = q maka n = p2 sehingga p dapat diperoleh dengan menarik akar pangkat dua dari n)
3. Hitung ф(n) = (p-1)(q-1)
4. Pilih kunci public, e, yang relative prima terhadap ф(n)
5. Bangkitkan
kunci privat, yaitu e . d ≡ 1 (mod ф(n)). Perhatikan bahwa e . d ≡1
(mod ф(n)) ekivalen denagn e . d = 1 + kф(n), sehingga secara sederhana d
dapat dihitung dengan d = (1 + kф(n)) / e
6. Nilai dari (e,n) adalah kunci publiknya dan (d,n) adalah kunci privatnya
b) Encryption (Enkripsi)
1. Ambil kunci publik pnerima pesan, e, dan modulus n
2. Nyatakan plainteks m menjadi blok-blok m1, m2, …sedemikian sehingga setiap blok mempresentasikan niali di dalam selang [0, n-1]
3. Setiap blok mi dienkripsi menjadi blok ci dengan rumus ci = mi e mod n
c) Decryption (Dekripsi)
Setiap blok cipherteks ci didekripsi kembali menjadi blok mi dengan rumus
mi = ci d mod n
Source Code RSA (C program)
#include
#include
#define TRUE 1
#define FALSE 0
void get_prime( long *val);
long getE( long PHI);
long get_common_denom( long e, long PHI);
long getD( long e, long PHI);
long decrypt(long c,long n, long d);
int main(void)
{
long a,b,n,e,PHI,d,m,c;
get_prime(&a);
get_prime(&b);
n=a*b;
PHI=(a-1)*(b-1);
e=getE(PHI);
d= getD(e,PHI);
printf(“Enter input value >> “); scanf(“%ld”,&m);
printf(“a=%ld b=%ld n=%ld PHI=%ld\n”,a,b,n,PHI);
c=(long)pow(m,e) % n; /* note, this may overflow with large numbers */
/* when e is relatively large */
printf(“e=%ld d=%ld c=%ld\n”,e,d,c);
m=decrypt(c,n,d); /* this function required as c to */
/*the power of d causes an overflow */
printf(“Message is %ld “,m);
return(0);
}
long decrypt(long c,long n, long d)
{
long i,g,f;
if (d%2==0) g=1; else g=c;
for (i=1;i<=d/2;i++)
{
f=c*c % n;
g=f*g % n;
}
return(g);
}
long getD( long e, long PHI)
{
long u[3]={1,0,PHI};
long v[3]={0,1,e};
long q,temp1,temp2,temp3;
while (v[2]!=0)
{
q=floor(u[2]/v[2]);
temp1=u[0]-q*v[0];
temp2=u[1]-q*v[1];
temp3=u[2]-q*v[2];
u[0]=v[0];
u[1]=v[1];
u[2]=v[2];
v[0]=temp1;
v[1]=temp2;
v[2]=temp3;
}
if (u[1]<0 p="p" return="return" u="u">
else return(u[1]);
}
long getE( long PHI)
{
long great=0, e=2;
while (great!=1)
{
e=e+1;
great = get_common_denom(e,PHI);
}
return(e);
}
long get_common_denom(long e, long PHI)
{
long great,temp,a;
if (e >PHI)
{
while (e % PHI != 0)
{
temp= e % PHI;
e =PHI;
PHI = temp;
}
great = PHI;
} else
{
while (PHI % e != 0)
{
a = PHI % e;
PHI = e;
e = a;
}
great = e;
}
return(great);
}
void get_prime( long *val)
{
#define NO_PRIMES 13
long primes[NO_PRIMES]={3,5,7,11,13,17,19,23,29,31,37,41,43};
long prime,i;
do
{
prime=FALSE;
printf(“Enter a prime number >> “);
scanf(“%ld”,val);
for (i=0;i
0>
if (*val==primes[i]) prime=TRUE;
} while (prime==FALSE);
}
Padding schemes
Padding schemes harus dibangun secara hati-hati sehingga tidak ada nilai dari m yang menyebabkan masalah keamanan. Sebagai contoh, jika kita ambil contoh sederhana dari penampilan ASCII dari m dan menggabungkan bit-bit secara bersama-sama akan menghasilkan n, kemudian pessan yang berisi ASCII tunggal karakter
NUL
(nilai numeris 0) akan menghasilkan n= 0, yang akan menghasilkan ciphertext 0 apapun itu nilai dari e dan N yang digunakan. Sama halnya dengan karakter ASCII tunggal SOH
(nilai numeris 1) akan selalu menghasilkan chiphertext 1. Pada kenyataannya, untuk sistem yang menggunakan nilai e
yang kecil, seperti 3, seluruh karakter tunggal ASCII pada pesan akan
disandikan menggunakan skema yang tidak aman, dikarenakan nilai terbesar
n adalah nilai 255, dan 2553
menghasilkan nilai yang lebih kecil dari modulus yang sewajarnya, maka
proses dekripsi akan menjadi masalah sederhana untuk mengambil pola
dasar dari ciphertext tanpa perlu menggunakan modulus N.
Sebagai konsekuensinya, standar seperti PKCS didesain dengan sangat
hati-hati sehingga membuat pesan asal-asalan dapat terenkripsi secara
aman. Dan juga berdasar pada bagian Kecepatan, akan dijelaskan kenapa m hampir bukanlah pesan itu sendiri tetapi lebih pada message key yang dipilh secara acak.Pengesahan pesan
RSA dapat juga digunakan untuk mengesahkan sebuah pesan. Misalkan Alice ingin mengirim pesan kepada Bob. Alice membuat sebuah hash value dari pesan tersebut, di pangkatkan dengan bilangan d dibagi N
(seperti halnya pada deskripsi pesan), dan melampirkannya sebagai
“tanda tangan” pada pesan tersebut. Saat Bob menerima pesan yang telah
“ditandatangani”, Bob memangkatkan “tanda tangan” tersebut dengan
bilangan e dibagi N (seperti halnya pada enkripsi pesan), dan membandingkannya dengan nilai hasil dari hash value dengan hash value
pada pesan tersebut. Jika kedua cocok, maka Bob dapat mengetahui bahwa
pemilik dari pesan tersebut adalah Alice, dan pesan pun tidak pernah
diubah sepanjang pengiriman.
Harap dicatat bahwa padding scheme merupakan hal yang esensial untuk mengamankan pengesahan pesan seperti halnya pada enkripsi pesan, oleh karena itu kunci yang sama tidak digunakan pada proses enkripsi dan pengesahan.
Keamanan
Penyerangan
yang paling umum pada RSA ialah pada penanganan masalah faktorisasi
pada bilangan yang sangat besar. Apabila terdapat faktorisasi metode
yang baru dan cepat telah dikembangkan, maka ada kemungkinan untuk
membongkar RSA.
Pada
tahun 2005, bilangan faktorisasi terbesar yang digunakan secara umum
ialah sepanjang 663 bit, menggunakan metode distribusi mutakhir. Kunci
RSA pada umumnya sepanjang 1024—2048 bit. Beberapa pakar meyakini bahwa
kunci 1024-bit ada kemungkinan dipecahkan pada waktu dekat (hal ini
masih dalam perdebatan), tetapi tidak ada seorangpun yang berpendapat
kunci 2048-bit akan pecah pada masa depan yang terprediksi.
Semisal Eve, seorang eavesdropper (pencuri dengar—penguping), mendapatkan public key N dan e, dan ciphertext c. Bagimanapun juga, Eve tidak mampu untuk secara langsung memperoleh d yang dijaga kerahasiannya oleh Alice. Masalah untuk menemukan n seperti pada ne=c mod N di kenal sebagai permasalahan RSA.
Cara paling efektif yang ditempuh oleh Eve untuk memperoleh n dari c ialah dengan melakukan faktorisasi N kedalam p dan q, dengan tujuan untuk menghitung (p-1)(q-1) yang dapat menghasilkan d dari e.
Tidak ada metode waktu polinomial untuk melakukan faktorisasi pada
bilangan bulat berukuran besar di komputer saat ini, tapi hal tersebut
pun masih belum terbukti.
Masih belum ada bukti pula bahwa melakukan faktorisasi N adalah satu-satunya cara untuk memperoleh n dari c, tetapi tidak ditemukan adanya metode yang lebih mudah (setidaknya dari sepengatahuan publik).
Bagaimanapun juga, secara umum dianggap bahwa Eve telah kalah jika N berukuran sangat besar.
Jika N sepanjang 256-bit atau lebih pendek, N
akan dapat difaktorisasi dalam beberapa jam pada Personal Computer,
dengan menggunakan perangkat lunak yang tersedia secara bebas. Jika N sepanjang 512-bit atau lebih pendek, N
akan dapat difaktorisasi dalam hitungan ratusan jam seperti pada tahun
1999. Secara teori, perangkat keras bernama TWIRL dan penjelasan dari
Shamir dan Tromer pada tahun 2003 mengundang berbagai pertanyaan akan
keamanan dari kunci 1024-bit. Santa disarankan bahwa N setidaknya sepanjang 2048-bit.
Pada
thaun 1993, Peter Shor menerbitkan Algoritma Shor , menunjukkan bahwa
sebuah komputer quantum secara prinsip dapat melakukan faktorisasi dalam
waktu polinomial, mengurai RSA dan algoritma lainnya. Bagaimanapun
juga, masih terdapat pedebatan dalam pembangunan komputer quantum secara
prinsip.
Pembangkitan kunci
Menemukan bilangan prima besar p dan q
pada biasanya didapat dengan mencoba serangkaian bilangan acak dengan
ukuran yang tepat menggunakan probabilitas bilangan prima yang dapat
dengan cepat menghapus hampir semua bilangan bukan prima.
p dan q seharusnya tidak “saling-berdekatan”, agar faktorisasi fermat pada N berhasil. Selain itu pula, jika p-1 atau q-1 memeiliki faktorisasi bilangan prima yang kecil, N dapat difaktorkan secara mudah dan nilai-nilai dari p atau q dapat diacuhkan.
Seseorang
seharusnya tidak melakukan metoda pencarian bilangan prima yang hanya
akan memberikan informasi penting tentang bilangan prima tersebut kepada
penyerang. Biasanya, pembangkit bilangan acak yang baik akan memulai
nilai bilangan yang digunakan. Harap diingat, bahwa kebutuhan disini
ialah “acak” dan
“tidak-terduga”. Berikut ini mungkin tidak memenuhi kriteria, sebuah
bilangan mungkin dapat dipilah dari proses acak (misal, tidak dari pola
apapun), tetapi jika bilangan itu mudah untuk ditebak atau diduga (atau
mirip dengan bilangan yang mudah ditebak), maka metode tersebut akan
kehilangan kemampuan keamanannya. Misalnya, tabel bilangan acak yang
diterbitkan oleh Rand Corp pada tahun 1950-an mungkin memang benar-benar
teracak, tetapi dikarenakan diterbitkan secara umum, hal ini akan
mempermudah para penyerang dalam mendapatkan bilangan tersebut. Jika
penyerang dapat menebak separuh dari digit p atau q, para penyerang dapat dengan cepat menghitung separuh yang lainnya (ditunjukkan oleh Donald Coppersmith pada tahun 1997).
Sangatlah penting bahwa kunci rahasia d bernilai cukup besar, Wiener menunjukkan pada tahun 1990 bahwa jika p diantara q dan 2q (yang sangat mirip) dan d lebih kecil daripada N1/4/3, maka d akan dapat dihitung secara effisien dari N dan e. Kunci enkripsi e = 2 sebaiknya tidak digunakan.
Kecepatan
RSA
memiliki kecepatan yang lebih lambat dibandingkan dengan DES dan
algoritma simetrik lainnya. Pada prakteknya, Bob menyandikan pesan
rahasia menggunakan algoritma simetrik, menyandikan kunci simetrik
menggunakan RSA, dan mengirimkan kunci simetrik yang dienkripsi
menggunakan RSA dan juga mengirimkan pesan yang dienkripasi secara
simetrik kepada Alice.
Prosedur
ini menambah permasalahan akan keamanan. Singkatnya, Sangatlah penting
untuk menggunakan pembangkit bilangan acak yang kuat untuk kunci
simetrik yang digunakan, karena Eve dapat melakukan bypass terhadap RSA dengan menebak kunci simterik yang digunakan.
Distribusi kunci
Sebagaimana halnya cipher, bagaimana public key RSA didistribusi menjadi hal penting dalam keamanan. Distribusi kunci harus aman dari man-in-the-middle attack (penghadang-ditengah-jalan).
Anggap Eve dengan suatu cara mampu memberikan kunci arbitari kepada Bob
dan membuat Bob percaya bahwa kunci tersebut milik Alice. Anggap Eve
dapan “menghadang” sepenuhnya transmisi antara Alice dan Bob. Eve
mengirim Bob public key milik Eve, dimana Bob percaya bahwa public key tersebut milik Alice. Eve dapat menghadap seluruh ciphertext
yang dikirim oleh Bob, melakukan dekripsi dengan kunci rahasia milik
Eve sendiri, menyimpan salinan dari pesan tersebut, melakukan enkripsi
menggunakan public key milik Alice, dan mengirimkan ciphertext
yang baru kepada Alice. Secara prinsip, baik Alice atau Bob tidak
menyadari kehadiran Eve diantara transmisi mereka. Pengamanan terhadap
serangan semacam ini yaitu menggunakan sertifikat digital atau komponen
lain dari infrastuktur public key.
Penyerangan waktu
Kocher
menjelaskan sebuah serangan baru yang cerdas pada RSA di tahun 1995:
jika penyerang, Eve, mengetahui perangkat keras yang dimiliki oleh Alice
secara terperinci dan mampu untuk mengukur waktu yang dibutuhkan untuk
melakukan dekripsi untuk beberapa ciphertext, Eve dapat menyimpulkan kunci dekripsi d
secara cepat. Penyerangan ini dapat juga diaplikasikan pada skema
“tanda tangan” RSA. SAlah satu cara untuk mencegah penyerangan ini yaitu
dengan memastikan bahwa operasi dekripsi menggunakan waktu yang konstan
untuk setiap ciphertext yang diproses. Cara yang lainnya, yaitu dengan menggunakan properti multipikatif dari RSA. Sebagai ganti dari menghitung cd mod N, Alice pertama-tama memilih nilai bilangan acak r dan menghitung (rec)d mod N. Hasil dari penghitungan tersebut ialah rm mod N kemudian efek dari r dapat dihilangkan dengan perkalian dengan inversenya. Nilai baru dari r dipilih pada tiap ciphertext. Dengan teknik ini, dikenal sebagai message blinding (pembutaan pesan), waktu yang diperlukan untuk proses dekripsi tidak lagi berhubungan dengan nilai dari ciphertext sehingga penyerangan waktu akan gagal.
Penyerangan ciphertext adaptive
Pada tahun 1998, Daniel Bleichenbacher menjelaskan penggunaan penyerangan ciphertext adaptive, terhadap pesan yang terenkripsi menggunakan RSA dan menggunakan PKCS #1 v1 padding scheme.
Dikarenakan kecacatan pada skema PKCS #1, Bleichenbacher mampu untuk
melakukan serangkaian serangan terhadap implementasi RSA pada protokol
Secure Socket Layer, dan secara potensial mengungkap kunci-kunci yang
digunakan. Sebagai hasilnya, para pengguna kriptografi menganjurkan
untuk menggunakan padding scheme yang relatif terbukti aman seperti Optimal Asymmetric Encryption Padding, dan Laboratorium RSA telah merilis versi terbaru dari PKCS #1 yang tidak lemah terdapat serangan ini.
sumber : http://indah4yu.wordpress.com/