back to top

Breve guida a GnuPG (Gnu Privacy Guard)

1. Come funziona la crittografia a chiave pubblica

La crittografia a chiave pubblica (o crittografia asimmetrica o a coppia di chiavi) nasce per trovare una soluzione ad un problema insito nel funzionamento dei classici sistemi di cifratura (o a "chiave privata"), questi ultimi infatti sono generalmente regolati sulla base del seguente meccanismo:

  1. il mittente di un messaggio effettua una procedura di cifratura utilizzando una determnata chiave che servirà anche a decifrarlo;
  2. il mittente fornisce la chiave di cifratura al destinatario che diversamente non potrebbe accedere ai contenuti del messaggio;
  3. il destinatario è in grado di decifrare il messaggio grazie alla chiave fornitagli dal mittente.

Nella crittografia classica, il mittente e il destinatario hanno quindi la responsabilità di mantenere segreta la chiave utilizzata; ma cosa succederebbe se un terzo si impossessasse di essa? In tempi di file sharing dove tutto si può condividere con tutti in pochi istanti tramite reti per il P2P, la minaccia di rendere vani gli sforzi per mantenere segreti i propri messaggi è palese.

Utilizzando la Crittografia a chiave pubblica si avranno invece a disposizione due chiavi:

  1. una chiave pubblica che potrà essere messa a disposizione di chiunque con qualsiasi mezzo (sarà appunto "pubblica") che viene utilizzata per criptare il messaggio;
  2. ed una seconda chiave (privata, quindi da mantenere segreta) che viene utilizzata per decriptarlo.

Il funzionamento è il seguente: l’utilizzatore (che chiameremo sig. Pippo) si crea una coppia di chiavi (pubblica e privata); la chiave pubblica viene distribuita ai vari interlocutori; quella privata viene custodita gelosamente. Chiunque voglia mettersi in contatto con il sig. Pippo dovrà prima munirsi della chiave pubblica per criptare il messaggio; una volta ricevuto il messaggio il sig. Pippo potrà decriptarlo grazie alla sua chiave privata.

Un meccanismo del genere, grossolani errori umani a parte, aumenta il livello di sicurezza delle operazioni di cifratura.

Un ulteriore elemento di sicurezza che rafforza il meccanismo di Cifratura a chiave pubblica è dato dalla Firma digitale; essa è il risultato della combinazione tra la chiave privata e il testo del messaggio che dovrà essere protetto; grazie alla firma digitale il destinatario potrà poi verificare (tramite la chiave pubblica) il testo e sincerarsi del fatto che questo sia stato spedito dal giusto mittente e non abbia subito alterazioni dal momento in cui è stato firmato.

La firma digitale è, quindi, utile non tanto per quanto riguarda la segretezza della corrispondenza, ma per quanto riguarda la sua affidabilità; attraverso di essa si può verificare la veridicità di un messaggio, evitare raggiri derivanti da furti di identità, limitare la quantità di posta indesiderata, diminuire i falsi positivi degli anti-spam, certificare l’invio di email e scoprire se un determinato messaggio può nascondere pericoli come per esempio malware "mascherati" da aggiornamenti del proprio software.

Naturalmente l’ambito di utilizzo della Crittografia a chiave pubblica non è soltanto quello della posta elettronica, esistono ormai numerosi sistemi per l’invio di messaggi via Web o la condivisione di contenuti e in molte occasioni può presentarsi la necessità di cifrare i propri messaggi, si pensi per esempio allo sviluppo in team di progetti closed source.

Anche questo sistema di crittografia, per quanto estremamente più avanzato rispetto a quello basato essenzialmente su chiavi private, ha i suoi limiti. Innanzitutto, come anticipato, va considerato l’errore umano, se si pensa che inviare la propria chiave privata per email sia una procedura sicura, nessuno potrà aiutarci a tenere segreti i nostri messaggi.

I pericoli per questo meccanismo possono derivare però anche da attacchi indiretti, un utente malintenzionato potrebbe, per esempio, installare un keylogger (programma che spia e registra le digitazioni su una tastiera) sul computer di utenti inconsapevoli e così scoprire le chiavi private da esso utilizzate. Come spesso accade, anche la Crittografia pubblica non rappresenta un sistema sicuro al 100%, ma per molti ambiti di applicazione si configura comunque il sistema più sicuro tra quelli disponibili.

2. Installare GnuPG

GnuPG (Gnu Privacy Guard) è un programma rilasciato sotto licenza Open Source e realizzato per effettuare operazioni di Crittografia a chiave pubblica; si tratta di un’applicazione utilizzabile in tutti i sistemi Linux così come su altre piattaforme come per esempio FreeBSD, OpenBSD e NetBSD, inoltre ne sono state realizzate delle versione per garantire la portabilità su Mac e Windows.

GnuPG è del tutto aderente con gli standard OpenPGP per l’interoperabilità dei messaggi protetti tramite crittografia asimmetrica (o "a doppia chiave") su Internet, nonché con gli standard dello IETF (Internet Engineering Task Force), la comunità che si occupa dell’elevoluzione tecnica e tecnologica di Internet, anche nel campo della sicurezza.

Per installare GnuGP sul proprio sistema Linux, è necessario innanzitutto controllare che questo non sia già disponibile; nei sistemi come Fedora, per esempio, questo potrà essere fatto digitando il seguente comando (le istruzioni presenti in questa guida verranno eseguite impersonando l’utente di root):

rpm -q gnupg

Se non si dovesse ricevere alcuna risposta si potrà procedere con l’installazione; in primo luogo si dovranno scaricare i sorgenti dell’applicazione, questi saranno disponibili sotto forma di archivio compresso in formato Tar.Gz2, che potrà essere scompattato all’interno della directory nella quale è stato scaricato con il seguente comando:

tar xvzf gnupg-x.x.x.tar.gz

A questo punto sarà possibile passare alla fase di configurazione digitando la semplice istruzione:

./configure

Se tutto dovesse andare per il meglio, si potrà passare alla fase successiva, cioè quella della compilazione che necessita del seguente comando:

make

nel caso in cui si dovessero verificare dei problemi relativamente ai percorsi sul sistema di riferimento, bisognerà lanciare l’istruzione:

make clean

e rieseguire i comandi "configure" e "make"; diversamente si potrà passare alla fase di installazione vera e propria digitando:

make install

di default il programma verrà installato sul percorso:

usr/local/share/gnupg/

Se la procedura d’installazione non dovesse dar luogo a problemi l’applicazione sarà finalmente utilizzabile.

3. Creazione delle chiavi di cifratura

Una volta installato GnuPG, per la creazione di una coppia di chiavi di cifratura, composta da una chiave pubblica e da una privata, è disponibile il seguente comando:

gpg --gen-key

a questo punto il sistema invierà una richiesta per scegliere l’algoritmo di cifratura desiderato, la notifica varia a seconda dei sistemi e degli algoritmi disponibili, ad esempio:

Please select what kind of key you want:
(1) DSA and Elgamal (default)
(2) DSA (sign only)
(5) RSA (sign only)

In questo caso l’algoritmo predefinito sarà il primo e si dovrà utilizzare quello in quanto gli altri due permettono unicamente di firmare. Effettuata la scelta, il prossimo passaggio richiederà di definire la lunghezza delle chiavi:

What keysize do you want? (2048)

La lunghezza delle chiavi può dipendere dalle esigenze dell’utilizzatore, in ogni caso sarà opportuno tenere conto che chiavi più lunghe garantiscono una maggiore sicurezza per i propri messaggi, nello stesso tempo però, necessitano di tempi di elaborazione più lunghi e, di conseguenza, di un maggior impiego di risorse dal parte del sistema. Una chiave creata con GnuPG richiede una lunghezza minima di 768 bit ma la lunghezza consigliata (proposta di default) è pari a 2048 bit; in mancanza di altri elementi per effettuare una scelta, è consigliabile comunque privilegiare l’aspetto della sicurezza.

La fase successiva richiederà di stabilire una data per la scadenza della chiave, di default l’applicazione consiglia di lasciare il valore su "0" (nessuna data di scadenza), in ogni caso sarà possibile revocare in seguito la chiave se questa non dovesse essere più utilizzata:

Key is valid for? (0)

Fatto questo si dovranno definire i nomi, gli indirizzi di posta elettronica e gli eventuali commenti da utilizzare per la costruzione delle chiavi, altre informazioni potranno comunque essere aggiunte in un secondo momento.

Il passaggio successivo richiederà la scelta di una password, o meglio, di una passphrase, che potrà contenere anche degli spazi bianchi al suo interno:

You need a Passphrase to protect your secret key?

Si consiglia di scegliere una frase più lunga possibile, con termini interrotti da spazi biachi, contenente anche caratteri speciali; si ricorda inoltre che è buona norma alternare lettere maiscole, minuscole e numeri nel caso si utilizzino caratteri alfanumerici. La passphrase non dovrà essere dimenticata in quanto la sua perdita determinerà anche la perdita della chiave generata che diventerà inutilizzabile.

Una volta effettuati tutti i passaggi richiesti in precedenza, il sistema comincerà la fase di generazione dele chiavi; in sistemi molto datati questa procedura potrebbe richiedere un periodo di tempo anche lungo. L’operazione di creazione delle chiavi si basa sulla raccolta di dati casuali, in questo modo una chiave non potrà essere uguale ad un’altra anche se questa è stata corredata con gli stessi nomi, indirizzi email e passphrase.

4. Gestione delle chiavi

Esportazione delle chiavi – Alla fine della procedura di generazione verrà mostrato l’identificativo univoco (UID) della chiave, ad esempio:

gpg: key AA15948 marked as ultimately trusted
public and secret key created and signed.

nel caso esposto l’UID è "AA15948", questo dato potrà essere utilizzato per indicare al sistema la chiave predefinita all’interno del file ~/.bashrc associandolo al comando –export, come nell’esempio seguente:

export GPGKEY=AA15948

In questo modo l’UID indicherà automaticamente quale chiave dovrà essere utilizzata di default nei programmi che si appoggiano su GnuPG per la cifratura dei dati. Una volta aggiunta la riga al file e riavviato il programma bisognerà eseguire il comando:

source ~/.bashrc

Per effettuare l’esportazione della chiave pubblica in formato binario su un file, sarà invece necessario associare il comando "export" al nome del file destinato a contenere l’output, ad esempio:

gpg --output secret.gpg --export AA15948

Importazione delle chiavi – L’esportazione della chiave pubblica consente di poter operare comunicazioni con un numero indefinito di utenti, essendo pubblica essa potrà essere messa a disposizione di chiunque, per esempio postandola sulla Home page del proprio sito Web. Chi dovesse ricevere una chiave pubblica non potrà utilizzarla prima di averla importata; le chiavi pubbliche sono in genere salvate in semplici file con estensione ".gpg" e per la loro importazione si dovrà utilizzare il comando –import, seguito dal nome del file, all’interno di un’istruzione come quella dell’esempio seguente:

gpg --import secret.gpg

Il sistema provvederà a comunicare se il procedimento di importazione ha avuto esito positivo, mentre con il comando:

gpg --list-keys

sarà possibile visualizzare la lista di tutte le chiavi importate o create all’interno del proprio sistema.

Revoca delle chiavi – Esattamente come è possibile creare delle chiavi, è possibile revocarle, cioè renderle inutilizzabili; in generale la revoca di una chiave privata può avvenire per i seguenti motivi:

  • si ritiene che la chiave non sia abbastanza sicura perché troppo corta;
  • si ritiene che la chiave non sia più sicura perché è finita in possesso di utenti non autorizzati;
  • si è dimenticata la relativa passphrase;
  • si desidera utilizzare una chiave associata ad un diverso UID.

Revocare una chiave è abbastanza semplice, bisognerà innanzitutto generare un certificato di revoca con un’apposita istruzione a cui associare l’UID del certificato da revocare, ad esempio:

# gpg --output revoke.key --gen-revoke AA15948

Il certificato di revoca dovrà quindi essere importato:

gpg --import revoke.key

A questo punto la chiave sarà revocata localemente, ma gli utenti che la utilizzano dovranno venirne a conoscenza; per far questo basterà informare l’apposito server di chiavi (keyserver) con la seguente istruzione:

gpg --send-keys -keyserver hkp://subkeys.pgp.net AA15948

Ora gli altri utenti riceveranno una notifica ogni volta che cercheranno di utilizzare la chiave revocata; l’ultimo passaggio sarà il cosiddetto "aggiornamento del portachiavi" che permetterà di effettuare un refresh delle chiavi disponibili:

gpg --refresh-keys --keyserver hkp://subkeys.pgp.net

Cancellazione delle chiavi – Oltre alla revoca, c’è anche la possibilità di cancellare una chiave in modo da renderne la rimozione definitiva, ciò può essere fatto tramite una semplice istruzione come la seguente, che prevede il comando –delete seguito dall’UID della chiave:

gpg --delete-secret-and-public-key AA15948

Per controllare che la chiave sia effettivamente cancellata, basterà effettuare un controllo con:

gpg --list-keys

e scorrere la lista per scoprire se il "portachiavi" di sistema è stato aggiornato.

5. Cifratura, decriptazione e firma

Il meccanismo di cifratura e decriptazione su "doppia chiave" non è particolarmente complesso, si tratta di un sistema che prevede infatti una cifratura di dati tramite chiave pubblica e di decriptazione tramite una chiave privata. Per efftuare la cifratura di una messaggio, GnuPG mette a disposizione l’apposito comando –encrypt; questa procedura sarà possibile solo per coloro che possiedono le chiavi pubbliche appartenenti ai destinatari.

GnuPG richiede il nome del file da cifrare come parametro di input, questo argomento potrà però essere omesso e in questo caso l’applicazione leggerà direttaemnte lo standard input:

gpg --output secret.gpg --encrypt --recipient [email protected] secret

Di default il risultato dell’operazione di cifratura verrà stampato all’interno dello standard output, in alternativa sarà possibile utilizzare l’opzione –output per indicare dove dovrà essere scritto il risultato. L’utilizzo dell’opzione –recipient sarà utilizzata una sola volta per ciascun destinatario e dovrà essere associata ad un argomento con cui specificare con quale chiave pubblica dovrà essere criptato il file. Curiosamente (ma si tratta di un accorgimento per incrementare il livello generale di sicurezza), non sarà possibile decifrare un file criptato dallo stesso utente se questo non abbia prima incluso la relativa UID nell’elenco dei destinatari.

Per poter decriptare un messaggio è disponibile l’opzione –decrypt ed è indispensabile essere in possesso della chiave privata tramite la quale è stato cifrato il testo:

gpg --output secret --decrypt secret.gpg

Una volta lanciata l’istruzione per la decriptazione, l’applicazione chiederà la digitazione della passphrase che dovrà esserre utilizzata per sbloccate la chiave segreta.

Come anticipato, è possibile certificare un determinato documento cifrato attraverso un’apposita procedura di firma, un pò come accade per la PEC (Posta Elettronica Certificata) che garantisce l’identità del mittente; la firma di un documento in formato digitale non solo impedisce i furti di identità, ma "timbra" un messaggio rendendone certa la data di firma; quindi, nel caso in cui il contenuto dovesse essere alterato in una data posteriore alla firma, la verifica della stessa avrà esito negativo.

Per i motivi elencati, la firma digitale può essere paragonata per utilizzo alla classica firma sui documenti cartacei, ma con un livello di sicurezza molto più elevato; si pensi che, ad esempio, gli stessi sorgenti di GnuPG vengono protetti con una firma digitale per consentire a chi ne viene in possesso di avere la sicurezza che essi non abbiano subito alterazioni.

Per la firma digitale di un documento esiste l’apposito comando –sign:

gpg --output secret.sig --sign secret

Per poter completare la procedura di firma, sarà necessario digitare anche la passphrase associata alla propria chiave; quindi sarà possibile controllare in qualsiasi momento sia l’autenticità della firma che la relativa data utilizzando l’opzione di decriptazione –decrypt in un’istruzione come la seguente:

gpg --output secret --decrypt secret.sig
Pubblicitร 
Claudio Garau
Claudio Garau
Web developer, programmatore, Database Administrator, Linux Admin, docente e copywriter specializzato in contenuti sulle tecnologie orientate a Web, mobile, Cybersecurity e Digital Marketing per sviluppatori, PA e imprese.

Leggi anche...

Autenticazione a due fattori (2FA): cos’è e come funziona

L'autenticazione a due fattori (in inglese Two Factor Authentication...

Authcode: cos’è e come funziona

Con il termine Authcode (o Auth-code) si fa riferimento...

HTTP Security Headers: aumentare la sicurezza del sito con .htaccess

Esistono diverse tecniche per innalzare il livello di sicurezza...

Criptare (e decriptare) file su Linux con OpenSSL

OpenSSL è un'implementazione rilasciata sotto licenza Open Source dei...

Cos’è una Botnet?

Con il termine botnet si fa riferimento ad una...

DDoS: cos’è, come funziona e come difendersi

Un DDoS (acronimo di Distribuited Denial of Service) รจ...
Pubblicitร