Guida GnuPG Gentoo
1.Introduzione
Cosa si troverà in questa guida
Questa guida presuppone che l'utente abbia una certa familiarità con la
crittografia a chiave pubblica e la firma digitale.
Per un'introduzione a questi argomenti leggere il capitolo Crittografia a chiave pubblica o dare una occhiata al
GnuPG handbook
, capitolo 2, e ritornare qui.
La guida descrive come installare GnuPG, come creare una coppia di chiavi,
come aggiungere delle chiavi al proprio portachiavi, come inviare la propria
chiave pubblica al KeyServer e come firmare/criptare e verificare/decriptare
i messaggi inviati/ricevuti. Si imparerà anche come criptare i file del
proprio pc per evitare che altre persone ne leggano il contenuto.
Installazione del software necessario
Al livello base è necessario installare il pacchetto principale con un
emerge gnupg. Molte applicazioni oggi hanno qualche tipo di
supporto per gpg, quindi avere crypt nella propria variabile USE
è probabilmente una buona idea.
Se si vuole un client email che utilizzi gnupg è possibile usare pine
(installandolo mediante emerge pinepgp), mutt (installandolo mediante
emerge mutt), Mozilla/Netscape Mail, Evolution (che è un clone di
Microsoft Outlook per GNOME) oppure il client di KDE: KMail (Kmail fa parte
del pacchetto kdepim).
Se si utilizza KDE, potrebbe interessare Kgpg; questo piccolo
programma permette di generare coppie di chiavi, importare chiavi da file
ASCII, firmare le chiavi importate, esportare chiavi ed altro.
2.Generazione della propria chiave ed aggiunta delle chiavi al proprio portachiavi pubblico
Creazione della propria chiave
Per creare propria chiave, semplicemente basta eseguire gpg --gen-key.
Il comando la prima volta che viene eseguito crea alcune directory, in seguito
è necessario rilanciarlo per creare le chiavi:
Esempio 1: Processo di generazione delle chiavi |
$ gpg --gen-key
gpg (GnuPG) 1.0.7; Copyright (C) 2002 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.
Please select what kind of key you want:
(1) DSA and ElGamal (default)
(2) DSA (sign only)
(4) ElGamal (sign and encrypt)
(5) RSA (sign only)
Your selection? 1
|
A questo punto si ha la possibilità di scegliere il tipo di chiave. La
maggior parte degli utenti può utilizzare il tipo predefinito, DSA e ElGamal.
Il punto successivo riguarda la scelta della dimensione della chiave: una
chiave grande è preferibile, ma è importante ricordare di non utilizzare
chiavi più grandi di 2048 con DSA/ElGamal. Normalmente 1024 è più che
sufficiente per una normale l'email.
Dopo la dimensione viene richiesta la data di scadenza. Una chiave di breve
durata è preferibile, ma la maggior parte degli utenti può sceglierne una
che non scade mai, oppure con scadenza di 2 o 3 anni.
Esempio 2: Scelta della dimensione della chiave |
DSA keypair will have 1024 bits.
About to generate a new ELG-E keypair.
minimum keysize is 768 bits
default keysize is 1024 bits
highest suggested keysize is 2048 bits
What keysize do you want? (1024) 2048
Requested keysize is 2048 bits
Please specify how long the key should be valid.
0 = key does not expire
<n>= key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0) 0
Key does not expire at all
|
Ora è necessario inserire alcune informazioni personali. Se si ha intenzione
di inviare la propria chiave pubblica ad altre persone si deve inserire qui il
proprio vero indirizzo.
Esempio 3: Inserimento informazioni utente |
Is this correct (y/n)? y
You need a User-ID to identify your key; the software constructs the user id
from Real Name, Comment and Email Address in this form:
"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"
Real name: John Doe
Email address: john@nowhere.someplace.flick
Comment: The Real John Doe
You selected this USER-ID:
"John Doe (The Real John Doe) <john@nowhere.someplace.flick>"
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
You need a Passphrase to protect your secret key.
Enter passphrase:
|
Ora è necessario inserire due volte la password per la propria chiave. E'
buona norma utilizzare una password non banale. Se qualcuno dovesse mai
entrare in possesso della chiave privata e forzare la vostra password,
sarebbe in grado di inviare messaggi firmati a vostro nome, che chiunque
potrebbe ritenere spediti da voi.
GnuPG a questo punto creerà la vostra chiave. Muovere il mouse o ascoltare un
mp3 in background velocizzerà il processo di generazione poichè verranno
generati dati casuali.
Creare un certificato di revoca
Importante:
Questa sezione è molto importante e la si deve eseguirla ORA.
|
Dopo la creazione delle proprie chiavi dovreste creare un certificato di
revoca. Fare questo vi permetterà di revocare le vostre chiavi nel caso in
cui capiti qualcosa di spiacevole (qualcuno è entrato in possesso della
vostra chiave/password).
Esempio 4: Generazione del certificato di revoca |
$ gpg --list-keys
/home/humpback/.gnupg/pubring.gpg
---------------------------------
pub 1024D/75447B14 2002-12-08 John Doe (The Real John Doe) <john@nowhere.someplace.flick>
sub 2048g/96D6CDAD 2002-12-08
$ gpg --output revoke.asc --gen-revoke 75447B14
sec 1024D/75447B14 2002-12-08 John Doe (The Real John Doe) <john@nowhere.someplace.flick>
Create a revocation certificate for this key? y
Please select the reason for the revocation:
0 = No reason specified
1 = Key has been compromised
2 = Key is superseded
3 = Key is no longer used
Q = Cancel
(Probably you want to select 1 here)
Your decision? 1
Enter an optional description; end it with an empty line:
> Someone cracked me and got my key and passphrase
>
Reason for revocation: Key has been compromised
Someone cracked me and got my key and passphrase
Is this okay? y
You need a passphrase to unlock the secret key for
user: "John Doe (The Real John Doe) <john@nowhere.someplace.flick>"
1024-bit DSA key, ID 75447B14, created 2002-12-08
ASCII armored output forced.
Revocation certificate created.
Please move it to a medium which you can hide away; if Mallory gets
access to this certificate he can use it to make your key unusable.
It is smart to print this certificate and store it away, just in case
your media become unreadable. But have some caution: The print system of
your machine might store the data and make it available to others!
|
Il comando gpg --list-keys elenca le chiavi presenti nel proprio
portachiavi pubblico. E' possibile utilizzarlo per vedere l'ID della propria
chiave così come è necessario per creare il certificato di revoca.
Ora è una buona idea copiare l'intera directory .gnupg ed il certificato di
revoca (in ASCII criptato - revoke.asc) in un dispositivo sicuro
(due floppy o un CD-R da conservare in un luogo sicuro). Ricordate che
revoke.asc può essere utilizzato per revocare le tue chiavi
e renderle inutilizzabili in futuro.
Nota:
Se si è in possesso di diversi indirizzi email che si vuole utilizzare con
questa chiave, è necessario lanciare gpg --edit-key YOUR_ID e usare il
comando adduid.
Verranno richiesti nome, email ed un commento del secondo ID che verrà
utilizzato.
|
Esportazione delle chiavi
Per esportare la propria chiave, digitate gpg --armor --output john.asc
--export john@nowhere.someplace.flick. Si può usare quasi sempre l'ID
della chiave o qualcos'altro che la identifichi (qui è usato un indirizzo
email). Ora John ha a disposizione un john.asc che può mandare
agli amici, o mettere nella sua home page in modo che le persone possano
comunicare con lui in modo sicuro.
Importazione delle chiavi
Per aggiungere un file al proprio portachiavi pubblico, si deve prima
importarlo, quindi controllare il fingerprint(impronta digitale) della
chiave. Dopo averlo verificato si dovrebbe validarla.
Nota:
Si dovrebbe verificare con attenzione le chiavi. Questo è uno dei punti
deboli della crittografia a chiave pubblica.
|
Ora, come esempio, si aggiungerà la chiave pubblica di Luis Pinto (mio amico)
al nostro portachiavi pubblico. Dopo averlo contattato per ottenere da lui il
fingerprint della sua chiave, lo si confronterà con l'output del comando
fpr. Poichè la chiave è autentica, la si aggiungerà al portachiavi
pubblico. In questo caso, in particolare, la chiave di Luis scadrà il
2003-12-01, per cui viene richiesta la possibilità di fare in modo che la
vostra firma sulla sua chiave scada lo stesso giorno.
Esempio 5: Importare e segnare le chiavi |
$ gpg --import luis.asc
gpg: key 462405BB: public key imported
gpg: Total number processed: 1
gpg: imported: 1
$ gpg --list-keys
/home/humpback/.gnupg/pubring.gpg
---------------------------------
pub 1024D/75447B14 2002-12-08 John Doe (The Real John Doe) <john@nowhere.someplace.flick>
sub 2048g/96D6CDAD 2002-12-08
pub 1024D/462405BB 2002-12-01 Luis Pinto <lmpinto@student.dei.uc.pt>
uid Luis Pinto <lmpinto@dei.uc.pt>
sub 4096g/922175B3 2002-12-01 [expires: 2003-12-01]
$ gpg --edit-key lmpinto@dei.uc.pt
gpg (GnuPG) 1.0.7; Copyright (C) 2002 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.
gpg: checking the trustdb
gpg: checking at depth 0 signed=0 ot(-/q/n/m/f/u)=0/0/0/0/0/1
pub 1024D/462405BB created: 2002-12-01 expires: 2003-12-01 trust: -/-
sub 4096g/922175B3 created: 2002-12-01 expires: 2003-12-01
(1) Luis Pinto <lmpinto@dei.uc.pt>
(2). Luis Pinto <lmpinto@student.dei.uc.pt>
Command> fpr
pub 1024D/462405BB 2002-12-01 Luis Pinto <lmpinto@dei.uc.pt>
Fingerprint: F056 3697 ADE3 CF98 B80B 8494 0AD3 E57B 4624 05BB
Command> sign
Really sign all user IDs? y
pub 1024D/462405BB created: 2002-12-01 expires: 2003-12-01 trust: -/-
Fingerprint: F056 3697 ADE3 CF98 B80B 8494 0AD3 E57B 4624 05BB
Luis Pinto <lmpinto@dei.uc.pt>
Luis Pinto <lmpinto@student.dei.uc.pt>
This key is due to expire on 2003-12-01.
Do you want your signature to expire at the same time? (Y/n) Y
How carefully have you verified the key you are about to sign actually belongs
to the person named above? If you don't know what to answer, enter "0".
(0) I will not answer. (default)
(1) I have not checked at all.
(2) I have done casual checking.
(3) I have done very careful checking.
Your selection? 3
Are you really sure that you want to sign this key
with your key: "John Doe (The Real John Doe) <john@nowhere.someplace.flick>"
I have checked this key very carefully.
Really sign? y
You need a passphrase to unlock the secret key for
user: "John Doe (The Real John Doe) <john@nowhere.someplace.flick>"
1024-bit DSA key, ID 75447B14, created 2002-12-08
Command> check
uid Luis Pinto <lmpinto@dei.uc.pt>
sig!3 462405BB 2002-12-01 [self-signature]
sig!3 75447B14 2002-12-08 John Doe (The Real John Doe) <john@nowhe
uid Luis Pinto <lmpinto@student.dei.uc.pt>
sig!3 462405BB 2002-12-01 [self-signature]
sig!3 75447B14 2002-12-08 John Doe (The Real John Doe) <john@nowhe
|
3.Scambiare le chiavi con i KeyServer
Invio delle chiavi ai KeyServer
Ora che si possiede la propria chiave, è una buona idea inviarla ai KeyServer
mondiali. Ci sono molti KeyServer nel mondo e la maggior parte si scambiano
le chiavi tra loro. Ora si manderà la chiave di Luis al server
subkeys.pgp.net. Questo server utilizza HTTP, quindi se si ha bisogno di
utilizzare un proxy per il traffico HTTP non bisogna dimenticare di
impostarlo (utilizzando il seguente comando export
http_proxy=http://proxy_host:port/). Il comando per inviare la chiave è
il seguente: gpg --keyserver subkeys.pgp.net --keyserver-options
honor-http-proxy --send-key 75447B14 dove 75447B14 è l'ID della
chiave. Se non si ha bisogno di un proxy HTTP si può rimuovere l'opzione
--keyserver-options honor-http-proxy.
E' inoltre possibile mandare al KeyServer anche le chiavi di altre persone
dopo averle firmate. Si potrebbe mandare la chiave di Luis Pinto al KeyServer.
In questo modo qualcuno che si fida della nostra chiave potrebbe usare la
firma che è stata apposta per ritenere fidata anche la chiave di Luis.
Recupero delle chiavi dai KeyServer
Ora, per esempio, si andrà a cercare la chiave di Gustavo Felisberto e la si
aggiungerà al portachiavi di John Doe (nel caso in cui non lo si avesse
notato, Gustavo Felisbero è la persona che ha scritto questa guida :-) ).
Esempio 6: Ricerca delle chiavi sul KeyServer |
$ gpg --keyserver subkeys.pgp.net --keyserver-options honor-http-proxy --search-keys humpback@felisberto.net
gpg: searching for "humpback@felisberto.net" from HKP server subkeys.pgp.net
Keys 1-5 of 5 for "humpback@felisberto.net"
(1)Gustavo Felisberto (apt-get install anarchy) <humpback@felisberto.net> 1024
created 2002-12-06, key B9F2D52A
(2)Gustavo Felisberto <humpback@altavista.net> 1024
created 1999-08-03, key E97E0B46
(3)Gustavo A.S.R. Felisberto <humpback@altavista.net> 1024
created 1998-12-10, key B59AB043
(4)Gustavo Adolfo Silva Ribeiro Felisberto <humpback@altavista.net> 1024
created 1998-08-26, key 39EB133D
(5)Gustavo Adolfo Silva Ribeiro Felisberto <humpback@altavista.net> 1024
created 1998-06-14, key AE02AF87
Enter number(s), N)ext, or Q)uit >1
gpg: requesting key B9F2D52A from HKP keyserver subkeys.pgp.net
gpg: key B9F2D52A: public key imported
gpg: Total number processed: 1
gpg: imported: 1
|
Come si può vedere dalla risposta del server, sono state inviate diverse
chiavi al KeyServer, ma al momento è utilizzata solo B9F2D52A.
Ora John Doe può scaricarla e firmarla, se la ritiene fidata.
4.Utilizzo di un agente GPG
Cos'è un agente GPG?
Ci sono situazioni, quando si lavora con certe applicazioni, in cui l'utilizzo
delle chiavi GPG è assai frequente, ciò significa che si dovrebbe digitare la
propria password molto spesso. In passato molte applicazioni utilizzavano un
meccanismo di cache per salvare temporaneamente la password. Questi meccanismi
non era condivisi con le altre applicazioni per ragioni di sicurezza, e ogni
programma doveva inventarsi il proprio meccanismo.
Un Agente GPG è un'applicazione separata che GPG usa per salvare la password
temporaneamente in cache in maniera standard e sicura. Esso permette a
diverse applicazioni di usare GPG contemporaneamente: se si inserisce la
password in un'applicazione non sarà necessario digitarla nuovamente per l'
altra applicazione: ovviamente se l'agente è configurato in maniera tale da
permetterlo.
Gentoo fornisce diversi agenti GPG. app-crypt/gpg-agent può essere
considerato come quello di riferimento, che verrà illustrato in questo
documento.
Installazione e configurazione di gpg-agent e pinentry
E' ovviamente necessario installare gpg-agent, e inoltre
pinentry, che è l'applicazione di supporto a gpg-agent per richiedere
la password in una finestra grafica. Può lavorare in tre modi: con una
finestra a popup che usa le librerie gtk+, le Qt, o curses (a seconda delle
flag di USE attive al momento della sua compilazione).
Esempio 7: Installare gpg-agent e pinentry |
# emerge gpg-agent pinentry
|
Ora bisogna creare un file ~/.gnupg/gpg-agent.conf e inserite le
seguenti righe che definiscono il tempo di timeout della password (ad esempio
30 minuti) e l'applicazione che deve essere richiamata quando viene richiesta
la password (ad esempio la versione Qt di pinentry).
Esempio 8: Modificare ~/.gnupg/gpg-agent.conf |
pinentry-program /usr/bin/pinentry-qt
no-grab
default-cache-ttl 1800
|
Ora si configuri GnuPG perchè utilizzi l'agente quando necessario. Modificare
~/.gnupg/gpg.conf aggiungendo la linea seguente:
Esempio 9: Configurare GnuPG per l'uso di GPG Agent |
use-agent
|
Ora il sistema è quasi pronto per usare l'agente GPG.
Avvio automatico dell'agente
Se si utilizza KDE come ambiente grafico, modificate il file
/usr/kde/3.x/env/agent-startup.sh (per l'intero sistema) o
~/.kde/env/gpgagent.sh (per il solo utente locale) e
aggiungere il seguente comando per far in modo che KDE avvii automaticamente
l'agente GPG:
Esempio 10: Avvio automatico dell'agente in KDE |
eval "$(gpg-agent --daemon)"
|
Se si utilizza un altro ambiente grafico, inserire la stessa linea sopracitata
in ~/.xinitrc (se si utilizza startx) o
~/.xsession (se si utilizza XDM/GDM/KDM/...).
5.Lavorare con documenti
Criptare e firmare
Adesso si supponga di avere un file che si desidera inviare a Luis. Lo si può
criptare, firmare o criptare e firmare. Criptare significa che solo Luis sarà
in grado di aprirlo. La firma conferma a Luis che siete stati proprio voi a
creare il file.
I seguenti comandi fanno esattamente questo: criptano, firmano e
criptano/firmano.
Esempio 11: Encrypting and Signing files |
$ gpg --output doc.gpg --encrypt --recipient lmpinto@dei.uc.pt doc_to_encrypt
$ gpg --output doc.gpg --sign --recipient lmpinto@dei.uc.pt doc_to_sign
$ gpg --output doc.gpg --encrypt --sign --recipient lmpinto@dei.uc.pt doc_to_encrypt_and_sign
|
Questa procedura crea file binari. Se si vuole creare file ASCII si aggiunga
--clearsign all'inizio del comando.
Decriptare e verificare le firme
Supponiamo che si abbia ricevuto un file criptato con la propria chiave
pubblica. Il comando per decriptarlo è gpg --output document --decrypt
encrypted_doc.gpg. Questo decripterà il documento e verificherà la firma
(se ne esiste una).
Caratteristiche avanzate
Ci sono alcune utili caratteristiche avazate in GnuPG. Per trovarle, si apra
il file ~/.gnupg/gpg.conf.
Esempio 12: ~/.gnupg/gpg.conf |
#keyserver x-hkp://subkeys.pgp.net
#keyserver-options auto-key-retrieve include-disabled include-revoked
|
Si cerchino le due linee qui sopra e le si decommentino. Con queste opzioni,
ogni volta che GnuPG dovrà verificare una firma e non troverà la
corrispondente chiave pubblica nel portachiavi locale, contatterà il
KeyServer all'indirizzo subkeys.pgp.net e cercherà di recuperarne
una da quella locazione.
Un'altro comando utile è gpg --refresh-keys. Il programma eseguito con
tale opzione contatterà il KeyServer definito nel file di impostazioni ed
aggiornerà le chiavi pubbliche presenti nel portachiavi locale, cercando
chiavi revocate, nuovi id e nuove firme sulle chiavi.
E' opportuno eseguire questo comando una o due volte al mese, in modo da
sapere se qualcuno revoca la propria chiave.
6.Interfaccie a GnuPG
La firma nelle email
Il 95% delle volte si userà GnuPG con l'email per firmare/criptare i messaggi
in uscita e per leggere messaggi firmati/criptati. Quindi è sufficiente
introdurre solo questi casi.
Esistono due modi per firmare/criptare una email con GnuPG, il vecchio modo ed
il nuovo modo :-). Con il primo metodo i messaggi appaiono in semplice testo,
senza la possibilità di formattazione e con file allegati non firmati / non
criptati. Ecco un esempio di un messaggio firmato in tale maniera:
Esempio 13: Una firma di un testo semplice |
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Test message
-----BEGIN PGP SIGNATURE-----
Version: PGPfreeware 6.5.8 for non-commercial use
iQA/AwUBP8461jMX0745gR7AEQIEOwCg011GbufXO3ED3FkLWXmfzg7xm1cAoJD0
0EU3Kd2EKNCqataEqM5qjpPs
=LchZ
-----END PGP SIGNATURE-----
|
Al giorno d'oggi, inviare messaggi in questo modo non è assolutamente una
buona idea, visto che esistono ottime interfacce grafiche e client email
che gestiscono i tag html.
Per risolvere il problema è stata creata un'estensione a MIME (Multipurpose
Internet Mail Extensions). Un nuovo campo dell'email indica al client che
l'intero contenuto del messaggio è firmato e/o criptato. Il problema di questa
soluzione è che non è supportata da tutti i client email: alcuni fanno persino
pasticci con il contenuto, come Outlook di Microsoft, famoso per non funzionare
bene con questo metodo.
Kgpg
Kpgp è una interfaccia grafica carina per GNUPG. Nella schermata principale è
possibile incollare il testo che si vuole firmare o criptare oppure incollare
il testo ASCII criptato che si vuole decriptare.
Figura 1 |
 |
In questa immagine si può vedere la schermata principale di Kgpg con del
testo criptato incollato. Da qui è possibile decriptarlo (sarà richiesta la
propria password), criptare altri file, incollare dell'altro testo da
firmare...
Figura 2 |
 |
Qui si può vedere la schermata di gestione delle chiavi. Vediamo la nostra
bella chiave per John Doe, le due chiavi fidate per Gustavo e Luis e la
chiave non fidata per Daniel Robbins (non è ancora stato chiamato per
controllare il suo fingerprint :-) ).
Seahorse
Seahorse aspira a diventare un frontend grafico di GnuPG per Gnome. Questo
programma si sta evolvendo in fretta, ma non dispone ancora di importanti
caratteristiche presenti in Kpgp o nella versione a riga di comando.
Mozilla Enigmail
Mozilla dispone, dalla versione 1.0, di Enigmail, un plugin per il client
email che è molto semplice da configurare. Si deve semplicemente andare in
Preferences -> Privacy & Security -> Enigmail, dove è necessario
inserire la propria chiave per l'email.
I messaggi che arrivano con una firma pgp o gpg non fidata vengono
contrassegnati con una penna rotta. Quelli che hanno una firma valida
appariranno con una penna tutta intera. Enigmail può anche recuperare le
chiavi dai KeyServer, ma in caso di problemi, stampa alcuni strani messaggi
di errore (ma in questo casi ci si ricorda ancora della linea di comando,
giusto?).
KMail
Se è stata impostata la USE flag crypt, KMail sarà compilato con il
supporto per gpg, e sarà pronto per crittografare e decrittografare email
con PGP automaticamente, oltre a offrire la possibilità di crittografare
email OpenPGP/MIME.
Se si vuole decrittografare email OpenPGP/MIME, si deve avere un agente GPG
configurato. (Si veda Utilizzo di un agente GPG)
Si può verificare che KMail sia correttamente configurato entrando in
Impostazioni, Configura KMail, Sicurezza,
Backend Crittografici. Si dovrebbe vedere un backend basato su
GpgME e si dovrebbe poter attivare la casella su OpenGPG. Se il suddetto
backend è presente ma è segnato in grigio, si faccia click su
Riesegui scansione. Se il backend GpgME resta grigio vuole dire
che KMail non sta funzionando a dovere.
Sylpheed-Claws
Questo è il client email che utilizza l'autore. E' molto veloce con
caselle di posta grandi, dispone di tutte le caratteristiche desiderabili
in un client e funziona perfettamente con gpg. L'unico problema è dato dal
fatto che non funziona con le vecchie firme PGP, quindi se si riceve una mail
di quel tipo si dovrà verificare a mano la firma.
Per usare la propria chiave gpg con Sylpheed-Claws bisogna entrare nella
configurazione dell'account ed cliccare sulla casella privacy. Da lì è
possibile scegliere quale chiave utilizzare.
Probabilmente la maggior parte degli utenti dovrà scegliere la chiave di
default.
7.Crittografia a chiave pubblica
Le basi della crittografia a chiave pubblica
Il concetto di crittografia a chiave pubblica fu originariamente dovuto a
Whitfield Diffie e Martin Hellman (1976). Quando l'autore senti per la prima
volta, nel '93, le parole "chiave pubblica" e "crittografia" nella stessa
frase, pensò che una cosa del genere fosse impossibile. A quei tempi non
esisteva Internet (in realtà esisteva, ma non era alla portata di tutti),
quindi andò in biblioteca e chiese alcuni libri sulla crittografia. All'epoca
aveva 16 anni e l'addetto allo sportello lo guardò con stupore e gli portò
alcuni libri per bambini sui cifrari per sostituzione (quelli in cui
avvengono semplici sostituzioni di lettere, come il famoso Cifrario di Cesare
o il ROT-13 (Tragbb Ebpxf, naq lbh xabj vg vf tbbq orpnhfr lbh ner ernqvat
guvf qbp.), (Si faccia emerge rotix se non si è in grado di decifrare questa
frase)). Essendo frustrato per l'accaduto, cominciò a ricercare maggiori
informazioni. E' bello avere matematici in famiglia, perchè appena ebbe
l'occasione di parlare con uno di loro, fu proiettato in un nuovo mondo.
Ed ora un po' di matematica:
Esempio 14: Concetti matematici |
Definizioni:
1- Un numero primo è un numero intero positivo divisibile solo per se stesso e
per 1 (il resto della divisione è 0).
I primi 8 numeri primi sono 1,2,3,5,7,11,13,17
Teorema (qui senza dimostrazione)
1- Ogni numero intero positivo non primo è scomponibile in un prodotto di numeri
primi, e tale prodotto è unico.
4=2*2
6=2*3
8=2*4=2*2*2
10=2*5
12=2*6=2*2*3
"Fatti":
1- E' matematicamente facile moltiplicare due grandi interi
2- E' difficile trovare i fattori primi di un dato intero positivo.
|
Se si da il numero 35 e si afferma che questo numero è il prodotto di due
numeri primi, è facile scoprire che tali numeri sono 5 e 7. Ma se si chiede
la stessa cosa per 1588522601 ci vorrà un bel po' di tempo (o di cicli di
CPU) per scoprire che si tratta del prodotto di 49811*31891. E se il numero
è davvero grande, questo compito diventa "impossibile". A questo punto se
si comunica al mondo il proprio grande numero, che si sa essere il prodotto
di due primi, si sa qualcosa di quel numero che non è noto a nessun'altro.
Questa è la base delle moderne implementazioni di Crittografia a Chiave
Pubblica (PKC). Come (irrealistico) esempio, si dia a chiunque il proprio
numero e qualcuno lo userà per cifrare un messaggio per voi. Tutti possono
vedere il messaggio cifrato perchè voi siete gli unici a conoscere la
scorciatoia per leggerlo; gli altri dovrebbero prima "scomporre" quel grande
numero per essere in grado di leggere il messaggio, ed è un "fatto"
l'impossibilità di farlo in un lasso di tempo ragionevole (con i metodi
odierni e i più veloci computer al mondo ci vorrebbero migliaia di anni).
In questa ipotesi, i due grandi numeri primi sono chiamati la CHIAVE PRIVATA,
mentre il grande numero non primo è la CHIAVE PUBBLICA.
Questo non corrisponde al 100% con quanto avviene in realtà, ma può rendere
bene l'idea ad un nuovo utente. Per maggiori informazioni si veda hack.gr per
quanto riguarda il protocollo
Diffie-Hellman. Per approfondire ulteriormente andate in biblioteca e
prendete una copia di
"Handbook of Applied Cryptography" di Alfred J. Menezes, Paul C. van
Oorschot e Scott A. Vanstone, disponibile anche gratuitamente online
all'indirizzo qui sopra.
Una conseguenza di quanto detto fino a questo punto è che se si cifra un
messaggio per voi e si perde il messaggio originale non cifrato, non si
sarà in grado di risalire all'originale dalla versione cifrata.
Firme
Abbiamo già visto come chiunque in possesso della nostra chiave pubblica
possa mandare un messaggio cifrato. Ma come possiamo verificare che l'autore
del messaggio è veramente chi dice di essere? O, in altre parole: se si riceve
una email da voi come si può sapere davvero che è stata inviata da voi e non
da qualcun altro che sostiene di essere voi?
Ricordate quando si è detto che la PKC non è così semplice? L'idea è che
quando si cifra un messaggio per una persona, lo si può anche firmare con
la propria chiave privata in modo che, quando lo si riceve, la persona possa
a sua volta utilizzare per prima cosa la vostra chiave pubblica per verificare
la firma e, quindi, la sua chiave privata per decifrare il messaggio.
Come si può vedere non sarebbe possibile fare questo nell'ipotesi di prima.
Altra cosa molto importate: per firmare i messaggi non è necessario cifrarli.
Si può creare un messaggio leggibile da chiunque, ma con il proprio "marchio".
E se un solo carattere del messaggio viene modificato, tale manomissione può
essere rilevata.
Key Server e chiavi firmate
Ora supponiamo che si non abbia avuto contatti con voi fino a quando non avete
mandato un messaggio a una persona: come può questa persona avere la vostra
chiave pubblica, e come può sapere se è veramente la vostra?
Per risolvere questo problema sono stati creati i key server pubblici. Quando
si crea la propria coppia di chiavi (pubblica e privata), si può inviare la
propria chiave pubblica al key server. A questo punto tutti possono scaricare
la vostra chiave da lì. Ma come si può sapere che quella chiave è la chiave
dell'autore del messaggio? Per questo bisogna introdurre un altro concetto: la
firma della chiave.
Firmare la chiave significa che, se si ha la chiave pubblica di un'altra
persona e si sa con certezza che è davvero la chiave di quella persona
(perchè è un amico, qualcuno che conosco di persona, ecc.) si può firmare
quella chiave pubblica e mandarla ai Key Kerver, in modo da dire al mondo:
"Questa chiave appartiene davvero alla persona che sostiene gli appartenga".
In questo modo le persone che hanno la vostra chiave pubblica e si fidano di
voi possono usare questa fiducia per ritenere fidate le chiavi di altri.
Questo meccanismo può confondere, quindi vediamo un esempio reale.
Immaginiamo una situazione con 3 persone: John, Mary e Lisa. John è un buon
amico di Mary, ma non conosce Lisa; Lisa è una buona amica di Mary, ma non
conosce John. Un giorno Lisa manda a John una email firmata. John recupererà
la chiave pubblica di Lisa dal KeyServer, verificherà il messaggio e, se è
tutto a posto, saprà che chiunque abbia scritto quel messaggio ha anche
creato quella chiave. Ma come può sapere che è effettivamente la persona
che dice di essere?
A questo punto John vede la firma di Mary sulla chiave, che può verificare
perchè dispone già della chiave di Mary e la ritiene fidata. Grazie a questo
anello di fiducia egli conclude che l'email ricevuta è stata realmente
scritta da Lisa.
Ora si è veramente pronti per leggere questa guida, tornate indietro al
capitolo 1 ed imparate a usare gpg.
8.Epilogo e ringraziamenti
Alcuni problemi
Si sono avuti alcuni problemi con foto inserite nelle chiavi. Controllate la
versione che state utilizzando. Se si ha GnuPG 1.2.1-r1 e superiori non ci
dovrebbero essere problemi. In ogni caso, la maggior parte dei KeyServer non
gradisce chiavi con foto, quindi meglio non utilizzarle.
L'ultima versione di GnuPG sembra non funzionare con il comando gpg
--send-keys, che viene utilizzato per mandare tutte le chiavi presenti
nel portachiavi al server pubblico.
Cosa manca
Gpg è uno strumento molto complesso e permette di fare molto di più
rispetto a quanto è stato trattato qui. Questo documento è stato concepito
per i nuovi utenti GnuPG. Per maggiori informazioni, si veda il
sito di GnuPG.
Non sono stati trattati altri strumenti come pgp4pine, gpgpine,
Evolution e gli strumenti per Windows; probabilmente si amplierà questo
documento in futuro.
Ringraziamenti
Il GnuPG Handbook di John Michael Ashley
è un ottimo libro per i principianti.
Swift (Sven Vermeulen) per aver spinto a ri-scrivere questo documento.
I fantastici ragazzi del canale #gentoo-doc.
Tiago Serra per avermi riportato sulla via della privacy.
|