Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Scopo dellesercitazione
Scopo dellesercitazione e` sperimentare le procedure e le problematiche associate alluso delle diverse primitive
crittografiche. Lesercitazione e` basata sulluso estensivo di OpenSSL (http://www.openssl.org/), una
libreria crittografica rilasciata come software open-source con licenza BSD e disponibile su un ampio insieme
di piattaforme, inclusi Linux e Windows.
Lesercitazione e` essenzialmente basata sulluso di programmi funzionanti da linea di comando. Usando
OpenSSL si possono invocare varie funzioni crittografiche attraverso la shell digitando:
openssl
Per usare OpenSSL bisogna rispettare la seguente sintassi:
openssl command [ command opts ] [ command args ]
Per il corretto svolgimento di questa esercitazione sar`a necessario usare i comandi:
genrsa rsa pkeyutl dgst rand enc
Vengono di seguito riportate alcune informazioni che illustrano lutilizzo di questi comandi. Per le opzioni di
base dei comandi enc e dgst fate riferimento allesercitazione di laboratorio numero 2 ed alle relative soluzioni. Per la lista completa delle opzioni ed una descrizione dettagliata dei comandi visionare le relative pagine
man.
Eventuali file e programmi necessari allo svolgimento dei singoli esercizi sono disponibili scaricando larchivio
http://security.polito.it/lioy/03gsd/03gsd_1415_lab03_materiale.zip.
openssl genrsa
Innanzitutto sar`a necessario generare delle chiavi RSA. Questo pu`o essere fatto mediante il comando genrsa:
openssl genrsa [-out file out] [numbits]
in cui:
-out file out, salva le chiavi generate (pubblica e privata) nel file file out;
numbits, la lunghezza in bit del modulo.
Nota: quando il man di OpenSSL parla di chiave privata, intende solitamente linsieme di chiave privata e
chiave pubblica; sono infatti entrambe contenute nella stessa struttura dati. Volendo, le componenti private di
una chiave RSA potrebbero essere conservate separatamente da quelle pubbliche, ma ci`o non ha molto senso,
e` meno efficiente dal punto di vista computazionale e viene fatto raramente (cfr. lo standard PKCS#1).
1
openssl rsa
Per gestire e manipolare chiavi RSA, si pu`o usare il modulo rsa:
openssl rsa [-in file input] [-out file out] [-text] [-pubin] [-pubout] [-noout]
in cui:
-in file input, specifica il file di input (contenente una chiave pubblica o privata);
-out file out, salva in file out le chiavi (pubblica o privata) dopo aver svolto loperazione richiesta;
-text, visualizza le chiavi in formato testuale, utile ai fini di visualizzazione. Le chiavi saranno visualizzate anche in formato Base64 a meno che non venga anche usato -noout;
-pubin, flag che indica che la chiave passata in input (mediante il comando -in) e` una chiave pubblica
(se non specificato, rsa assume che sia una chiave privata);
-pubout, serve a produrre in output la chiave pubblica, pi`u precisamente, produce in output solo le
componenti pubbliche (se non specificato, rsa produrr`a la chiave privata, cio`e tutto);
-noout, blocca la produzione in output delle chiavi in formato Base64.
openssl pkeyutl
Il comando pkeyutl serve ad effettuare operazioni di cifratura, decifratura, firma, verifica e scambio di chiavi,
mediante diversi algoritmi asimmetrici. Attualmente gli algoritmi supportati sono:
RSA, per cifrare, decifrare, firmare e verificare,
Diffie-Hellman (DH), per scambiare una chiave simmetrica,
Elliptic Cryptography (EC) per firmare e verificare usando ECDSA e scambiare una chiave simmetrica
con ECDH.
openssl pkeyutl [-encrypt] [-decrypt] [-in file input] [-out file output] [-pubin]
[-inkey file chiave] [-sign] [-verify] [-verifyrecover]
in cui:
-in file input, specifica il file di input (che contiene il messaggio da cifrare, decifrare, firmare o
verificare);
-out file out, salva in file out loutput di pkeyutl;
-inkey file chiave, specifica che il file file chiave contiene la chiave pubblica o privata;
-encrypt/-decrypt, cifra con la chiave pubblica o decifra con la chiave privata il file di input (passato
con -in);
-pubin, flag che indica che la chiave passata in input (mediante il comando -inkey) e` una chiave
pubblica. Se non specificato, pkeyutl assume che sia una chiave privata;
-sign, genera la firma applicata al file di input (passato con -in) usando la chiave passata con lopzione
-inkey. E` necessaria una chiave privata. Pi`u precisamente, se si usa una chiave RSA, il file passato in
input viene cifrato con la chiave privata;
-verifyrecover, verifica la firma passata tramite il file di input (passato con -in) usando la chiave
passata con lopzione -inkey e visualizza i dati decifrati. E` necessaria una chiave pubblica RSA (non
funziona con DSA, DH o ECC). Questa opzione e` disponibile solo se si usa una chiave RSA, in pratica,
il file di input viene decifrato con la chiave pubblica;
-verify, calcola la firma del file di input (passato con -in) usando la chiave pubblica passata con lopzione -inkey (`e necessaria una chiave pubblica) e la confronta con unaltra firma passata tramite lopzione -sigfile. Restituisce un valore Booleano (Signature Verified Successfully/Signature Verification
Failure).
Nota: al contrario di tutti gli altri comandi openssl, in pkeyutl lordine in cui vengono passati i parametri e`
importante. Rispettate lordine dei parametri presentato qui sopra oppure lesecuzione dei comandi fallir`a.
openssl dgst
Il comando dgst pu`o essere anche usato per calcolare e verificare una firma digitale, in pratica, e` il modo
migliore per farlo:
openssl dgst [-md5|-md4|-md2|-sha1|-sha|-mdc2|-ripemd160|-dss1]
[-out filename] [-sign chiave privata] [-verify chiave pubblica]
[-signature firma] [file da firmare]
in cui:
-sign chiave privata, calcola la firma del file da firmare usando lalgoritmo di digest scelto e la
chiave nel file chiave privata;
-verify chiave pubblica, verifica la firma applicata al file da firmare usando lalgoritmo di digest scelto e la chiave pubblica nel file chiave pubblica. E` obbligatorio specificare il file dove e`
memorizzata la firma con lopzione -signature;
-signature firma, indica il file dove e` contenuta la firma da verificare. Usata con lopzione -verify.
Il significato degli altri parametri e` stato spiegato nellesercitazione 2.
openssl rand
Col seguente comando si possono generare nbyte casuali e salvarli nel file file name:
openssl rand -out file name nbyte
Altri comandi
Nel corso dellesercitazione dovrete scambiarvi dati da un computer allaltro col comando scp. Abilitate quindi
il server ssh:
/etc/init.d/ssh start
Generazione di chiavi
Scrivete la riga di comando per generare una coppia di chiavi RSA a 2048 bit, salvandola nel file rsa.key:
Confrontate i parametri con quelli generati da un vostro collega: va ne sono in comune? Perche?
Supponete di voler distribuire la vostra nuova chiave pubblica ai vostri colleghi: scrivete i comandi OpenSSL
per estrarre la chiave pubblica nel file rsa.pubkey e visualizzarne il contenuto:
1.2
Lo scopo di questo esercizio e` usare la chiave RSA generata in precedenza per cifrare e decifrare. Create un
breve messaggio di testo, ad esempio Un grandissimo segreto, e salvatelo in un file chiamato plain.
Come potete usare la vostra nuova chiave RSA per proteggere la confidenzialit`a di plain? Quale chiave dovete
usare? Scrivete il comando OpenSSL per cifrare plain e salvare il risultato nel file encRSA (suggerimento:
usate il comando pkeyutl).
Estraete infine i file rsaplain* e provate a cifrarli. Quali difficolt`a avete incontrato? Perche?
Nota: RSA permette in teoria di cifrare tutti i messaggi che, interpretati come numero binario, siano minori
del modulo. Tuttavia, lo standard PKCS#1 impone delle limitazioni aggiuntive dovute allimbustamento, in
particolare al padding. Se avete una chiave RSA lunga N byte, perche le operazioni di cifratura con OpenSSL
possano essere svolte correttamente, i dati in chiaro non devono essere pi`u lunghi di N 11 byte.
1.3
Il comando pkeyutl permette non solo di cifrare/decifrare blocchi di dati, ma anche di firmarli/verificarli. Qual
e` la differenza a livello di operazioni RSA?
Scrivete i comandi OpenSSL per firmare plain salvando la firma nel file sig, e successivamente per verificare
la firma stessa. Quali chiavi dovete usare per ognuna delle operazioni?
Chiavi di sessione
Supponete che Alessandro e Beatrice vogliano scambiare messaggi cifrati con AES, ma non abbiano una chiave
condivisa. Formate delle coppie: riuscite a progettare e mettere in pratica una soluzione basata sugli strumenti
visti finora che permetta ad Alessandro di inviare rsaplain2 cifrato a Beatrice, e a Beatrice di decifrarlo
correttamente?
Supponete che Alessandro proceda in questo modo:
esegue
echo chiave > aeskey
openssl enc -e -aes-128-cbc -in rsaplain2 -out msg.enc -kfile aeskey -iv 0
openssl pkeyutl -encrypt -in aeskey -inkey rsa.key -out aeskey.enc
invia msg.enc e aeskey.enc a Beatrice
invia rsa.key a Beatrice
Quali errori ha commesso linesperto Alessandro? (ce ne sono almeno due!)
Scrivete la sequenza di operazioni completa e corretta che Alessandro e Beatrice devono seguire:
Quale attacco pu`o compiere Caterina per intercettare il messaggio scambiato? Come potreste risolvere il
problema?
Quale altro algoritmo asimmetrico potrebbero usare Alessandro e Beatrice al posto di RSA per generare la
chiave AES? Quali modifiche bisogna apportare alla sequenza di operazioni?
2.2
Firma digitale
Supponete che Alessandro sia ora interessato a proteggere lintegrit`a dei messaggi inviati a Beatrice piuttosto
che la sua confidenzialit`a. Formate delle coppie: progettate e mettete in pratica una procedura che permetta ad
Alessandro di firmare rsaplain2 e a Beatrice di verificare la firma in ricezione.
Scrivete la sequenza di operazioni completa e corretta (usando dgst e pkeyutl):
Cosa succede se Caterina modifica uno dei diversi blocchi di dati inviati da Alessandro a Beatrice? Provate.
Notate che, oltre al comando pkeyutl, potete usare direttamente dgst per eseguire operazioni di firma digitale
e verifica. Ad esempio, potete costruire una firma digitale del file msg con:
openssl dgst -sha1 -sign chiaveRSA -out msg.sig msg
Scrivete di seguito la riga di comando per verificare la firma:
2.3
Autenticazione
Provate ad usare le primitive crittografiche RSA (comando pkeyutl) per realizzare un protocollo di autenticazione a sfida.
Lavorate in coppia (Alessandro e Beatrice) e procedete nel seguente modo:
Alessandro invia a Beatrice la propria chiave pubblica
Beatrice genera una stringa casuale nel file random e la cifra con la chiave pubblica di Alessandro,
creando il file challenge
Beatrice verifica che la risposta alla sfida sia corretta (potete usare il comando diff -b)
Assumendo che le chiavi siano autentiche, a quale rischio e` soggetto il protocollo che abbiamo realizzato?
Come si potrebbe ovviare? (almeno due soluzioni!)
2.4
Certificati digitali
Le procedure costruite e sperimentate negli esercizi 2.1, 2.2, 2.3 sono soggette a una comune vulnerabilit`a: un
attaccante in grado di intercettare e modificare lo scambio delle chiavi pubbliche pu`o comprometterne tutte le
propriet`a di sicurezza.
Lobiettivo e` sempre lo stesso: Alessandro e Beatrice vogliono scambiare messaggi in totale sicurezza. Supponete che abbiano un amico comune, Carlo. Carlo conosce le chiavi pubbliche di Alessandro e Beatrice, e loro
conoscono la chiave pubblica di Carlo.
7
Come pu`o Carlo aiutare gli amici? Suggerimento: Carlo dovr`a usare lautorit`a che gli deriva dalla conoscenza
(reciproca) delle chiavi.
Formate gruppi di tre (Alessandro, Beatrice, Carlo), scegliete uno dei protocolli modificati ed eseguitelo.
2.5
Prestazioni
Utilizzate il comando openssl speed per effettuare i seguenti confronti di prestazione tra:
RSA a 512, 1024, 2048 e 4096 bit.
Come diminuiscono le prestazioni?
Perche le due operazioni RSA si comportano in modo radicalmente diverso?
algoritmi di firma digitale: RSA a 1024 bit, DSA a 1024 bit, ECDSA a 160 bit (ecdsap160).
Che differenze notate?
algoritmi ad alta sicurezza: RSA a 2048 bit, DSA a 2048 bit, ECDSA a 256 bit (ecdsap256).
Nota: in realt`a la crittografia su curve ellittiche a 256 bit garantisce una sicurezza pari a RSA/DSA con
chiavi a 3072 bit, quindi il confronto e` leggermente a sfavore degli algoritmi che usano curve ellittiche.
Che differenze notate con i risultati del passo precedente?
crittografia asimmetrica, simmetrica e digest: RSA 2048 bit, DSA 2048 bit, AES a 128 bit, SHA-256.
Nota: come sopra, AES a 128 bit garantisce una sicurezza pari a RSA/DSA a 3072 bit.
Come confrontate i risultati ottenuti?
Quale rapporto di massima esiste tra i costi della crittografia simmetrica e asimmetrica?
3.1
Protezione di messaggio
Supponete che Alessandro sia in possesso di una chiave pubblica RSA di Beatrice e la voglia usare per inviarle,
via mail, un file proteggendone confidenzialit`a e integrit`a. Identificate i diversi blocchi di dati che Alessandro
deve creare, definite un formato per imbustare i diversi blocchi di dati in ununica mail, e create la busta.
Suggerimenti:
per il formato di imbustamento potete ispirarvi al formato PEM, lo stesso usato da OpenSSL ad esempio
per salvare le chiavi RSA. PEM usa dei separatori testuali e rappresenta i dati binari in forma testuale
attraverso la codifica base64. La codifica base64 pu`o essere eseguita con il comando enc di OpenSSL.
quali blocchi di dati devono essere cifrati?
quali blocchi di dati devono essere firmati?
ci sono differenze in termini di propriet`a di sicurezza tra (1) cifrare il messaggio e poi firmare il messaggio
cifrato, oppure (2) firmare il messaggio in chiaro e poi cifrare messaggio pi`u firma?
3.2
Protezione di canale
Sempre supponendo che Alessandro sia in possesso di una chiave pubblica RSA di Beatrice, progettate ora
un protocollo che permetta a Alessandro e Beatrice di scambiare messaggi attraverso un canale che garantisca
confidenzialit`a e integrit`a.
Alessandro e Beatrice hanno bisogno di confidenzialit`a quando si scambiano i dati (cio`e il canale deve essere
confidenziale):
quanti dati dovranno scambiarsi?
i metodi visti (a lezione, in laboratorio), sono tutti compatibili con le vostre ipotesi sulla quantit`a dei dati?
Tra le applicazioni della crittografia, scrivete quella che vi sembra pi`u appropriata:
Alessandro e Beatrice hanno bisogno della garanzia che i dati scambiati siano integri:
quali metodi hanno a disposizione?
si pu`o fare di meglio? cio`e, si riesce ad aggiungere anche lautenticazione dei dati?
Scrivete il metodo che pensate sia pi`u opportuno:
A questo punto mettere insieme le risposte e provate a progettare un metodo per rendere sicuro il canale.
10