08. LAB

In questo paragrafo sono mostrati degli esempi di programmi Python che fanno uso della libreria rsa per generare una coppia di chiavi asimmetriche, firmare un documento e verificare l'autenticità della firma.

Prima di eseguire i programmi con Python è necessario installare il pacchetto rsa eseguendo in un terminale il comando

pip install rsa


Progamma key.py

# Questo programma genera una coppia di chiavi 

# private_key.pem: contiene la chiave privata in formato PEM

# public_key.pem: contiene la chiave pubblica in formato PEM


import rsa

import base64


print("Generazione di una coppia di chiavi RSA...")


# Genera una coppia di chiavi RSA

(pubkey, privkey) = rsa.newkeys(2048)


# Salva le chiavi nei file

with open('public_key.pem', mode='wb') as file:

    file.write(pubkey.save_pkcs1())


with open('private_key.pem', mode='wb') as file:

    file.write(privkey.save_pkcs1())

print("...generazione avvenuta con successo")



Programma firma.py

# Questo programma legge un messaggio di testo inserito dall'utente e lo firma

# private_key.pem: contiene la chiave privata in formato PEM

# message.txt: contiene il messaggio in chiaro

# signature.txt: contiene la firma del messaggio nel formato base64

import rsa

import base64


try:

    # Legge la chiave privata

    with open("private_key.pem", "rb") as key_file:

        privkey = rsa.PrivateKey.load_pkcs1(key_file.read())

except:

    print("Errore nella lettura del file della chiave privata")

    exit()


# Legge il messaggio da firmare

message = input("Inserire il messaggio da firmare\n")


# Salva il messaggio in chiaro nel file message.txt") 

with open("message.txt", "w") as f:

    f.write(message)


# Genera la firma del messaggio

signature = rsa.sign(bytes(message, 'utf-8'), privkey, 'SHA-256')


# Salva la firma nel file

with open("signature.txt", mode="wb") as file:

    file.write(base64.b64encode(signature))



Programma verifica.py

# Questo programma verifica se la firma del documento è autentica

# public_key.pem: contiene la chiave pubblica in formato PEM

# message.txt: contiene il messaggio in chiaro

# signature.txt: contiene la firma del messaggio nel formato base64

import rsa

import base64

 

try:

    # Legge la chiave pubblica

    with open("public_key.pem", "rb") as key_file:

        pubkey = rsa.PublicKey.load_pkcs1(key_file.read())

except:

    print("Errore nella lettura del file della chiave pubblica")

    exit()


try:

    # Legge il messaggio in chiaro

    with open("message.txt", "r") as f:

        message = f.read()

except:

    print("Errore nella lettura del messaggio in chiaro")

    exit()


try:

    # Legge la firma

    with open("signature.txt", "rb") as signature_file:

        signature = base64.b64decode(signature_file.read())

except:

    print("Errore nella lettura della firma")

    exit()

    

# Verifica la firma utilizzando la chiave pubblica

try:

    rsa.verify(bytes(message, 'utf-8'), signature, pubkey)

    print("La firma è valida")

except:

    print("La firma non è valida")