Jika kemarin kita membahas tentang enkripsi dan dekripsi linier, kali ini kita akan membahas salah satu sistem enkripsi asimetris, yaitu RSA. Sedikit sejarah RSA diciptakan oleh 3 orang matematikawan, bernama (Rivest - Shamir - Adleman).
Berbeda dengan enkripsi simetris yang menggunakan kunci yang sama untuk mendekripsi ataupun mengenkripsi, RSA memiliki 2 kunci. Yang pertama kunci publik yang disebar luas yang dapat digunakan untuk mengenkripsi suatu data. Dan yang kedua kunci private, yang dirahasiakan, yang dapat digunakan untuk mendekripsi chiper text menjadi plain text.
Langkah langkah untuk melakukan enkripsi dengan RSA adalah sebagai berikut.
- Kita harus memilih dua angka prima yang besar dan memiliki jarak berjauhan. Kita simbolkan dua angka prima ini sebagai
p
danq
. Bilangan prima ini harus dirahasiakan. - Hitung nilai n atau yang disebut dengan modulus yang merupakan
p * q
. - Hitung nilai euler dari
p
danq
. Nilai ini dapat disimbolkan sebagaiEtha
,Etha = (p-1) * (q - 1)
- Bangkitkan nilai e yang digunakan untuk menenkripsi pesan. Nilai e dapat dicari dengan
gcd(etha, e) = 1
. (gcd atau great common divisor adalah fpb :)) - Bangkitkan nilai d yang digunakan untuk mendekripsi pesan. Nilai d dapat dicari dengan syarat
d = e^-1 mod etha
. Sederhananya kita harus mencarid * e
yang ketika di mod oleh etha maka hasilnya adalah 1 :). Kita akan bahas kembali menggunakan contoh soal nanti.
Kita sudah berhasil mendapat dua kunci untuk melakukan enkripsi ataupun melakukan dekripsi menggunakan RSA.
Jika kita memiliki M sebagai plain text dan C sebagai chiper text. Maka
- Untuk melakukan enkripsi kita menggunakan rumus
C = (M ^ e) mod n
- Untuk melakukan dekripsi kita menggunakan rumus
M = (C ^ d) mod n
Biasanya kita menggunaknan library Crypto.Util.number sebagai library untuk mempermudah kita menggunakan RSA sebagai Kriptografi
Mari kita coba lakukan enkripsi dan dekripsi menggunakan RSA.
- Kita memiliki plain text
INI RAHASIA YA
. - Kita rubah plain text kita menjadi long integer. Seperti biasa kita gunakan bahasa favorit kita yaitu python
from Crypto.Util.number import *
M = bytes_to_long("RAHASIA")
# 23152726679701825L
- Kita harus menjadi dua bilangan prima. Untuk contoh kita gunakan bilangan prima sederhana.
p = getPrime(50)
# 918672504821917L
q = getPrime(60)
# 1049954349787377767L
- Kita mencari nilai modulus(n) dengan mengalikan p dan q.
n = p * q
- Cari nilai euler dari n.
etha = (p-1)*(q-1)
- Kita cari nilai e untuk mengenkripsi. Kita pilih e adalah 31337
e = 31337
GCD(31337, etha)
# 1
- Kita cari nilai d untuk mendekripsi.
d = inverse(e, etha)
- Kita telah memiliki segala komponen untuk melakukan enkripsi maupun dekripsi menggunakna RSA. Mari kita lakukan enkripsi.
C = pow(M, e, n)
# 300067976514851794302918890099634L
- Nilai 300067976514851794302918890099634L adalah hasil dari enkripsi plain text kita. Untuk melakukan dekripsi.
M = pow(C, d, n)
print M
print long_to_bytes(M)
# 'RAHASIA'
Kita berhasil melakukan enkripsi dan dekripsi menggunakan RSA. RSA cukup efektif digunakan apabila nilai modulus yaitu n tidak dapat difaktorkan dengan mudah. Serangan terhadap RSA dilakukan dengan berusaha memfaktorkan nilai n agar didapat nilai p dan q. Jika kita berhasil memfaktorkan nilai n dan mendapatkan nilai p dan q maka kita dapat mendekripsi chiper text tanpa harus mengetahui private key.
Skrip lengkap dapat dilihat dibawah ini ya.
from Crypto.Util.number import *
M = bytes_to_long("RAHASIA")
p = getPrime(50)
q = getPrime(60)
n = p * q
etha = (p-1)*(q-1)
e = 31337
d = inverse(e, etha)
C = pow(M, e, n)
print C
#ini adalah chiper text
M = pow(C, d, n)
print long_to_bytes(M)
#kita kembalikan kembali chiper text menjadi plain text
Note : Seluruh proses pada RSA menggunakan angka, sehingga kita harus mengubah type data yang ingin dienkripsi menjadi angka.
Sekian postingan kali ini semoga bermanfaat :).
Tidak ada komentar:
Posting Komentar