Sei sulla pagina 1di 10

Crittografia con OpenSSL crittografia asimmetrica

Laboratorio del corso Sicurezza dei sistemi informatici (03GSD)


Politecnico di Torino AA 2014/15
Prof. Antonio Lioy
preparata da:
Cataldo Basile (cataldo.basile@polito.it)
Andrea Atzeni (shocked@polito.it)
v. 2.55 (10/11/2014)

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

1 Operazioni crittografiche asimmetriche


1.1

Generazione di chiavi

Scrivete la riga di comando per generare una coppia di chiavi RSA a 2048 bit, salvandola nel file rsa.key:

Ora analizzate il contenuto di rsa.key lanciando:


openssl rsa -in rsa.key -text
Riuscite a riconoscere la natura e lo scopo dei parametri modulus, publicExponent, privateExponent, e
prime*?

Quali di questi costituiscono la chiave privata RSA e quali la chiave pubblica?

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

Operazioni di cifratura e decifratura

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

Cosa fa il seguente comando? Quale chiave e` stata usata?


openssl pkeyutl -encrypt -in plain -inkey rsa.key -out encRSA

Scrivete di seguito il comando per decifrare il messaggio precedentemente cifrato:

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

Operazioni di firma e verifica

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?

2 Applicazioni della crittografia asimmetrica


2.1

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:

Quali differenze notate nelluso dei comandi pkeyutl e dgst?

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 invia ad Alessandro il file challenge


Alessandro decifra la sfida nel file response ed invia la risposta a Beatrice

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.

Supponete che Carlo proceda come segue


modifica il file contenente la chiave pubblica di Alessandro:
echo "Questa e la chiave pubblica di Alessandro, parola di Carlo" >> ale.pubkey
firma il file modificato (usate openssl dgst)
invia ad Alessandro il file modificato e la firma generata
e segua poi la stessa procedura con Beatrice.
Riuscite a riadattare i protocolli descritti negli esercizi 2.1, 2.2 e 2.3 in modo da sfruttare i file creati da Carlo?
Cosa avete modificato?

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 Mettendo tutto assieme


Considerando ci`o che avete appreso sulla crittografia simmetrica e asimmetrica, affrontate i seguenti progetti.

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:

Data la soluzione scelta in precedenza:


quale problema rimane aperto?
quale informazione in possesso di Alessandro pu`o essere usata per risolverlo?

Scrivete di seguito il metodo che pensate sia pi`u opportuno:

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