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")
Sito: 7ecnologie
Sezione: 14. Sicurezza informatica
Capitolo: 02. Crittografia
Paragrafo: 08. LAB
Indice dei capitoli: 00. Risorse - 01. Il quadro normativo - 02. Crittografia - 03. Protocolli per la sicurezza - 04. Applicazioni e Servizi - 98. Esercizi
Indice dei paragrafi: 01. Cifrari nella storia - 02. Crittografia simmetrica - 03. Crittografia asimmetrica - 04. Funzione hash - 05. Certificato digitale - 06. Firma digitale - 07. Codifica base 64 - 08. LAB