CRIPTOGRAFIA E FIRMA DIGITALE

con

GnuPG





La presente conferenza l'ho tenuta per la prima volta a San Benedetto del Tronto (AP) in occasione del Linux Beach 2006.

Oltre che come documentazione per gli interessati, spero vivamente che possa far aumentare la consapevolezza della non sicurezza dello strumento “posta elettronica” e contribuisca a far adottare agli utenti gli adeguati strumenti di implementazione.





Iniziamo con questo concetto fondamentale: “La posta elettronica non è uno strumento sicuro”.

Infatti, quasi tutte le e-mail che viaggiano in rete sono in chiaro, senza alcuna forma di codifica. Come ben saprete, un messaggio di posta elettronica, da quando parte dal PC del suo mittente a quando arriva al PC del suo destinatario, attraversa diverse macchine in rete, ognuna delle quali si occupa di “instradarlo” nella giusta direzione. Chiunque si trovi ai comandi di una qualsiasi di queste macchine può quindi visualizzare (sniffare) questi messaggi, con grande rischio per la privacy del mittente e del destinatario.

Ancora: viaggiano in chiaro anche UserID e Password nella fase di autenticazione ai server POP3 (posta in entrata) e SMTP (posta in uscita). Per questo motivo è sempre buona norma utilizzare dei server che forniscano il servizio di autenticazione tramite criptazione in TSL o in SSL, onde evitare che qualcuno prenda il controllo della propria casella e-mail.

Altro problema: il mittente di un'e-mail non è mai garantito. Con pochissimi accorgimenti si può far credere ai più sprovveduti di essere chiunque.





Ecco qui un esempio con Mozilla Thunderbird. Nella configurazione degli account di posta chiunque può impostare un falso mittente. Posso far credere a chiunque di essere un'autorità, una banca o qualsiasi altra cosa. Semplicemente così posso “imbrogliare” tranquillamente il 90%-95% degli utenti. In pochi saranno in grado di accorgersi delle anomalie che saranno ancora presenti comunque negli header del messaggio di posta. Ulteriori trucchetti, che non illustro qui, possono far scomparire anche queste restanti tracce... Et voilà... Il gioco è fatto.





Iniziamo con il criptare la posta. In questo modo potrà leggere correttamente il nostro messaggio solo chi vorremo noi.

Il mondo da sempre è pieno di sistemi di codifica. I più semplici: anagrammare le parole, sostituire i caratteri e molti altri metodi, più o meno sofisticati.

Facciamo un esempio:

la nostra e-mail viaggerà in rete sotto forma di byte, sotto forma di valori X compresi tra 0 e 255. Sostituiamo a questi valori X i valori X+2 per X compreso tra 0 e 253. Sostituiamo poi a 254 e 255 rispettivamente 0 e 1. Abbiamo appena inventato una chiave di codifica. Solo chi possiederà questa chiave (perché l'ha avuta da me o perché l'ha scoperta) sarà in grado di capire il contenuto del messaggio, gli altri no.

Questo è un semplicissimo esempio di codifica. Molti bambini, anche nelle più giovani età, si divertono ad inventare sistemi così semplici per trasmettersi i propri segreti o semplicemente per proteggerli. Personalmente trovo i sistemi di codifica anche una cosa molto divertente ed appassionante.





Quello illustrato sopra è un semplice esempio di codifica a chiave simmetrica: mittente e destinatario useranno la stessa chiave, il primo per codificare ed il secondo per decodificare.

Non è un sistema utile per quello che sarà il nostro scopo, poiché non sarà un sistema estendibile a terzi. Se, infatti, un utente A ed un utente B utilizzano una chiave di codifica per le proprie comunicazioni, questa non potrà essere utilizzata da A con l'utente C. Infatti, decaderebbe la privacy tra A e B.

Se l'utente A, per superare questo problema, inventasse ed utilizzasse una chiave per ogni altro utente, avrebbe da gestire un numero enorme di sistemi di codifica e ben presto il sistema diventerebbe difficilmente gestibile.





Soluzione al problema: il certificato a chiave asimmetrica.

Verrà adottato un sistema che utilizzerà un certificato composto da due chiavi distinte, una privata ed una pubblica.





La chiave privata dovrà rimanere esclusivamente nelle mani del proprietario del certificato. Andrà conservata con assoluta attenzione. Verrà utilizzata dall'utente possessore per decriptare i messaggi che saranno indirizzati a lui ed in più sarà utilizzata per apporre al messaggio una firma digitale che ne garantirà la reale identità del mittente.

La chiave pubblica potrà, invece, essere distribuita al mondo intero, senza il rischio di incorrere in alcun pericolo. Essa verrà utilizzata per criptare i messaggi indirizzati al proprietario del relativo certificato; solo il possessore della relativa chiave privata potrà decriptare il messaggio. Chiunque altro vedrà una serie di byte/caratteri senza alcun significato. Inoltre, verrà utilizzata per verificare la firma digitale che è stata apposta con la chiave privata.

La chiave pubblica potrà essere distribuita senza controllo a chiunque. Il fatto che cada in mani estranee non costituirà alcun pericolo. La massima attenzione dovrà essere rivolta esclusivamente alla chiave privata, che dovrà rimanere rigorosamente nelle mani del leggittimo proprietario. Se quest'ultima non cadrà in mani estranee, il sistema sarà sicuro al 100% (anche se in molti dipartimenti di matematica stanno continuando a verificarne la totale sicurezza).

Se i concetti esposti fin qui sono ben chiari, il resto ora sarà tutto in discesa.





Proviamo a capire come possa funzionare un certificato a chiave asimmetrica. L'esempio che segue non è applicabile per quelle che saranno le nostre finalità, però dà un'idea chiara di come in matematica esistano delle funzioni non biunivoche adatte allo scopo.

Immaginiamo di dover trasmettere questi dati: 4, -2, -1 e 5. Ora la chiave pubblica, con cui cripterò la sequenza dei quattro numeri, consisterà nell'elevare al quadrato ognuno di essi. Avremo così: 16, 4, 1 e 25. Un altro utente che avrà in mano soltanto questa chiave pubblica sarà in grado di decriptare i dati? La risposta è no. Infatti, partiamo dal primo dato: 16. Sappiamo, dalla chiave pubblica, che è il risultato di un numero che è stato elevato al quadrato. Operazione inversa: la radice quadrata; ma la radice quadrata di 16 non è univoca. Il risultato è sì 4, ma è anche -4. Come facciamo a sapere quale dei due prendere? Con la sola chiave pubblica non possiamo.





Come detto sopra, l'esempio non è utilizzabile: il procedimento di criptazione è troppo semplice per essere efficiente; però rende molto bene l'idea di come funzioni matematiche non invertibili maggiormente complicate, possano essere utilizzate per il nostro fine.

Trovando delle funzioni molto più adatte, posso raggiungere il mio scopo: creare un certificato a doppia chiave con cui poter criptare con la pubblica e poter decriptare solo ed esclusivamente con la privata.

A questo punto distribuirò la chiave pubblica e chiunque potrà criptarci i messaggi a me indirizzati. Solo ed esclusivamente io, possessore della relativa chiave privata, potrò decifrare le e-mail.





Ora vediamo un altro possibile utilizzo di un certificato a chiave asimmetrica. Immaginiamo di poter effettuare un'operazione tramite la chiave privata su di un messaggio scritto da me. Questa operazione, tenendo conto del mittente e di ogni singolo carattere che compone il messaggio, darà un risultato univoco che potrà essere ottenuto solo ed esclusivamente se la suddetta operazione sia stata effettuata con la mia chiave privata. Il risultato sarà una sorta di checksum, poiché tiene conto di tutti i singoli byte che compongono la mail. Se il mittente fosse un altro o se un solo carattere fosse differente, la checksum sarebbe diversa.





Chi è in possesso della chiave pubblica non potrà effettuare la stessa operazione ottenendo lo stesso risultato, però potrà effettuare una verifica sul fatto che quel risultato può averlo prodotto solo ed esclusivamente la chiave privata ad essa collegata.

Ho appena trovato il sistema per firmare digitalmente il mio messaggio: esso è stato inviato sicuramente dal proprietario della chiave privata; in più, tramite la checksum, posso essere anche sicuro che durante il suo tragitto la mail non ha subito alterazioni di alcun genere; nemmeno un carattere è stato modificato.

Ora c'è una piccola attenzione da mantenere. Io dovrò distribuire la mia chiave pubblica. Per questo le strade sono tre: incontro di persona “face to face”, anche attraverso i key-party, dei veri e propri incontri organizzati per scambiarsi le chiavi pubbliche; la posso mettere sul mio sito internet personale; oppure ci sono a disposizione dei key-server dove ognuno può inserire la propria chiave pubblica e dove gli utenti possono fare delle ricerche, come se fossero degli elenchi on-line. La cosa da verificare in tutti i casi è che la chiave pubblica sia realmente della persona che si pensa. Se sono sicuro che la chiave sia di tizio, ma in realtà è di caio, il sistema dell'autenticazione è fortemente compromesso.

L'autenticazione sarà sempre meglio farla di persona. Anche un sito web può dare garanzie; ad esempio, chi mi conosce, sa benissimo che maury.it è il mio sito e quindi segue che la chiave che si trova su http://www.maury.it/gpg posso averla inserita lì solo io, quindi è mia; però in tutti gli altri casi, l'autenticazione faccia a faccia è la garanzia più sicura.

Io personalmente porto sempre in tasca un foglietto con su scritto il codice del mio certificato GnuPG: 0x51F1316C. In questa maniera, chiunque mi incontri, può chiedermi il codice e verificare così che quella che ha trovato sul mio sito web, su un key-server o sulle mie e-mail firmate (tante volte avessi allegato la chiave pubblica) sia veramente mia; una volta che l'autenticazione la faccio io di persona, può stare sicurissimo che quel certificato è realmente mio.





Vediamo ora come procurarci un certificato digitale.

Alcune aziende rilasciano dei certificati secondo lo standard S/MIME. Questo standard è supportato nativamente dalla maggior parte dei client e-mail, quindi non ci sarà bisogno di installare plugin e/o estensioni aggiuntivi.

La prima azienda che segnalo e Thawte. È sudafricana e rilascia gratuitamente certificati ad uso personale. Thawte, con il classico sistema del “Rispondi a questa e-mail...” può verificare l'autenticità del vostro indirizzo di posta elettronica. Per l'identità anagrafica, per poter inserire cioè nel certificato il vostro nome ed il vostro cognome, utilizza il sistema dei notai: il Web Of Trust. Gente autenticata e reputata affidabile dalla ditta (i notai) viene delegata a dare un punteggio da 10 a 35, in base alla propria anzianità di servizio, dopo aver verificato personalmente l'identità di un nuovo utente. Un utente, raggiungendo 50 punti, viene dichiarato autenticato da Thawte e quindi avrà nome e cognome inseriti nel certificato. Al raggiungimento di 100 punti si diviene notai e si può autenticare quindi altri utenti. Naturalmente il sistema dell'identità anagrafica è soggetta alla serietà dei notai; per la veridicità dell'indirizzo e-mail bisogna, invece, fidarsi di Thawte; sarà questa azienda a fare da garante. I notai Thawte sono ormai in tutto il mondo; alcuni autenticano in maniera gratuita, altri chiedono delle piccole cifre; sul sito si possono trovare i notai più vicini alla propria zona. Se qualcuno avesse bisogno, io sono notaio e, conoscendo altri notai, posso far avere l'autenticazione praticamente al volo, in maniera totalmente gratuita, dato che mi piace fare divulgazione di sicurezza informatica per pura passione.

Altri certificati digitali vengono rilasciati anche da ditte italiane tipo GlobalTrust, Poste Italiane e diversi istituti bancari. GlobalTrust rilascia anch'essa certificati gratuiti per uso personale. Le altre, invece, come servizio a pagamento: agli sportelli avverrà la procedura di autenticazione e poi verrà rilasciato il software contenente il certificato in appositi CD-ROM.

Con questo sistema la firma digitale è valorizzata da delle authority riconosciute. Thawte è riconosciuta a livello mondiale da diversi anni. Le altre, invece, all'estero potrebbero avere meno fiducia: non so quanta credibilità possa avere, ad esempio, in Canada una mail certificata da un'authority come Poste Italiane.





Questo sistema delle authority potrebbe non piacermi: voglio essere io l'unico garante della mia identità. Quindi ho bisogno di uno strumento per crearmi da me un certificato digitale a chiave asimmetrica. Ecco GnuPG.





GnuPG è multipiattaforma ed open-source. Si utilizza nativamente da linea di comando come una shell o il prompt di MS-DOS.

Non mancano tuttavia le intefaccine grafiche:

Enigmail è l'estensione per i programmi Mozilla. Contiene un tool grafico per la gestione delle chiavi.

Gnu Privacy Assistant (o GPA), Seahorse e Geheimnis sono diverse interfaccine open-source.

WinPT è il pacchetto per Windows; contiene, oltre GnuPG precompilato, anche un'interfaccia grafica ed il plugin per Outlook Express. Un'altra ottima interfaccia grafica per Windows è GPGshell.





Vediamo l'utilizzo principale di GnuPG da linea di comando.





Una volta che il programma è stato installato, la prima cosa da fare è creare un certificato digitale. Il comando sarà:



gpg --gen-key



Verranno richieste alcune informazioni personali: nome e cognome, e-mail ed eventuali commenti. Successivamente sarà possibile inserire nel certificato altri indirizzi e-mail; in questa fase limitiamoci a dare solo il principale.

Verrà richiesta la lunghezza della chiave desiderata; per avere la miglior sicurezza è sempre bene chiedere la lunghezza maggiore possibile.





Verrà poi chiesta una passphrase, una specie di password, che verrà richiesta ad ogni utilizzo della chiave privata. Questa è un'ulteriore sicurezza in più, tante volte la nostra chiave privata cada in mani di terzi.

Riguardo alla scelta della passphrase è sempre meglio rispettare le solite regolette: evitiamo le parole di senso compiuto, mischiare caratteri maiuscoli, caratteri minuscoli e cifre e dare sempre una passphrase di almeno 8 caratteri.





Possiamo poi esportare od importare le chiavi pubbliche di altri o addirittura le nostre chiavi; questo è utile ad esempio se si vuole utilizzare i certificati su più PC o su più sistemi operativi.



gpg --export -a nome_chiave-o-stringa_contenuta



Dando l'output in un file con “> nome_file.asc“ verrà scritta la chiave su di un file. L'opzione -a permette l'esportazione in ascii a 7 bit, invece che in un file binario. GnuPG riconoscerà la chiave richiesta anche da una semplice stringa contenuta nell'indirizzo e-mail o nel nome e cognome.

Le chiavi esportate su di un file potranno poi essere importate con



gpg --import nome_file





La revoca di una chiave è importante se la chiave privata cadesse in mani altrui e quindi la sicurezza ad essa collegata fosse compromessa.

Conviene quindi creare un certificato di revoca da subito, conservandolo in un luogo sicuro in caso di bisogno.



gpg --gen-revoke



anche qui si potrà riindirizzare il certificato ad un file. Se la chiave privata non sarà più utilizzabile (perché ne è compromessa la sicurezza o per un qualsiasi altro motivo), il certificato di revoca sarà la garanzia della validità decaduta. Ricordarsi, in caso di revoca di una chiave, di trasmettere il certificato di revoca ai vari keyserver dove la chiave era stata registrata.

Poiché per creare un certificato di revoca è necessaria la chiave privata e poiché questa potrebbe andare perduta, come detto sopra è buona norma creare la revoca da subito.





Le chiavi importate, compresa la propria, possono essere amministrate per aggiungere nuovi indirizzi e-mail, rimuovere indirizzi e-mail e molte altre modifiche e/o correzioni.



gpg --edit-key nome_key-o-stringa_contenuta



Comparirà un prompt per i comandi; con help si avrà l'elenco di tutti i comandi disponibili per amministrare le chiavi.





Quando importeremo una chiave pubblica di qualcuno, questa sarà inserita nel nostro archivio, una sorta di portachiavi virtuale. È qui che il client di posta andrà a verificare il messaggio firmato digitalmente. Se la chiave pubblica archiviata nel nostro portachiavi verificherà il messaggio, il client dirà che la firma digitale è corretta.

Bisogna però far sapere al client che la chiave pubblica appartiene realmente alla persona che ha mandato l'e-mail. Dopo esserci assicurati di persona ed in piena sicurezza di chi sia il proprietario di quella chiave, potremo firmare la sua chiave pubblica come “verificata”. Firmando la chiave diremo a GnuPG che quella chiave pubblica è affidabile.





Ecco come Mozilla Thunderbird segnala le e-mail firmate digitalmente. Nel primo caso l'e-mail è dichiarata correttamente firmata, ma non ci sono garanzie su chi sia il reale proprietario del certificato utilizzato. Nel secondo caso, invece, la firma è verificata da una chiave pubblica firmata.





Un ulteriore funzione di GnuPG dà la possibilità di apporre una firma digitale ad un file (un documento, una foto, ecc.).



gpg --sign -b -a nome_file



Questo comando genererà una firma digitale del file con la chiave privata. Si otterrà un file con ulteriore estensione .asc (.sig senza l'opzione -a che esporta la firma in file ASCII).

Per verificare la firma, avendo a disposizione la chiave pubblica relativa alla privata che l'ha firmato:



gpg --verify nome_file.asc (.sig)





Come ultimo utilizzo di GnuPG segnalo brevemente la criptazione di file.



gpg -e nome_file



cripterà il file con la chiave pubblica che verrà specificata alla domanda successiva al lancio del comando. Si otterrà un file con ulteriore estensione .gpg assolutamente non interpretabile se non dopo la decriptazione.

Per decriptare il file, avendo a disposizione la chiave privata relativa alla pubblica che l'ha criptato:



gpg -d nome_file.gpg > nome_file



Abbiamo così a disposizione uno strumento per criptare ad esempio dei file delicati, tipo quelli contenenti i nostri codici o le nostre password.





Come bibliografia segnalo questi due siti internet:



http://www.gnupg.org/(it)/howtos/it/GPGMiniHowto.html

HowTo ufficiale in italiano di GnuPG



http://thawte.ascia.net

Documentazione scritta da due notai Thawte di Roma. Molto chiara per il discorso del certificato a chiavi pubblica/privata.



Ed in più, per approfondire, le pagine man di gpg.





Spero che questo documento possa servire a sensibilizzare ed a far diffondere l'utilizzo di S/MIME e/o GnuPG. Non è bene che l'umanità continui ad affidarsi a sistemi bacati dal punto di vista della sicurezza, ignorandone totalmente i rischi.

Io personalmente firmo digitalmente tutte le mie e-mail. Utilizzando Thawte con chi non utilizza GnuPG e, invece, quest'ultimo con chi so che lo utilizza. Avendo a disposizione anche la chiave pubblica del destinatario, cripto anche i messaggi.



Schermata del mio Thunderbird; si notino i due tastini per criptare/firmare con GnuPG o S/MIME



Quando questi sistemi saranno maggiormente diffusi, viaggeranno in rete messaggi di posta elettronica in tutta sicurezza. Per ora e fino ad allora meglio rendere noto a tutti che non è così.



Ringraziamenti >>>



Creative Commons License

Statistiche di accesso




 Use OpenOffice.org