Public key memungkinkan orang mengirim pesan terenkripsi tanpa mengetahui kunci yang digunakan untuk dekripsi. Hal ini dikarenakan kunci yang digunakan asymetric, dimana kunci yang digunakan dekripsi berbeda dengan yang digunakan untuk enkripsi.

Terdapat modul Python PyCrypto yang menyediakan fungsi enkripsi public key. Untuk menginstall modul ini gunakan pip atau download module binary yang sudah tersedia


$ pip install PyCrypto

Untuk melakukan enkripsi dan dekripsi diperlukan kunci, PyCrypto menyediakan fungsi untuk membuat kunci dengan beberapa pilihan algoritma.
  • DSA
  • RSA
  • ElGamal
  • qNEW

Pembuatan Kunci

Dalam proses pembuatan kunci dibutuhkan data random dan panjang kunci yang akan dibuat (dalam kelipatan 256 dan lebih dari 1024). Data random dihasilkan oleh class Random yang menyediakan random number generation.



from Crypto.PublicKey import RSA
from Crypto import Random

# fungsi menghasilkan data random
rng = Random.new().read

# generate kunci dengan panjang 5120 bit
key = RSA.generate(256 * 20, rng)

# export private key ke private.pem
open(‘private.pem’, ‘w’).write(key.exportKey())

# export public key ke public.pem
open(‘public.pem’, ‘w’).write(key.publickey().exportKey())


Enkripsi

Gunakan kunci public public.pem untuk melakukan enkripsi.


from Crypto.PublicKey import RSA

# import key dari file
key = RSA.importKey(open(‘public.pem’).read())

message = ‘ini pesan rahasia blabla bla’

#enkripsi encrypt(plaintext, K); untuk RSA nilai K tidak digunakan
chipertext = key.encrypt(message, None)

open(‘encrypted_message’, ‘wb’).write(“.join(chipertext))


Dekripsi

Untuk melakukan dekripsi import kunci dari private.pem.


from Crypto.PublicKey import RSA

# import private key dari file
key = RSA.importKey(open(‘private.pem’).read())

# baca chipertext
chipertext = open(‘encrypted_message’, ‘rb’).read()

# dekripsi
message = key.decrypt(chipertext)

print message


Catatan: Proses enkripsi masih menggunakan enkripsi primitive RSA, pada aplikasi yang sebenarnya selalu dibutuhkan penggunakan cryptographic padding yang tepat. Gunakan modul Crypto.Cipher.PKCS1_OAEP atau Crypto.Cipher.PKCS1_v1_5.