Crittografia di livello militare a portata di tutti

criptoGnuPG (Gnu Privacy Guard) o “Crittografia di livello militare a portata di tutti” è la versione Open Source del software di crittazione PGP (Pretty Good Privacy) che Bruce Schneier, crittografo, in Applied Crittography ha definito come il modo per arrivare “probabilmente il più vicino alla crittografia di livello militare”. Proprio per questo motivo Zimmermann, il suo creatore, fu accusato di “esportazione di armi senza apposita licenza”; non mi sento dunque di consigliare l’utilizzo di questo programma a tutti coloro che non posseggano il porto d’armi! GPG è uno dei programmi sviluppati dalla Free Software Foundation ed è attualmente un programma stabile e maturo, compatibile con gli standard OpenPGP, e distribuito gratuitamente insieme a buona parte delle distribuzioni Linux, oltre che con FreeBSD, NetBSD ed OpenBSD;

ne esistono inoltre delle versioni per Windows e Mac OS X grazie alla portabilità del suo codice (libero). Il livello di sicurezza raggiunto da GnuPg è tale da far ritenere a molti informatici che nemmeno molte aziende governative siano in grado di decrittare documenti protetti attraverso questo sistema; ciò non toglie, però, che esistano molti altri metodi per intercettare o recuperare i files originali “sprotetti”, in modo da rendere vano l’utilizzo di questo software.

GnuPG utilizza un sistema a chiave pubblica; ciò significa che ogni utente, per comunicare in sicurezza attraverso l’utilizzo della crittografia, dispone di una chiave pubblica ed una chiave privata. La chiave pubblica è utilizzata da chiunque voglia comunicare in modo sicuro con l’utente, offrendo le specifiche per criptare i files che potranno essere poi decriptati dal possessore della chiave privata. Per utilizzare GPG dobbiamo dunque generare le nostre due chiavi: apriamo un terminale e digitiamo il comando gpg –gen-key; a questo punto il programma ci chiederà che tipo di chiave vogliamo generare; il mio consiglio è quello di fare la scelta di default (DSA e ElGamal) che genera due coppie di chiavi (DSA solo per firmare; ElGamal sia per firmare che criptare/decriptare). Adesso scegliamo la dimensione della chiave (in bit): anche qui possiamo utilizzare le opzioni di default (1024 bit) che offre già un ottimo livello di sicurezza (ovviamente più lunga è la chiave, maggiore è il livello di sicurezza). Scegliamo quindi il periodo di durata della chiave (è bene impostarne uno non troppo lungo: in questo modo, se la chiave diventasse improvvisamente non più valida, dopo poco tempo risulterebbe non più utilizzabile), inseriamo i nostri dati personali, al fine di poter associare la chiave ad una persona fisica, e infine, importantissima, la passphrase: questa ci servirà per decrittare e firmare i files, dunque è importante sceglierne una abbastanza sicura.

 

Creata la nostra chiave è importantissimo generare un certificato di revoca, che ci consente di invalidare la propria chiave qualora essa diventasse inutilizzata, compromessa, etc… Per farlo digitiamo in un terminale gpg –output revoca.asc –gen-revoke mia_chiave in cui mia_chiave rappresenta uno specificatore di chiave ossia l’ID associato alla coppia di chiavi generate o un qualsiasi altro campo del proprio User ID indicato durante la creazione delle chiavi. In questo caso il certificato di revoca viene memorizzato nel file revoca.asc: è importantissimo tenere questo file al sicuro in quanto chiunque, avendone accesso, potrebbe rendere inutilizzabile la propria chiave pubblica. Qualora si presentasse la necessità di revocare la chiave adesso potremmo dunque farlo pubblicando il nostro certificato di revoca.

Adesso non ci resta che la parte migliore! Utilizzando il comando gpg –list-keys possiamo visualizzare tutte le chiavi pubbliche presenti nel nostro portachiavi (ovvero le chiavi pubbliche memorizzate per un utilizzo futuro); per esportare una qualsiasi chiave presente nel nostro portachiavi pubblico basta utilizzare l’opzione export in questo modo: gpg –output chiave.gpg –export user_id dove user_id è un qualsiasi ID della chiave da esportare. Per rendere più “sicura” l’esportazione delle chiavi possiamo aggiungere l’opzione –armor al comando appena analizzato.

Per importare una chiave, invece, possiamo utilizzare l’opzione –import in questo modo: gpg –import gino.gpg; verifichiamo l’avvenuta importazione della chiave attraverso l’utilizzo di gpg –list-keys. Verificata la presenza di un ipotetico “Gino” nel nostro mazzo di chiavi, adesso abbiamo la possibilità di comunicare con lui attraverso la comunicazione crittata. Prima però controlliamo il fingerprint (le “impronte digitali”) delle nostre chiavi, assicurandoci che ad ogni chiave corrisponda l’effettivo proprietario attraverso il comando gpg –fingerprint. A questo punto possiamo validare anche noi la chiave (se siamo realmente sicuri che a quella chiave corrisponda l’effettivo possessore) entrando nel menu di edit della chiave: attraverso gpg –edit-key user_id possiamo modificare in vari modi la chiave presa in esame. Attraverso il comando sign validiamo la chiave in editing, con check possiamo leggere le altre firme presenti nella chiave, con help visualizziamo una veloce schermata di aiuto, con q usciamo dal sottomenu.

Adesso, per cifrare un documento, ci basterà disporre della chiave di un utente nel nostro portachiavi pubblico, e poi dare via terminale il comando gpg –output filecifrato –armor –encrypt –recipient user_id dove user_id è ancora una volta l’ID del destinatario. In questo modo, soltanto il possessore della chiave privata relativa a quell’user_id potrà decriptare il “filecifrato”. Per decriptare un file criptato attraverso l’uso della nostra chiave pubblica, invece, basta utilizzare gpg –output filedecifrato -d filecifrato ed immettendo quindi la propria passphrase.

Per cifrare i propri file firmandoli, invece, possiamo utilizzare gpg –output filefirmato –sign filedafirmare; se invece si presentasse la necessità di firmare un file lasciandolo “in chiaro” potremmo alternativamente usare gpg –clearsign filedafirmare o gpg –output firma.sig –detach -sign fileoriginale nel caso in cui volessimo salvare la firma in un file separato da quello originale. Per verificare la firma, in quest’ultimo caso, useremo gpg –verify firma.sig fileoriginario, mentre negli altri casi andrà benissimo gpg –verify filefirmato e, nel caso in cui il file sia anche cifrato, potremo decifrarlo attraverso il comando di decifrazione “standard” prima incontrato.

Per ulteriori informazioni circa l’utilizzo di GnuPG potete facilmente consultare:

La guida ufficiale completa in formato HTML o scaricabile/visualizzabile in PDF;
Le Man Pages, disponibili in inglese digitando man gpg in un terminale, o alternativamente seguendo questo link.
Mi sembra comunque di rilevante interesse segnalare che esistono dei frontend grafici per l’utilizzo “facilitato” di gpg: Seahorse per GNOME e Kgpg per KDE. Entrambi i programmi sono disponibili nei repository stabili della quasi totalità delle distribuzioni!