Contoh Penggunaan Tanda Tangan Digital Kriptografi Menggunakan Python

G. Prasetyadi Comments 356 views

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

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.

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

# 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.

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

# 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.")

information-communications-technology
kriptografi python