Pgp
(Last update 13/11/2004 23:10)

Il materiale contenuto in questa sezione è preso in gran parte dalla rete. In particolare, è stata fatta una selezione della guida ufficiale di GnuPG.

"Si puo' ben dubitare che l'ingegno umano sia mai capace di costruire un enigma di questo tipo [un crittogramma] tale che l'ingegno umano stesso non possa, applicandovisi appropriamente, risolverlo."

Edgar Allan Poe, "Lo scarabeo d'oro", 1843


"PGP permette alla gente comune di avere la propria privacy a portata di mano. C’è un bisogno sociale crescente di questo. Ecco perché l’ho creato."

Philip Zimmermann, "Perche' hai bisogno di PGP?", 1994



Mi piace l'idea di iniziare la nostra discussione sul PGP da queste due citazioni: riflettere bene su di esse ci aiuterà a comprendere bene gli scopi, le potenzialità e i limiti delle tecniche e dei software di crittografia e in particolare del PGP.

L'esigenza di sicurezza è sempre esistita ma con l'avvento e la popolarità crescente di Internet questo bisogno si è esteso ad un gruppo di persone molto più ampio. La trasmissione di un'email attraverso Internet è, potenzialmente, molto meno sicura di una lettera spedita attraverso l'ufficio postale o il fax. Il contenuto dei vostri testi che transitano normalmente in chiaro da un mittente ad un destinatario possono essere da chiunque letti o modificati a piacere.
Non dovete essere paranoici, però, bisogna riconoscere il rischio là dove esiste realmente. Questo discorso non è così importante per un messaggio personale inviato a vostro fratello o alla vostra fidanzata ma quando si tratta di scambiare posta confidenziale come, per esempio, il contatto con i clienti, potete capire le implicazioni differenti in caso che qualcuno intercetti il messaggio.
La crittografia tutela i vostri diritti alla segretezza.

Esistono moltissimi algoritmi di crittografia, sono nati praticamente tutti per scopi militari e si sono enormemente evoluti nel corso del tempo: come faceva notare E.A.Poe, è difficile credere che l'ingegno umano possa elaborare un sistema crittografico che esso stesso non possa risolvere...
Questo è il motivo per cui lo studio della crittografia ha cambiato rotta, concentrandosi sull'elaborazione di algoritmi non indecifrabili ma decifrabili in tempi non utili.

PGP nasce da Philip Zimmermann per le persone comuni e fa uso di di alcuni dei più noti algoritmi di crittografia eistenti. Noi useremo GnuPG (o GPG) che è un sostituto completo e libero di PGP. Poiché non usa l'algoritmo brevettato IDEA, può essere usato senza restrizioni; inoltre, GnuPG è conforme alla RFC2440 (OpenPGP)


Caratteristiche

Di per sé stesso GnuPG è uno strumento a linea di comando senza nessun aspetto grafico. È il vero motore di cifratura che può essere usato direttamente dalla linea di comando, da script di shell o da altri programmi; per questo può essere considerato come un backend per altre applicazioni.

In ogni caso, anche se usato dalla linea di comando, fornisce tutte le funzionalità necessarie, compreso un sistema di menù interattivo. I comandi forniti da questo strumento saranno sempre di piú di quelli forniti da un qualsiasi suo frontend.


Concetti da conoscere

GnuPG fa uso di diversi concetti di crittografia come algoritmi simmetrici, algoritmi a chiave pubblica, e hashing a senso unico. È possibile utilizzare le funzioni di base di GnuPG senza comprendere appieno tali concetti, ma, se si vuole usarlo con cognizione di causa, una loro comprensione è necessaria. Questo capitolo introduce i concetti di base della crittografia utilizzati in GnuPG. Si possono trovare altri libri che trattano questi argomenti più dettagliatamente. Un buon testo per approfondire ulteriormente gli studi è ``Applied Cryptography'' di Bruce Schneier.

Algoritmi simmetrici

Un algoritmo simmetrico è un algoritmo che utilizza la stessa chiave sia per criptare che per decriptare. Due parti che comunicano sfruttando un algoritmo simmetrico devono innanzi tutto mettersi d'accordo sulla chiave. Una volta d'accordo, il mittente cifra un messaggio utilizzando la chiave, lo spedisce al destinatario e questi decripta il messaggio usando la stessa chiave. Per esempio, il tedesco Enigma è un algoritmo simmetrico per il quale venivano distribuite delle chiavi giornaliere sotto forma di libri di codici. Ogni giorno un operatore radio, fosse esso un trasmittente o un ricevente, consultava la propria copia del libro codici per trovare la chiave di quel giorno. Il traffico radio di quel giorno veniva quindi criptato e decriptato utilizzando la quella chiave. Esempi moderni di algoritmi simmetrici includono 3DES, Blowfish e IDEA.

Un buon algoritmo di cifratura racchiude completamente la sicurezza nella chiave senza lasciare nulla nell'algoritmo. In altre parole, non dovrebbe essere di alcun aiuto per un malintenzionato conoscere il tipo di algoritmo utilizzato. Solo se ottenesse la chiave la conoscenza dell'algoritmo sarebbe necessaria. L'algoritmo usato in GnuPG possiede tale proprietà.

Poiché tutta la sicurezza è riposta nella chiave, è importante che sia veramente difficile indovinare la chiave stessa. Detto altrimenti, l'insieme di chiavi possibili, cioè lo spazio delle chiavi, deve essere grande. A Los Alamos, Tichard Feynman era famoso per la sua abilità nell'aprire casseforti. Per incoraggiare l'alone di mistero che lo circondava egli portava con sé perfino un serie di attrezzi, compreso un vecchio stetoscopio. In realtà egli usava una varietà di trucchi per ridurre il numero di combinazione che doveva provare e poi semplicemente tirava ad indovinare finché trovava la giusta combinazione. In altre parole, egli riduceva la dimensione dello spazio di chiavi.

La Gran Bretagna, durante la Seconda Guerra Mondiale, usò delle macchine per cercare di indovinare le chiavi usate dagli avversari. Il tedesco Enigma, infatti, possedeva uno spazio di chiavi veramente ampio, ma la Gran Bretagna costruì dei motori di calcolo specializzati, i Bombes, per provare meccanicamente le chiavi finché la chiave del giorno non veniva trovata. Questo significa che a volte riuscivano a trovare la chiave di quel giorno in capo a poche ore dal momento in cui una nuova chiave veniva usata, ma significa anche che alcuni volte non riuscissero affatto a trovare la chiave giusta. I Bombes non erano computer multi-funzione ma erano comunque i precursori dei nostri moderni elaboratori.

Oggigiorno i computer possono indovinare una chiave molto rapidamente e questo è il motivo per cui la dimensione della chiave è un requisito importante per i moderni sistemi di crittografia. L'algoritmo DES usa una chiave da 56 bit. Ciò significa che ci sono 256 chiavi possibili. 256 sono 72,057,594,037,927,936 chiavi. Un sacco di chiavi, ma un computer non specializzato può controllarle tutte in una manciata di giorni. Un computer specializzato in poche ore. D'altro canto, algoritmi sviluppati più recentemente, come il 3DES, il Blowfish e IDEA, usano tutti chiavi da 128 bit. Ciò implica che ci sono 2128 possibili chiavi. Queste sono molte, molte di più e, anche se tutti i computer della terra cooperassero, sarebbe ancora necessario più tempo di quello rappresentato dall'età dell'universo per trovare la chiave corretta.


Algoritmi a chiave pubblica

Il problema principale con gli algoritmi simmetrici non risiede nella loro sicurezza, ma nello scambio della chiave. Una volta che il mittente ed il destinatario si sono scambiati la chiave, quella chiave può essere usata per comunicare in sicurezza. Ma quale canale sicuro è stato utilizzato per comunicare la chiave stessa? In particolare sarebbe probabilmente più semplice per un malintenzionato cercare di intercettare la chiave piuttosto che provare tutte le chiavi possibili dello spazio di chiavi. Un altro problema consiste nel numero di chiavi necessarie. Se ci sono n persone che vogliono comunicare privatamente fra loro, allora servono n(n-1)/2 chiavi per ogni coppia di persone. Ciò può andar bene per una ristretta cerchia di persone, ma il numero diventa rapidamente enorme per un gruppo largo.

Gli algoritmi a chiave pubblica furono inventati per aggirare completamente il problema dello scambio di chiavi. Un algoritmo a chiave pubblica utilizza una coppia di chiavi per spedire messaggi, entrambi appartenenti alla persona che riceve il messaggio. Una chiave è detta chiave pubblica e può essere data a chiunque. L'altra chiave è detta chiave privata e viene mantenuta segreta dal suo possessore. Il mittente cifra un messaggio usando la chiave pubblica e, una volta criptato, il messaggio può essere decifrato solo con la chiave privata.

Questo protocollo risolve il problema dello scambio di chiavi intrinseco agli algoritmi simmetrici. Non c'è bisogno che mittente e destinatario si mettano d'accordo su una chiave comune. Tutto ciò che serve è che, qualche tempo prima della effettiva comunicazione segreta, il mittente entri in possesso di una copia della chiave pubblica del destinatario. Inoltre una sola chiave pubblica può essere utilizzata da chiunque desideri comunicare con il destinatario. Così solo n coppie di chiavi sono sufficienti a permettere ad n persone di comunicare segretamente una con l'altra.

Gli algoritmi a chiave pubblica sono basati sulle funzioni difficilmente invertibili con trapdoor o, più brevemente, funzioni trapdoor. Una funzione difficilmente invertibile è una funzione facile da computare, ma la cui inversa è di difficile calcolo. Per esempio, è facile moltiplicare assieme due numeri primi per ottenere un numero composto, ma è difficile fattorizzare un numero composto nelle sue componenti prime. Una funzione trapdoor è simile, ma possiede una scappatoia: se si conosce una parte dell'informazione, diventa facile calcolarne l'inversa. Per esempio, se si considera un numero composto da due fattori primi, allora, conoscendo uno dei due fattori, risulta facile calcolare l'altro. Dato un algoritmo a chiave pubblica basato sulla fattorizzazione in numeri primi, la chiave pubblica contiene un numero composto formato da due fattori primi elevati e l'algoritmo di cifratura usa questo numero composto per criptare il messaggio. L'algoritmo per decriptare il messaggio richiede la conoscenza dei due fattori primi. Così, possedendo la chiave privata che contiene uno dei due fattori, è facile decifrare il messaggio, mentre è estremamente difficile se non si conosce la chiave privata.

Così come accade per gli algoritmi simmetrici, anche per gli algoritmi a chiave pubblica tutta la sicurezza risiede nella chiave. Perciò la dimensione della chiave è una misura della sicurezza del sistema, anche se non è possibile paragonare la dimensione della chiave di un algoritmo simmetrico con quella di di un algoritmo a chiave pubblica per misurare il loro grado di sicurezza. In un attacco a forza bruta contro un algoritmo simmetrico con una chiave da 80 bit, un malintenzionato deve contare al massimo 280 chiavi per trovare quella giusta. In un attacco a forza bruta contro un algoritmo a chiave pubblica con una dimensione della chiave pari a 512 bit, lo stesso malintenzionato deve fattorizzare un numero composto codificato in 512 bit (fino a 155 cifre decimali). Il carico di lavoro per il malintenzionato è fondamentalmente differente a seconda dell'algoritmo che viene attaccato. Mentre 128 bit sono sufficienti per un algoritmo simmetrico, data la tecnologia odierna di fattorizzazione, sono raccomandate chiavi da 1024 bit per la maggior parte degli scopi.


Algoritmi ibridi

Gli algoritmi a chiave pubblica non sono una panacea. Molti algoritmi simmetrici sono più forti dal punto di vista della sicurezza; le operazioni di criptazione e decriptazione a chiave pubblica sono più costose delle corrispondenti operazioni dei sistemi simmetrici. Ciò nonostante, gli algoritmi a chiave pubblica rappresentano uno strumento efficace per distribuire le chiavi degli algoritmi simmetrici e per questo vengono usati in sistemi di crittografia ibridi.

Un algoritmo ibrido utilizza sia un sistema simmetrico che uno a chiave pubblica. In particolare esso funziona utilizzando un algoritmo a chiave pubblica per condividere una chiave per il sistema simmetrico. Il messaggio effettivo è quindi criptato usando tale chiave e successivamente spedito al destinatario. Poiché il metodo di condivisione della chiave è sicuro, la chiave simmetrica utilizzata è differente per ogni messaggio spedito. Per questo viene detta a volte chiave di sessione.

Sia PGP che GnuPG usano algoritmi ibridi. La chiave di sessione, criptata utilizzando l'algoritmo a chiave pubblica, e il messaggio da spedire, cifrato con l'algoritmo simmetrico, sono automaticamente combinati in un solo pacchetto. Il destinatario usa la propria chiave privata per decifrare la chiave di sessione che viene poi usata per decifrare il messaggio.

Un algoritmo ibrido non è mai più forte del più debole algoritmo utilizzato, sia esso quello a chiave pubblica o quello simmetrico. In PGP e GnuPG l'algoritmo a chiave pubblica è probabilmente il più debole dei due. Fortunatamente, però, se un malintenzionato dovesse decifrare una chiave di sessione, egli sarebbe in grado di leggere solo un messaggio, quello criptato con quella chiave di sessione. Il malintenzionato dovrebbe ricominciare di nuovo e decifrare un'altra chiave di sessione per poter leggere un altro messaggio.


Firme digitali

Una funzione hash è una funzione da molti a uno che mappa i suoi valori di ingresso in un valore appartenente ad un insieme finito. Tipicamente questo insieme è un intervallo di numeri naturali. Una semplice funzione hash è f(x) = 0 per tutti gli interi x. Una funzione hash più interessante è f(x) = x mod 37, che mappa tutti gli x al resto della divisione tra x e 37.

La firma digitale di un documento è il risultato dell'applicazione di una funzione hash al documento stesso. Per essere utile, però, la funzione hash deve soddisfare a due importanti proprietà. Primo, dev'essere difficile trovare due documenti che possiedono la stessa valore di hash; secondo, dato un valore di hash deve essere difficile recuperare il documento che ha prodotto quel valore.

Alcuni algoritmi a chiave pubblica[1] possono venire usati per firmare documenti. Colui che firma cripta il documento con la propria chiave privata. Chiunque voglia controllare la firma e vedere il documento usa semplicemente la chiave pubblica del firmatario per decifrare il documento. Questo algoritmo effettivamente soddisfa alle due proprietà richieste da una buona funzione hash, ma, in pratica, è troppo lento per risultare utilizzabile.

Un'alternativa consiste nel'utilizzare funzioni di hash pensate specificamente per soddisfare a queste due importanti proprietà. SHA e MD5 sono due esempi di tali algoritmi. Utilizzando un algoritmo di questi, un documento viene firmato applicando la funzione di hash ed il valore restituito rappresenta la firma. Un'altra persona può controllare la firma applicando la stessa funzione di hash alla propria copia del documento e confrontando il valore di hash ottenuto con quello del documento originale. Se coincidono, può essere praticamente certo che i documenti sono identici.

Ovviamente ora il problema consiste nell'usare una funzione di hash per firme digitali senza permettere ad un malintenzionato di interferire con il controllo della firma. Se documento e firma sono spediti in chiaro, un malintenzionato potrebbe infatti modificare il documento e generare la corrispondente firma senza che il destinatario ne venga a conoscenza. Se solo il documento è cifrato, un malintenzionato potrebbe manomettere la firma e provocare un fallimento del controllo sulla firma. Una terza possibilità consiste nell'usare una cifratura a chiave pubblica ibrida per criptare sia la firma che il documento. Il firmatario usa la propria chiave privata e chiunque può adoperare la corrispondente chiave pubblica per controllare la firma ed il documento. Quest'ultimo procedimento sembra corretto, ma in effetti non ha senso. Se tale algoritmo mettesse veramente al sicuro il documento, esso sarebbe anche al sicuro da eventuali manomissioni e non ci sarebbe bisogno di alcuna firma. Il problema più serio, comunque, consiste nel fatto che tutto ciò non protegge da possibili manomissioni né la firma né il documento. Con il nostro algoritmo, infatti, solo la chiave di sessione per l'algoritmo simmetrico viene criptata usando la chiave privata del firmatario. Chiunque è in grado di usare la chiave pubblica per recuperare la chiave di sessione. Perciò sarebbe banale per un malintenzionato recuperare tale chiave di sessione e usarla per criptare documenti modificati e firme da spedire ad altri in nome del mittente.

Un algoritmo valido è quello che usa un algoritmo a chiave pubblica per cifrare solo la firma. In particolare, il valore di hash viene criptato usando la chiave privata del firmatario permettendo a chiunque di controllare la firma usando la corrispondente chiave pubblica. Il documento firmato può essere spedito usando qualsiasi altro algoritmo di cifratura, compreso nessuno se si tratta di un documento pubblico. Se il documento venisse modificato, il controllo della firma fallirebbe, ma ciò è quello a cui serve il controllo della firma. Il Digital Signature Standard[2] (DSA) è un algoritmo per la firma a chiave pubblica che funziona come appena descritto. Il DSA è l'algoritmo principale usato da GnuPG per firmare documenti.

Note

[1] L'algoritmo deve possedere la proprietà che l'effettiva chiave pubblica o privata possa essere usata dall'algoritmo di cifratura come chiave pubblica. L'RSA è un esempio di tale algoritmo, mentre ElGamal non possiede tale proprietà.
[2] Lo standard per la firma digitale.



Iniziamo

GnuPG utilizza la crittografia a chiave pubblica per permettere a coloro che lo utilizzano di comunicare in sicurezza. In un sistema a chiave pubblica ogni utente ha una coppia di chiavi consistenti in una chiave privata e una chiave pubblica. La chiave privata di una persona viene tenuta segreta; non deve mai essere rivelata. La chiave pubblica può essere data a tutti coloro con i quali l'utente vuole comunicare. GnuPG utilizza uno schema in qualche modo più sofisticato per il quale un utente possiede una coppia di chiavi primaria e zero o più coppie di chiavi subordinate addizionali. La coppia di chiavi primaria e quelle subordinate sono raggruppate assieme per facilitare la gestione delle chiavi e il mazzo così ottenuto può spesso essere considerato semplicemente come un'unica coppia di chiavi.

Generare una nuova coppia di chiavi

L'opzione a linea di comando --gen-key è utilizzata per creare una nuova coppia di chiavi primaria.

alice% gpg --gen-key
gpg (GnuPG) 0.9.4; Copyright (C) 1999 Free Software Foundation, Inc.
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions. See the file COPYING for details.

Per favore scegli che tipo di chiave vuoi:
(1) DSA e ElGamal (default)
(2) DSA (firma solo)
(4) ElGamal (firma e cifra)
Cosa scegli?

GnuPG è in grado di creare diversi tipi di coppie di chiavi, ma una chiave primaria deve essere capace di fare firme. Ci sono pertanto solo tre opzioni. L'opzione 1 crea in realtà due coppie di chiavi: una coppia di chiavi di tipo DSA che rappresenta la coppia di chiavi primaria ed è utilizzabile solo per firmare; una coppia di chiavi subordinata di tipo ElGamal, usata per criptare. L'opzione 2 è simile alla precedente ma crea solo una coppia di chiavi DSA. L'opzione 4[1]crea una singola coppia di chiavi ElGamal utilizzabile sia per firmare che per criptare. In tutti i casi è possibile in un secondo momento creare sotto-chiavi addizionali per cifrature e firme.

È necessario anche scegliere la dimensione della chiave. La dimensione di una chiave DSA deve essere compresa fra 512 e 1024 bit mentre una chiave ElGamal può essere di qualsiasi dimensione. GnuPG, però, richiede che le chiavi non siano più piccole di 768 bit. Accade quindi che, se si è scelta l'opzione 1 e successivamente si sceglie una dimensione per la chiave maggiore di 1024 bit, la chiave ElGamal avrà la dimensione richiesta, mentre la chiave DSA sarà di 1024 bit.

Sto per generare una nuova coppia di chiavi ELG-E.
la dimensione minima è 768 bit
la dimensione predefinita è 1024 bit
la dimensione massima consigliata è 2048 bit
Di che dimensioni vuoi la chiave? (1024)
Più lunga è la chiave maggiore è la sicurezza contro attacchi a forza bruta, anche se in pratica per un utilizzo comune la dimensione di default della chiave è adeguata. Con una chiave lunga, infatti, diventa più economico aggirare la cifratura piuttosto che provare a romperla. Inoltre cifratura e decifratura sono più lente e una dimensione maggiore della chiave può influenzare negativamente la lunghezza della firma. Una volta scelta, la dimensione della chiave non può più essere modificata.

Infine è necessario scegliere una data di scadenza. Se è stata scelta l'opzione 1, la data di scadenza verrà utilizzata sia per la coppia di chiavi ElGamal che per quella DSA.

Per favore specifica per quanto la chiave sarà valida.
0 = la chiave non scadrà
<n> = la chiave scadrà dopo n giorni
<n>w = la chiave scadrà dopo n settimane
<n>m = la chiave scadrà dopo n mesi
<n>y = la chiave scadrà dopo n anni
Chiave valida per? (0)

Per la maggior parte degli utenti una chiave che non scade risulta adeguata. Il tempo di scadenza, in caso contrario, dovrebbe essere scelto con cura in quanto, anche se è possibile cambiare la data di scadenza dopo che la chiave è stata creata, potrebbe risultare dificile comunicare un cambiamento alle persone che possiedono quella chiave pubblica.

È necessario fornire un identificativo utente[2] in aggiunta ai parametri della chiave. Lo User ID viene utilizzato per associare la chiave che si sta creando ad una persona reale.

Ti serve uno User ID per identificare la tua chiave; il software costruisce l'user id a partire da Nome e Cognome,
Commento e Indirizzo di Email indicati in questa forma:
"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"

Nome e Cognome:

Solamente uno User ID viene creato nel momento in cui si genera una nuova chiave. È comunque possibile aggiungere ulteriori User ID in seguito nel caso in cui si desiderasse utilizzare la chiave in due o più contesti diversi, come ad esempio sul lavoro e all'interno della propria sezione di partito. Uno User ID deve essere creato con cura in quanto non può più essere modificato.

GnuPG necessita di una ``frase d'ordine''[3] per proteggere le chiavi primarie e subordinate che si possiedono.

Ti serve una passphrase per proteggere la tua chiave segreta.

Inserisci la passphrase:

Non ci sono limiti alla lunghezza della passphrase, la quale dovrebbe essere scelta con attenzione. Dal punto di vista della sicurezza, la passphrase usata per sbloccare la chiave privata è uno dei punti più deboli di GnuPG (così come di altri sistema di crittografia a chiave pubblica), in quanto è l'unica protezione che si possiede nel caso in cui un'altra persona entri in possesso della propria chiave privata. Idealmente la passphrase non dovrebbe utilizzare parole prese da un dizionario e dovrebbe usare tanto caratteri minuscoli e minuscoli quanto caratteri non-alfabetici. Una buona passphrase è cruciale per un uso sicuro di GnuPG.

Generare un certificato di revoca

Una volta che la propria coppia di chiavi è stata creata, si dovrebbe immediatamente generare un certificato di revoca per la chiave pubblica primaria utilizzando l'opzione --gen-revoke. Se ci si dimentica la passphrase o se la propria chiave privata viene compromessa o persa, questo certificato di revoca può essere pubblicato per segnalare ad altri che la chiave pubblica non deve più essere usata. Una chiave pubblica revocata può comunque ancora essere utilizzata per verificare firme fatte in passato, ma non può più essere usata per cifrare futuri messaggi. Inoltre la revoca non influisce sulla propria capacità di decifrare messaggi spediti in passato, se si possiede ancora l'accesso alla chiave privata.

alice% gpg --output revoca.asc --gen-revoke mia_chiave
[...]

L'argomento mia_chiave deve essere uno specificatore di chiave, cioè o l'ID della propria coppia primaria di chiavi o una qualsiasi altra parte dello User ID che identifica la propria coppia di chiavi. Il certificato generato verrà riposto nel file revoca.asc. Se l'opzione --output è omessa, il risultato verrà stampato sullo standard output. Poiché il certificato è breve, si può pensare di stamparne una copia e tenerlo al sicuro da qualche parte, ad esempio nella propria cassetta di sicurezza. Il certificato non dovrebbe venir riposto in luoghi dove altri possono aver accesso in quanto chiunque può pubblicare il certificato di revoca e rendere la chiave pubblica corrispondente inutile.


Note

[1] L'opzione 3 serve a generare una coppia di chiavi ElGamal che non è utilizzabile per fare firme.
[2] D'ora in poi User ID per rispettare la traduzione del programma.
[3] D'ora in poi passphrase come nel testo originale.