Contoh Penggunaan Tanda Tangan Digital Kriptografi Menggunakan Python

1337

Pada contoh ini, akan digunakan library kode kriptografi primitif PyCryptodome. Hash diciptakan menggunakan SHA3-256 standar FIPS 202.

Bagi yang ingin membaca penjelasan singkat tentang tanda tangan digital, Departemen Keamanan Dalam Negeri Amerika Serikat membuat tulisan di sini.

Sistem manajemen paket Python yang digunakan adalah pip. PyCryptodome dapat diinstal pada environment dengan perintah pip install pycryptodome.

RSASSA-PSS berbasis RSA.

Skema ini adalah probabilistik (probabilistic signature scheme), dimaksudkan untuk menggantikan skema RSA-PKCS#1 v1.5.

Kode di pihak pengirim pesan kira-kira seperti ini:

from Crypto.Signature import pss
from Crypto.Hash import SHA3_256
from Crypto.PublicKey import RSA
from Crypto import Random

# Membuat pasangan kunci publik - privat
key = RSA.generate(2048)
private_key = key.export_key()
public_key = key.publickey().export_key()

# Membuat variabel bernilai string sebagai pesan
message = 'Nobody inspects the spammish repetition'

# Tiga baris kode di bawah dijalankan oleh pihak pengirim
key = RSA.import_key(private_key)
h = SHA3_256.new(message.encode('utf-8'))
signature = pss.new(key).sign(h) # membuat tanda tangan

# Pada tahap ini, pesan dikirimkan ke penerima
# Tanda tangan bisa saja ditambahkan (append) pada pesan

Kode program di pihak penerima pesan kira-kira seperti di bawah. Kode di bawah tidak menjelaskan bagaimana penerima pesan mendapatkan pesan tersebut dan public key-nya ya.. Jadi di tahap ini, penerima pesan melakukan pemeriksaan validitas pesan menggunakan metode verify().

# Verifikasi tanda tangan (untuk pihak penerima)
key = RSA.import_key(public_key)
h = SHA3_256.new(message.encode('utf-8'))
verifier = pss.new(key)
try:
    verifier.verify(h, signature)
    print("Tanda tangan OK.")
except (ValueError, TypeError):
    print("Gagal: Tanda tangan tidak autentik.")

Kunci RSA dapat juga disimpan sebagai file, contohnya (untuk private key):

file_out = open("private.pem", "wb")
file_out.write(private_key)
file_out.close()

DSA berbasis ECC

Memanfaatkan library ini, kodenya mirip seperti PSS. Kita harus menentukan curve dan mode.

Di sisi pengirim:

from Crypto.Signature import DSS
from Crypto.Hash import SHA3_256
from Crypto.PublicKey import ECC
from Crypto import Random

# Membuat pasangan kunci publik - privat
key = ECC.generate(curve='P-256')
private_key = key.export_key(format='PEM')
public_key = key.public_key().export_key(format='PEM')
print(f'Private key:\n {private_key}')
print(f'Public key:\n {public_key}')

# Membuat variabel bernilai string sebagai pesan
message = 'Nobody inspects the spammish repetition'

# Tiga baris kode di bawah dijalankan oleh pihak pengirim
key = ECC.import_key(private_key)
h = SHA3_256.new(message.encode('utf-8'))
signature = DSS.new(key, 'fips-186-3').sign(h) # membuat tanda tangan

# Pada tahap ini, pesan dikirimkan ke penerima
# Tanda tangan bisa saja ditambahkan (append) pada pesan

Di sisi penerima (penjelasan sama seperti di RSA PSS):

# Verifikasi tanda tangan (untuk pihak penerima)
key = ECC.import_key(public_key)
h = SHA3_256.new(message.encode('utf-8'))
verifier = DSS.new(key, 'fips-186-3')
try:
    verifier.verify(h, signature)
    print("Tanda tangan OK.")
except (ValueError, TypeError):
    print("Gagal: Tanda tangan tidak autentik.")