Introduzione

 

Le comunicazioni hanno sempre rivestito un ruolo molto importante nella storia dell' uomo.
Nella società odierna, lo scambio d'informazioni è divenuto il punto nevralgico di tutti i rapporti interpersonali.
Il continuo sviluppo tecnologico ha portato alla nascita di innumerevoli sistemi di comunicazione, che stanno velocemente sostituendosi ai più tradizionali mezzi.
Ormai la maggior parte dei documenti, scritti, messaggi, corrispondenza, etc... vengono realizzati, gestiti e scambiati mediante strumenti informatici che sono decisamente più comodi dei corrispondenti mezzi tradizionali, ma pongono tutta una serie di nuove problematiche.
Infatti uno dei problemi maggiori in cui si potrebbe incappare è la possibilità da parte di terzi di intercettare, ascoltare e modificare le informazioni, compromettendo in questo modo l'affidabilità del canale:

Fig. Canale insicuro


Da sempre si è sentito il bisogno di avere dei canali "sicuri" per le comunicazioni: la crittografiaGlossario è questione antica.

Gnu Privacy GuardGlossario(GnuPG) si colloca in questo scenario come uno strumento crittografico progettato per comunicare e immagazzinare dati in modo sicuro. Nasce in Germania nel 1997 per opera di Werner Koch come un sistema crittograficoGlossario alternativo a PGPGlossario totalmente open sourceGlossario che rispetta lo standard internet OpenPGP, descritto nella RFC 2440. Utilizza un sistema “ibrido”Glossario (simile a quello utilizzato da PGP) con l’utilizzo combinato di algoritmi simmetrici (crittografia tradizionaleGlossario) e asimmetrici (crittografia a chiave pubblicaGlossario).
GnuPG supporta molti sistemi operativi tra cui i principali sono Linux, FreeBSD, OpenBSD, NetBSD, Windows 95/98/NT/2000/ME/XP e MacOS X. L’utilizzo avviene tramite linea di comando, ciò vuol dire che per utilizzarlo è necessario digitare una serie di comandi sul prompt di sistema, un po’ come avveniva nei vecchi sistemi MsDos. Esistono, tuttavia, anche dei front-end grafici che consentono di utilizzare il software in maniera più intuitiva, come il GPA Privacy Assistant per sistemi Gnu/Linux basato sulle librerie GTK o il WinPT per sistemi Microsoft Windows.
Inoltre sono stati realizzati dei plug-in per integrare GnuPG nei più conosciuti client di posta elettronica come Eudora, Microsoft Outlook, Mutt, Pine e sistemi quali Mozilla, MacGPG e così via.
Nel corso della trattazione introdurremo la crittografia in generale soffermandoci in particolare sulla crittografia simmetrica e asimmetricaGlossario analizzandone gli aspetti principali. Dopodichè faremo una breve panoramica su PGPGlossario per poi introdurre finalmente che cosa è GnuPGGlossario. Analizzeremo come avviene la cifratura e la decifratura in GnuPGGlossario e in che modo sia possibile apporre firme digitaliGlossario ai documenti. Illustreremo, a questo punto, gli algoritmi supportatiGlossario e in particolare vedremo la cifratura e firma con ElGamalGlossario e la firma con DSAGlossario. Spiegheremo, di seguito, il modello utilizzato per la convalida delle chiavi noto come Web of TrustGlossario, confronteremo GnuPG e PGP evidenziandone le differenzeGlossario. Infine mostreremo i passi da seguire per l'installazioneGlossario e i comandi principali per l'usoGlossario di GnuPG.

 

 

 

 

 

 

 

 

Crittografia

 

Era utilizzata spesso in contesti di guerra per permettere comunicazioni sicure tra le truppe ma il suo odierno utilizzo è sicuramente meno bellicoso e tocca la sfera della riservatezza personale tramite le odierne comunicazioni telematiche.
Tuttavia la sua importanza in ambito militare e strategico ha portato, nel corso degli anni, allo sviluppo di tecniche sempre più complesse che utilizzano algoritmi derivanti dalle più avanzate conoscenze matematiche. Nella figura seguente sono riportati alcuni tra i più importanti sistemi crittografici della storia, ulteriori informazioni è possibile reperirle qui:

Fig. La Crittografia nella storia


Con la progressiva crescita di complessità degli algoritmi, si è arrivati anche a definire alcuni requisiti di base che qualsiasi sistema crittografico
Glossario deve soddisfare affinché possa essere considerato sufficientemente robusto (cioè difficilmente attaccabile da tentativi di crittoanalisiGlossario da parte del nemico): uno di questi requisiti è che la robustezza del sistema non deve dipendere dalla segretezza dell'algoritmo (il cosiddetto principio di Kerckhoff ). Questo perchè, come illustrato nella seguente figura, è possibile effettuare Reverse Engineering ripercorrendo al contrario i passi effettuati durante lo sviluppo di una applicazione: Analisi dei Requisiti, Disegno e Implementazione.

Fig. Reverse Engineering

Nel settembre del 1995, due studenti dell'università di Berkeley, Ian Goldberg e David Wagner, riuscirono a rompere lo schema del generatore dei numeri casuali di Netscape effettuando reverse-engineering  (ulteriori informazioni sono reperibili qui).

 

 


Crittografia a chiave Simmetrica e a chiave Asimmetrica

 

Nella crittografiaGlossario tradizionale viene utilizzata un unica chiaveGlossario (sia per codificare, sia per decodificare i messaggi) che deve essere concordata precedentemente, mediante un "canale sicuro". Di seguito sono illustrati i passi da seguire per inviare un messaggio quando si utilizza un algoritmo simmetrico (nella seguente figura assumiamo che Biagio invia il messaggio ad Annarella):

Fig. Crittografia a chiave simmetrica


La crittografia a chiave pubblica, invece, permette a due (o più) persone di comunicare in tutta riservatezza anche se non si sono mai incontrate prima e dunque non è mai stata concordata alcuna chiave di codifica.
La crittografia a chiave pubblica si basa su una coppia di chiavi: una chiave pubblica e una chiave privata. La chiave pubblica serve per codificare il messaggio, mentre quella segreta serve per decodificarlo (come se una cassaforte avesse due chiavi distinte, una usata per aprirla e una per chiuderla). Di seguito sono illustrati i passi da seguire per scambiarsi un messaggio quando si utilizza un algoritmo asimmetrico:

Fig. Crittografia a chiave asimmetrica


La differenza rispetto alla crittografia tradizionale sta dunque nel fatto che adesso non è più necessario trovare un luogo sicuro nel quale vedersi e scambiarsi la chiave di codifica/decodifica, in quanto anche nel caso in cui la chiave pubblica venisse intercettata non ci sarebbe assolutamente nessuna conseguenza per la sicurezza: le chiavi pubbliche che viaggiano liberamente in rete possono solo crittare e non decrittare i messaggi.
Un altro utilizzo dei cifrari a chiavi asimmetriche è quello di firmare documenti digitaliGlossario. Per fare ciò la chiave privata verrà usata per firmare (cifrare) mentre la chiave pubblica per verificare (decifrare).

 

 

 


PGP

Uno dei software che è divenuto molto famoso nell’ultimo decennio in tema di crittografiaGlossario è il PGP (Pretty Good Privacy)Glossario, sviluppato da Phil ZimmermannGlossario nel 1991.

È un software di crittografia per la posta elettronica e la protezione dei file di uso personale che consente di firmare una e-mail lasciando il testo in chiaro, oppure cifrarla senza firmarla, o fare tutte e due le cose insieme.

L'interesse suscitato da questo strumento attirò a sé moltissimi interessati, ma scatenò sull'autore l'ira del governo statunitense visto che i sistemi di cifratura forte sono assimilati alle armi e fino ad alcuni anni fa ne era quindi proibita l'esportazione.
Copie di PGP vennero scaricate all'estero poche ore dopo la messa on-line del programma; il risultato fu che nel 1993 Zimmerman venne messo sotto inchiesta, con la prospettiva di pesanti sanzioni penali. Dopo tre anni la vicenda si concluse senza esiti negativi per la propria persona.

Il Dipartimento della Giustizia chiude il caso Zimmermann
      Edizione del mattino - Gennaio 12, 1996
      National Public Radio, Washington DC

 

Questa improvvisa popolarità di PGP calamitò l'attenzione di diverse software house e Zimmermann, probabilmente stravolto dalle questioni giudiziarie e intrigato da proposte commerciali, non perse tempo a vendere i diritti di PGP. Il programma comunque, anche se con notevoli limitazioni nell'utilizzo, rimane gratuito per uso personale e non commerciale.




 

 

 

 

 

GnuPG

 

 

Cos'è GnuPG

 

Gnu (acronimo ricorsivo di "GNU's Not Unix") Privacy Guard (GnuPGGlossario) è uno strumento per comunicare in modo sicuro nato in Germania nel 1997 per opera di Werner Koch, uno sviluppatore indipendente interessato alla crittografiaGlossario open sourceGlossario. GnuPG è un sistema crittografico che permette la cifratura/decifratura e autenticazione di messaggi. La cifratura/decifratura si basa su un sistema “ibrido”Glossario simile a quello usato da PGP con l’utilizzo combinato di algoritmi simmetrici (crittografia tradizionaleGlossario) e asimmetrici (crittografia a chiave pubblicaGlossario), ma non preclude la possibilità di cifrare/decifrare anche solo con algoritmi simmetrici. L'autenticazione di documenti o dei messaggi avviene attraverso l'utilizzo delle firme digitali.

GnuPG supporta molti sistemi operativi tra cui i principali sono Linux, FreeBSD, OpenBSD, NetBSD, Windows 95/98/NT/2000/ME/XP e MacOS X. E' possibile utilizzarlo anche su altri sistemi operativi come: AIX, BSDI , HPUX, IRIX, MP-RAS, OSF1, OS/2, SCO, SunOS, Solaris, USL Unixware, ma a causa della mancanza di una sorgente di entropia ben testata, dovrebbe essere usato con cautela.
L’utilizzo di GnuPG avviene tramite linea di comando, ciò vuol dire che per utilizzarlo è necessario digitare una serie di comandi sul prompt di sistema, un po’ come avveniva nei vecchi sistemi MsDos.
Esistono, tuttavia, dei front-end grafici che consentono di utilizzare il software in maniera più intuitiva, come il GPA Privacy Assistant per sistemi Gnu/Linux basato sulle librerie GTK o il WinPT per sistemi Microsoft Windows.
Inoltre sono stati realizzati dei plug-in per l'integrazione con i più conosciuti client di posta elettronica come Eudora, Microsoft Outlook, Mutt, Pine e sistemi quali Mozilla, MacGPG e così via.

Il cuore della gestione delle chiavi presente in GnuPG è la nozione di firma di chiaviGlossario. Tale nozione è utilizzata anche in uno schema noto come "Web of Trust"GlossarioGlossario (rete della fiducia), la quale estende la certificazione delle chiavi non firmate di proprio pugno. Infatti la convalida di una chiaveGlossario può esser fatta da qualcun’altro di cui ci si fida.

GnuPG consente ad un utente di possedere una coppia di chiavi primaria e zero o più coppie di sottochiavi addizionali. La sottochiave può essere una chiave di firma DSA, una chiave di sola cifratura ElGamal, una di firma RSA oppure una di cifratura RSA.

Avere più di una sottochiave può essere utile in quanto gli User ID associati alla propria chiave pubblica principale vengono convalidati dalle persone con le quali si comunica. Cambiare la chiave primaria necessita, quindi, una ricertificazione ma ciò potrebbe risultare difficile e dispendioso.
D'altro canto è opportuno cambiare periodicamente le chiavi di cifratura per migliorare la sicurezza, se infatti una chiave viene compromessa, tutti i dati criptati con quella chiave saranno vulnerabili. Cambiando chiave invece, solo i dati cifrati con la chiave compromessa saranno rivelabili.

Utilizzando le sottochiavi cambiare una chiave risulta più semplice poiché queste sono autofirmate con la propria chiave di firma principale all'atto della generazione. Non è necessario, quindi, farsi riconvalidare la nuova chiave da tutti gli altri utenti.

La coppia di chiavi primaria e le sottochiavi sono raggruppate assieme per facilitarne la gestione nel portachiavi (spesso considerato semplicemente come un’unica coppia di chiavi).

Attualmente, sulla scia del successo di GnuPG, stanno nascendo molti altri progetti crittografici open source basati su questo software, come il GPGME (GnuPG Made Easy, un sistema API crittografico riservato agli sviluppatori per la realizzazione di applicazioni basate sulla crittografia a chiave pubblica) o come il progetto GNUTLS (un’implementazione alternativa del protocollo di comunicazione TLS/SSL con licenza GPLGlossarioGlossario).

 

 

 

 

 

Cifratura e decifratura in GnuPG

 

GnuPGGlossario fa uso di diversi concetti di crittografiaGlossario come algoritmi simmetrici, algoritmi a chiave pubblica, e hashingGlossario Oneway.
Gli algoritmi asimmetrici non sono una soluzione ideale poiché le operazioni di cifraturaGlossario e decifraturaGlossario a chiave pubblica sono molto più costose delle corrispondenti operazioni sui 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 (nota:
la sicurezza di un algoritmo ibrido non è mai più forte del più debole algoritmo utilizzato).

 

 

 

 

 

 

Modalità Ibrida

Sia PGPGlossario che GnuPG possono utilizzare algoritmi ibridi. In particolare GnuPG funziona utilizzando l'algoritmo asimmetrico ElGamalGlossario per condividere una chiaveGlossario che sarà utilizzata nel sistema simmetrico scelto (RIJNDAEL, 3DES, BLOWFISH...Glossario).

Fig. Cifrare in GnuPG

 

 

Fig. Decifrare in GnuPG


Il messaggio viene quindi criptato usando tale chiave, detta chiave di sessioneGlossario, e successivamente spedito al destinatario.
La chiave di sessione (criptata utilizzando l’algoritmo a chiave pubblica/privataGlossario) e il messaggio da spedire (cifrato con l’algoritmo simmetricoGlossario) 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.
Se un malintenzionato riuscisse a 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 l'attacco e decifrare un’altra chiave di sessione per poter leggere un altro messaggio.

 

 

Modalità Simmetrica

I documenti posso anche essere criptati senza l'utilizzo della crittografia a chiave pubblica. Al suo posto è possibile utilizzare un algoritmo di crittografia simmetrico per cifrare il documento. Con la cifratura a chiave simmetrica, un documento può essere cifrato con una chiave simmetrica derivata dal passphrase fornita al momento in cui il documento viene criptato, o mediante un meccanismo a due fasi simile al metodo ibrido descritto sopra, con l'unica differenza che la chiave di sessione è anch'essa cifrata con un algoritmo di cifratura simmetrico usando una chiave segreta condivisa.

Per una buona sicurezza, la passphrase utilizzata non dovrebbe essere la stessa usata per proteggere la propria chiave privata. Ovviamente la passphrase deve essere conosciuta anche dalla nostra controparte, per poter decifrare il messaggio. La cifratura simmetrica è anche utile per rendere sicuri i propri documenti su disco tenendo segreta la passphrase usata.
 

 

 

Generazione di chiavi simmetriche

Possiamo dividere le chiavi simmetriche usate da GnuPG in due categorie:

- chiavi di sessione
- chiavi simmetriche derivanti da passphrase

Le chiavi di sessione usate da GnuPG sono generate come numeri random e sono differenti per ogni messaggio.
Queste sono usate per la cifratura simmetrica dei messaggi e poi a loro volta sono cifrate o con chiave pubblica del destinatario (modalità ibrida) o con un'altra chiave simmetrica derivante dal passphrase (cifratura simmetrica a due fasi). Il pacchetto con la chiave di sessione cifrata viene anteposto al pacchetto con i dati cifrati e il tutto è spedito al destinatario.

Le chiavi simmetriche derivanti da passphrase sono ottenute applicando alla passphrase una particolare funzione chiamata
String-to-key (s2k).
La funzione s2k effettua varie operazioni sul passphrase come l'aggiunta di dati random e l'applicazione di una funzione hash, su più iterazioni, fino ad ottenere la chiave simmetrica. Tutti i dati che occorrono per la decifratura sono memorizzati in un particolare campo (anteposto alla chiave cifrata) detto specificatore S2K.

 

 

Modalità di cifratura simmetrica

GnuPG effettua la cifratura simmetrica usando una variante del Cypher Feedback Mode (modalità CFB). In questa modalità viene usato un vettore di inizializzazione (IV) avvalorato con tutti zero, il testo in chiaro viene fatto precedere da 10 ottetti di cui i primi 8 sono random e il 9° e 10° sono uguali al 7° e al 8°:

Fig. Variante CFB

 

La ripetizione di 16 bit negli 80 che precedono il testo in chiaro permettono a chi decifra il messaggio di controllare immediatamente se la chiave di sessione è corretta.
Questa variante del CFB fa uso di un CFB shift pari a 8 ottetti (64 bit) che rappresenta anche la lunghezza del blocco usato dall'algoritmo di cifratura.
La cifratura e la decifratura avvengono secondo i seguenti algoritmi:

 

Fig. Cifratura/Decifratura con variante CFB

 

Dove R1 rappresenta i primi 8 ottetti e R2 sono gli ultimi 2 ottetti che precedono il testo in chiaro; P1,P2,...,Pk rappresentano i blocchi di 64 bit del testo in chiaro; εk(.) rappresenta l'applicazione dell'algoritmo di cifratura scelto usando la chiave k. La notazione X[i,i+1] rappresenta rispettivamente l' (i)-esimo e l' (i+1)-esimo byte di un blocco di dati X per 0 £ i £ 7, mentre X[i-j] rappresenta  l'intervallo  dal (i)-esimo all' (j)-esimo byte  di un blocco di dati X per 0 £ i £ j £ 7. Il simbolo ' ° ' è l'operatore di concatenazione, mentre il simbolo ' Å ' è l'operatore logico or esclusivo (XOR). C1 rappresenta il 1° blocco di 64 bit di dati cifrati;  C2 rappresenta il 2° blocco di dati cifrati di 16 bit, mentre Ci per 3 £ i £ k+2 rappresenta l' i-esimo blocco di 64 bit di dati cifrati.

 

 

 

Firma Digitale in GnuPG

 

Una firma digitale è un valore calcolato con un algoritmo crittograficoGlossario apposto ad un data object che deve godere delle seguenti proprietà:

Un sistema di firma digitale deve garantire due importanti proprietà:

  1. E' difficile trovare due documenti che possiedono la stessa firma digitale
  2. Data una firma è difficile recuperare il documento che l' ha prodotta

E' possibile apporre una firma digitale a un documento utilizzando gli algoritmi a chiave pubblica/privataGlossario e funzioni hashGlossariocome illustrato in figura:

Fig. Firmare in GnuPG

 

Per generare la firma, quindi, calcoliamo l'hash del documento che verrà poi cifrato usando la chiave privata del firmatario.

Il documento firmato può essere spedito usando qualsiasi altro algoritmo di cifraturaGlossario o nessuno se si tratta di un documento pubblico.

Chiunque volesse verificare la firma può utilizzare la corrispondente chiave pubblica nel seguente modo:

 

Fig. Verificare una firma in GnuPG



Il Digital Signature Algorithm (DSAGlossario) è un algoritmo per la firma a chiave pubblica che funziona come appena descritto e rappresenta l’algoritmo principale usato da GnuPGGlossario per firmare documentiGlossario.

 

 

 

Algoritmi ulilizzati in GnuPG

 

GnuPg è molto versatile, infatti ci consente di scegliere tra una vasta gamma di algoritmi da utilizzare per le diverse operazioni che possiamo compiere (cifratura della chiave di sessioneGlossario, cifratura dei messaggi, firma dei messaggi).

Gli algoritmi supportati sono :

 

 

ELG-E
(ElGamal-Encryption only)
RSA-E
(RSA-Encryption only)
RSA-S
(RSA-Signature only)

 

 

 

E' possibile impostare l'algoritmo simmetricoGlossario e la funzione hashGlossario da utilizzare di default mediante le opzioni --cipher-algo, --digest-algo rispettivamente (l'algoritmo asimmetrico da utilizzare viene richiesto all'atto della generazione della chiave). Non usando tali opzioni, gli algoritmi scelti saranno quelli preimpostati di GnuPG che variano a seconda della versione utilizzata.

GnuPG implementa molte delle parti opzionali dello standard OpenPGP (descritto nella RFC 2440) ma è importante tenere presente che non tutti i programmi OpenPGP implementano tali parti opzionali. Forzando, dunque, l'utilizzo di determinati algoritmi (con le opzioni indicate sopra) è possibile creare un messaggio OpenPGP perfettamente valido ma non leggibile dal destinatario.

E' consigliabile, piuttosto, utilizzare le opzioni --personal-cipher-preferences e --personal-digest-preferences,  che servono a modificare la lista degli algoritmi che il possessore della chiaveGlossario preferirebbe usare. In particolare, in questa lista sono indicati gli algoritmi simmetrici e le funzioni hash in ordine di preferenza.

Una implementazione di OpenPGP non deve usare un algoritmo che non è nella lista delle preferenze del destinatario. Quando si cifra, l'algoritmo scelto è quello di più alto rango nell'intersezione tra la lista di preferenze del destinatario e la lista del mittente. Se l'intersezione è vuota allora l'algoritmo utilizzato sarà il 3DES, che tutti i programmi che aderiscono allo standard OpenPGP devono implementare.

N.B.

Quando si firma, la scelta della funzione hash è fatta da chi firma piuttosto che chi verifica (perchè chi firma tipicamente non sa chi verificherà la firma). Tuttavia se Annarella sta firmando un oggetto per Biagio ha senso che utilizzi una funzione hash preferita da Biagio. Quindi la lista delle preferenze di Biagio indica ad Annarella quali funzioni hash potrebbe usare.

 

 

Cifratura e Decifratura con ElGamal

Più vicino dello stesso RSA rispetto all’impostazione di Diffie ed Hellman è lo schema proposto da Taher ElGamal nel 1985 nella pubblicazione "A Public key Cryptosystem and A Signature Scheme based on discrete Logarithms". Tale schema, in seguito, divenne la base per il "Digital Signature Algorithm" (DSA) adottato dal "National Institute of Standards and Technology" (NIST) come Digital Signature Standard (DSS).

 

Taher Elgamal

 

 

 

 

 

 

 

Generazione chiave pubblica e privata

In ElGamal ciascun interlocutore opera nel seguente modo:

La chiave pubblica sarà costituita dalla tripla (p,g,Kpub).

 

Generazione del numero primo

In ElGamal i numeri primi vengono generati seguendo l'algoritmo basato sui suggerimenti proposti da Chae Hoon Lim e Pil Joong Lee in Crypto '97 (pag. 260). Nell'articolo, i due studiosi hanno presentato un attacco di "key recovery" che potrebbe rivelare parti o, in molti casi, l'intera chiave segreta di molti schemi basati sul problema del logaritmo discreto. E' possibile contrastare questo attacco aggiungendo esplicitamente dei passi di controllo, tuttavia, tali controlli diminuiscono l'efficienza dell'algoritmo.
E' preferibile perciò utilizzare dei numeri primi sicuri
Glossario oppure un primo p tale che ogni fattore primo di (p-1)/2q è più grande di |q|. Questi ultimi, in particolare, risultano essere molto più veloci da generare e sembrano essere forti (contro gli attacchi conosciuti) quanto i primi sicuri.

Per generare un primo p tale che p=2qp1+1, prima bisogna scegliere un primo casuale p1 di lunghezza |p|-|q|-1 e poi, provando per dei primi q (di grandezza |q|) scelti a caso, verificare che p=2qp1+1 sia primo. Quindi è necessario generare un certo numero di primi q per trovare un primo p; considerando che il numero di primi nell'intervallo [1,x] (dove x è un intero maggiore di zero) è asintotico a x/lnx (Teorema dei numeri primi), se calcoliamo casi favorevoli su casi possibili, la probabilità di scegliere in maniera casuale un numero primo è 1/lnx (quindi per generare un primo p di 1024 bit occorrono circa 710 primi q). Fortunatamente, cercare i numeri primi q, non richiede molto tempo poiché la grandezza di q è abbastanza piccola se comparata con quella di p (in genere q è grande 160 bit mentre p è 768 bit).
Utilizzando questa idea, risulta più efficiente generare un primo p della forma p=2*q*p1*...*pn+1, dove i pi sono dei primi di grandezza maggiore (o al più uguale) a |q|. Il numero di pi necessari e la loro grandezza la si determina risolvendo la disuguaglianza seguente:
L=|pi|≈(|p|-|q|-1)/n≥|q|.

A questo punto si genera un pool di m numeri primi di lunghezza L da cui verranno scelti gli n pi. Si hanno, quindi, il coefficiente binomiale di m su n candidati per p. Considerando la densità dei primi è possibile rendere questo numero grande a sufficienza per garantire che ci siano sufficienti probabilità affinché un primo p sia generato da questo pool. Per esempio, per un primo p di 1024 bit e q di 200 bit è possibile scegliere  L=206 bit, n=4 e m=18 così da avere circa 3000 candidati per p che ci assicurano con alta probabilità il successo dell'algoritmo.

Dunque, seguendo i suggerimenti proposti nell'articolo dai due studiosi, i passi da eseguire sono i seguenti:

  1. Genera un numero primo q di 160, 200 o 240 bits rispettivamente per le chiavi di lunghezza 768, 1024, 2048 bits
  2. Calcola il numero n di fattori primi necessari e ne sceglie la lunghezza che deve essere almeno pari a quella di q
  3. Crea un pool di numeri primi (la cui dimensione di default è m=3n+5) ognuno della lunghezza determinata al passo 2
  4. Ottiene una nuova permutazione dal pool (p1, ... ,pn), se si sono analizzate tutte le permutazioni torna al passo 3
  5. Calcola un candidato ad essere eletto numero primo come p=2*q*p1*...*pn+1
  6. Controlla che il candidato sia della lunghezza desiderata (questo può cambiare q se sembra non essere possibile generare un primo della lunghezza desiderata)
  7. Controlla se il candidato è effettivamente un primo usando le divisioni banali e il test di Miller-Rabin
  8. Se è un primo vai al passo 9, altrimenti vai al passo 4
  9. Ricerca un generatore per il gruppo ciclico Zp* di ordine p-1 utilizzando la fattorizzazione ricavata per costruzione al passo 5

 

Ricerca del generatore di un gruppo ciclico Zp*

L'algoritmo per cercare un generatore prende in input il gruppo ciclico Zp* di ordine p-1 e la scomposizione in fattori primi di p-1=p1e1*p2e2....*pkek.
Osserviamo che tale scomposizione è ottenuta dal passo 5 dell'algoritmo per la generazione del numero primo e risulta uguale a: p-1=2*q*p1*...*pn
.

L'algoritmo opera nel seguente modo:

  1. sceglie un elemento a caso g Î Zp*
  2. for i from 1 to k do
  3.     calcola b ¬ g(p-1)/pi
  4.      if b=1 then vai al passo 1
  5. return (g)
     

Cifratura

La cifraturaGlossario di un messaggio è un’operazione un po’ più complessa rispetto a quella effettuata mediante RSA, infatti se Biagio vuole inviare un messaggio ad Annarella, posto che (p,g,KpubA) sia la tripla dei valori pubblici di Annarella (calcolate secondo i passi specificati sopra), deve effettuare le seguenti operazioni:

 

Decifratura

Annarella per decifrare il messaggio C deve effettuare le seguenti operazioni:

dp-1-Kprvmodp =dp-1*d-Kprvmodp

Poichè gÎZp* è possibile applicare il teorema di Eulero che dice:

XÎZn*ÞXf(n)º1modn

quindi

dp-1º(g d)p-1modpº1modp

allora

(dp-1*d-Kprv)modp=(1*d-Kprv)modp= (gd)-Kprvmodp=((gKprv)d)-1modp

dimostrando che dp-1-Kprvº((gKprv)d)-1modp

 

 

(dp-1-Kprv*e)modp=(((g Kprv )d)-1*M*(g Kprv )d)modp 

 

 

 

 

 

 

Vengono combinati insieme 5 ingredienti :

  • Numero Primo p
  • Generatore g
  • Chiave pubblica KpubA
  • Numero casuale d
  • Messaggio M

Viene generata la coppia (d,e) che rappresenta il messaggio cifrato C
 

  Il messaggio C viene inviato tramite un qualsiasi mezzo di comunicazione

Il destinatario del messaggio C utilizza il numero primo p e la sua chiave privata Kprv per decifrarlo
 

 

Sicurezza

La sicurezza del sistema di ElGamal si basa sulla complessità del calcolo del logaritmo discreto. Infatti pur conoscendo la tripla di valori pubblici (p,g,gKprvmodp) ricavare da essa la chiave privata Kprv significherebbe risolvere Kprv=logg,p(gKprvmodp) e inoltre, anche se noti i valori p,g e d=gdmodp, non è facile calcolare d poiché bisognerebbe risolvere logg,p(gdmodp).

Quindi rompere l'algoritmo di ElGamal equivale a risolvere efficientemente tale problema.

 

 

 

 

 

 

 

 

Firma con ElGamal

 

L’algoritmo proposto da ElGamal per la firma digitale è alquanto diverso da quello già citato destinato alla cifraturaGlossario.

 

Generazione chiave pubblica e privata

Per generare la chiave pubblica e privata, come nell'algoritmo di cifratura occorre effettuare le seguenti operazioni:

La chiave pubblica sarà costituita dalla tripla (p,g,Kpub).

 

Firmare un documento

Supponiamo che Biagio voglia firmare un documentoGlossario D (D in realtà è l'hash del documento, come spiegato nella sezione firma digitaleGlossario), le operazioni da eseguire sono le seguenti:

v=(D-(k*u))*d-1mod(p-1)

 

Verifica firma

Posto che (p,g,Kpub) sia la tripla dei valori pubblici di Biagio, allora Annarella verifica la firma (u,v) del documento D, controllando che la seguente congruenza sia valida :

gDº(Kpubu*uv)modp

 

Firmare con ElGamal

Vengono combinati insieme 5 ingredienti :

  • Numero Primo p
  • Generatore g
  • Chiave privata KprvA
  • Numero casuale d
  • Documento D
 

  Viene generata la coppia (u,v) che rappresenta la firma del documento D

Colui che è interessato al documento D, verifica la validità della firma (u,v) utilizzando il numero primo p, il generatore g e la chiave pubblica KpubA
 

 

Sicurezza

La sicurezza del sistema è basata sul fatto che la determinazione di una coppia di valori (u,v) che soddisfi la precedente equazione richiede la soluzione del problema del logaritmo discreto nel caso in cui si fissi u e si cercasse di determinare v di conseguenza; nel caso opposto, ossia fissando v e cercando di calcolare u, si incappa in una congruenza esponenziale mista per la quale non sono noti algoritmi efficienti di soluzione.

 

 

 

 

 

Firma con DSA

Il Digital Signature Algorithm (DSA) è l' algoritmo principale a chiave pubblica usato da GnuPGGlossario per firmare documentiGlossario.
L'algoritmo DSA utilizza la funzione hashGlossario SHA1 sia per la generazione di chiavi pubbliche e private, sia per la generazione e la verifica di firme digitali, fornendo un output di 160 bit.

 

Generazione delle chiavi

Per generare la chiave pubblica e privata, occorre effettuare le seguenti operazioni:

La quintupla di valori generati (p,q,a,b,s) viene utilizzata per ricavare la chiave pubblica e la chiave privata. In particolare la chiave pubblica è data dai valori (p,q,a,b,s), mentre la chiave privata dai valori (p,q,a,s).

 

Generazione della firma

La firma del messaggio M è una coppia di numeri (g,d) calcolati secondo i seguenti passi.

Quindi F=sigK(M,r)=(g,d)

 

Procedura di verifica

Per verificare la firma F=(g,d) del messaggio M, si deve conoscere la chiave pubblica (p,q,a,b) di chi ha generato la firma.

Ecco i passi:

 

 

 

 

 

 

Rete di fiducia

(Web of Trust)

 

Un punto debole degli algoritmi a chiave pubblica è la diffusione delle chiavi: un malintenzionato potrebbe manomettere il portachiaviGlossario di un utente oppure spacciarsi per qualcun'altro facendo circolare una falsa chiave pubblica per un certo UserID. L'impostore potrebbe, a questo punto, intercettare e decifrare il messaggio, successivamente cifrarlo con la vera chiave pubblica del destinatario originale e inviarglielo, senza che quest'ultimo si renda conto dell'intercettazione.

Ad esempio, supponiamo che il malintenzionato voglia tenere sotto controllo i messaggi che Biagio spedisce ad Annarella. Il diavoletto crea una nuova coppia di chiavi pubblica/privata e rimpiazza la copia della chiave pubblica di Annarella in possesso di Biagio con la nuova chiave pubblica. Successivamente si mette ad intercettare i messaggi che Biagio spedisce ad Annarella. Ogni messaggio intercettato viene decriptato utilizzando la nuova chiave privata e recriptato usando la vera chiave pubblica di Annarella per poi inviarglielo. Tutti i messaggi spediti da Biagio ad Annarella possono ora essere letti dal diavoletto. Questo tipo di attacco prende il nome di man in the middle ed è illustrato nella seguente figura:

Fig. Man in the Middle


La soluzione adottata da GnuPGGlossarioGlossario (e anche dal PGPGlossario) è la firma delle chiavi: una chiave pubblica può essere firmata da altre persone, certificando così che la chiaveGlossario appartiene veramente alla persona che sostiene di esserne il proprietario (convalida della chiaveGlossarioGlossario).
Una chiave viene convalidata verificando l’impronta digitale della chiave stessa e successivamente firmando la chiave per certificarla come chiave valida.
L’impronta digitale di una chiave può essere velocemente visualizzata con il comando gpg --fingerprintGlossario, questa va verificata con il possessore di quella chiave.
Ciò può essere fatto di persona, per telefono o attraverso un qualsiasi altro mezzo con il quale sia possibile garantire che si sta comunicando con il vero possessore della chiave (canale sicuro).
Se l’impronta digitale che si ottiene eseguendo il comando è la stessa impronta digitale che il possessore della chiave detiene, allora si può essere sicuri di possedere una corretta copia della chiave. Dopo aver controllato l’impronta digitale, si può procedere alla firma in modo da convalidarla.
Sfortunatamente questa procedura risulta antipatica quando, per qualche motivo, si debba convalidare un gran numero di chiavi o comunicare con persone che non si conoscono direttamente.
GnuPG risolve questo problema con un potente e flessibile modello basato sulla fiducia, noto come Web of TrustGlossario (rete della fiducia), il quale non richiede all’utente di convalidareGlossario personalmente ogni chiave che viene importata. Una notazione grafica comunemente usata per rappresentare la "rete della fiducia" è quella dei grafi orientati. In tale notazione, ogni nodo rappresenta una coppia (userID, chiave pubblica) mentre, gli archi orientati specificano le firme apposte dall'utente associato alla userID del nodo origine sulle chiavi indicate nei vari nodi destinazione. Ad esempio, il grafo seguente mostra la firma apposta da Annarella sulla chiave pubblica di Biagio:

N.B.

negli esempi che seguiranno useremo sempre la convenzione di omettere le chiavi pubbliche dai nodi.

La rete della fiducia, quindi, descrive le relazioni di fiducia esistenti tra un gruppo di chiavi. I cammini che si possono individuare nel grafo associato al Web of Trust prendono il nome di Trust Paths (percorsi di fiducia).

 

Vediamo ora in dettaglio il funzionamento del "Web of Trust". In tale modello la responsabilità di convalidare le chiavi pubbliche è delegata a persone di cui ci si fida. Ad ogni chiave GnuPG assegna un valore, noto come "fiducia nel proprietario" (ownertrust), per esprimere quanta fiducia si ha nel possessore di quella chiave per quanto riguarda la firma di altre chiavi. Così, se non si ha fiducia nel proprietario di una chiave, le eventuali firme apposte da quest’ultimo su un'altra chiave verranno ignorate durante il calcolo del valore di validità della chiave.

Un possessore di chiavi, in questo modello, può essere collocato in uno dei seguenti livelli di fiducia:

  • Sconosciuto
non c’è nessuna informazione sul giudizio che il possessore della chiave ha nel firmare altre chiavi
  • Nessuna
il possessore non firma opportunamente le chiavi degli altri
  • Marginale
il possessore capisce le implicazioni che comporta firmare una chiave ed è capace di convalidare le chiavi propriamente prima di firmarle
  • Piena
il possessore ha un'eccellente comprensione di ciò che comporta firmare una chiave e la sua firma su una chiave è tanto valida quanto la propria

La fiducia che si possiede verso il possessore di una chiave può essere impostata tramite l'editor delle chiavi di GnuPG con il comando trust (per ulteriori informazioni vedere la sezione "Installazione e UsoGlossario"). Le informazioni sulla fiducia non sono immagazzinate negli stessi file che contengono le chiavi, ma in un file separato (trustdb.gpg).

Anche alle chiavi sono associati degli analoghi livelli che ne stabiliscono la loro validità:

  • Sconosciuto
non c’è nessuna informazione sulla validità della chiave pubblica (le chiavi del proprio portachiaviGlossario che non siano le proprie hanno inizialmente questo livello di fiducia)
  • Nessuna
la chiave pubblica non appartiene alla persona che sostiene di esserne il proprietario
  • Marginale
la chiave pubblica potrebbe appartenere alla persona che sostiene di esserne il proprietario
  • Piena
la chiave pubblica appartiene veramente alla persona che sostiene di esserne il proprietario



L'algoritmo utilizzato dal modello Web of Trust considera una chiave K pienamente valida (cioè con validità piena) se soddisfa le due seguenti condizioni:

  1. è firmata da un numero sufficiente di chiavi valide, cioè
  1.  

è stata firmata personalmente, oppure

  1.  
è stata firmata da una persona di cui ci si fida pienamente con una chiave pienamente valida, oppure
  1.  

è stata firmata da tre persone con fiducia marginale con chiavi pienamente valide (se viene firmata da meno di tre persone la chiave viene considerata marginalmente valida); inoltre

  1. il percorso delle chiavi firmate (trust pathGlossario) che risale dalla chiave K alla propria chiave è al massimo di cinque passi.

N.B.

l'algoritmo fa sempre riferimento a chiavi pienamente valide. Se la chiave non è pienamente valida allora non può essere usata per firmare altre chiavi, nonostante il livello di fiducia che si ripone nella persona che la utilizza.

La lunghezza del percorso, il numero delle chiavi con validità marginale richiesto e il numero di chiavi con validità piena possono essere modificati con le opzioni --max-cert-depth, --marginals-needed e --completes-needed rispettivamente. I valori dati precedentemente sono quelli preimpostati in GnuPGGlossario.


Ad esempio
(Caso 1.b):

- Annarella ha piena fiducia in Biagio
- Biagio ha convalidato la chiave di Carla


Se Annarella è convinta che Biagio sia capace di convalidareGlossario propriamente le chiavi di altri, allora, Annarella può dedurre che la chiaveGlossario di Carla sia valida senza dover necessariamente eseguire alcun controllo.
Semplicemente lei usa la propria copia (convalidata) della chiave pubblica di Biagio per controllare che la firma apposta da Biagio alla chiave di Carla sia buona.

E’ importante distinguere tra "fiducia nella chiave" e "fiducia nel possessore della chiave", lo scenario che si potrebbe avere è il seguente:
la chiave di Biagio è valida per Annarella in quanto è stata lei a firmarla, ma Annarella potrebbe non fidarsi di Biagio e della sua capacità di convalidare propriamente le chiavi che egli firma.
In questo caso, riferendosi all’esempio precedente, Annarella non considererebbe valida la chiave di Carla basandosi solo sulla firma di Biagio.

 

Consideriamo, ora, il seguente esempio di web of trust (caso 1.c):

- Annarella non ha fiducia nella capacità di Biagio nel firmare altre chiavi
- Annarella ha fiducia marginale in Luana, Roberta e Vittoria
- Luana, Roberta e Vittoria hanno convalidato la chiave di Carla

Poiché ci sono 3 persone con fiducia marginale che hanno convalidato la chiave di Carla, l'algoritmo la considera valida (caso 1.c) e Annarella potrà utilizzarla senza dover effettuare ulteriori controlli.

 

Altra situazione possibile è la seguente (Caso 2):

- Annarella ha fiducia piena in Biagio, Carla, Salvatore, Marco e Sergio
- Sergio ha convalidato la chiave di Angelo

L'algoritmo non considera la chiave di Angelo valida perché la lunghezza del trust pathGlossario che risale da Angelo ad Annarella è 6 (caso 2).

 

 

 

 

GnuPG vs PGP

 

Oggi il PGP è un prodotto commerciale a tutti gli effetti, venduto in varie configurazioni e ricco di opzioni. Ad onor del vero, ne esiste una versione freeware, ma con notevoli limitazioni sia nell'utilizzo che nelle funzioni offerte.
PGP freeware (scaricabile qui), infatti, può essere usato soltanto da:

con le seguenti limitazioni:

GnuPG è nato come un sostituto completo e gratuito del PGP che non usa l'algoritmo di crittografia IDEA, protetto da copyright, e quindi può essere utilizzato senza restrizioni.

A differenza del PGP, infatti, GnuPG fa parte della famiglia di strumenti e applicazioni GNU, realizzate e distribuite in accordo con la Licenza Pubblica Generica (GPLGlossario) della Free Software Foundation (FSF) che si basa sulle cosiddette "quattro libertà":

Si tratta di concetti molto importanti, che avvantaggiano tutti, compresi gli sviluppatori, che vedono i loro prodotti migliorati dagli stessi utenti.
Questi possono così contribuire costruttivamente al miglioramento dei programmi anziché limitarsi alla semplice segnalazione di problemi ai produttori. Questi ultimi traggono il loro vantaggio dalla più ampia diffusione dei programmi e dai servizi aggiuntivi che ne possono derivare: assistenza, formazione, consulenza, etc.

Le caratteristiche di GnuPG sono molto interessanti, e come per tutti i progetti open source, in continuo miglioramento:

 

 

 

Installazione e Uso GnuPG

 

Nella sezione seguente mostreremo come installare GnuPG (ver 1.2.1) evidenziando i comandi da eseguire e i controlli necessari per assicurarsi di avere una copia non modificata dei sorgenti. In seguito forniremo una guida ai comandi principali necessari per l'utilizzo quotidiano di GnuPG. La macchina test sui cui svolgeremo tali operazioni ha la seguente configurazione:

 

Processore: Intel Pentium III 450Mhz
Memoria Ram: 256mb SDR
Sistema Operativo: Linux SUSE 7.2

      

 

 

 

 

 

Installazione

Innanzitutto dobbiamo scaricare i sorgenti GnuPGGlossario dalla homepage. A questo indirizzo si troveranno anche link a siti mirror. Fatto  ciò è di fondamentale importanza verificare l’integrità dei file scaricati per sincerarsi che nessuno abbia modificato i sorgenti. I passi da seguire sono:

- calcolare il message digest MD5 del file scaricato (gnupg-x.y.z.tar.gz):

 

  

- verificare che l’output sia uguale a quello pubblicato nell’announcement list:

 

 A questo punto siamo sicuri dell’integrità dei file scaricati, possiamo procedere con l’installazione.

 Spostiamoci nella directory che contiene il codice sorgente e lanciamo il comando ./configure:

 

Con ./configure –help è possibile vedere le impostazioni disponibili per la compilazione. Se ci sono problemi di internazionalizzazione, è possibile usare le librerie gettext incluse nel sorgente, usando l'opzione --with-included-gettext, o disabilitarle usando l'opzione --disable-NLS.
E' inoltre possibile specificare il generatore di numeri casuali da utilizzare mediante l'opzione: --enable-static-rnd =
[Generatore da utilizzare]

Esistono diversi tipi di generatori che variano in base al sistema operativo utilizzato come ad esempio:

E’ ora possibile compilare il programma con il comando make, dopodichè bisogna eseguire il comando make install per copiare il programma e le pagine di manuale nella directory di installazione (che, a meno di modifiche apportate al ./configure, sarà usr/local/share/gnupg/):

 

 

È possibile eseguire GnuPG suid root, in modo che il programma giri con tutti i diritti dell'utente root e non scriva dati in locazioni di memoria teoricamente accessibili da altri. Si tenga però presente che eseguire il programma con i permessi root rende più pericolosi gli effetti di un eventuale cavallo di TroiaGlossario (un cavallo di Troia che gira come utente root può danneggiare l’intero sistema). Se si sceglie, per questo motivo o per altri, di non eseguire GnuPG suid root, è possibile disabilitare il relativo messaggio di avvertimento ("gpg: Attenzione: si sta usando memoria insicura!") impostando no-secmem-warning in ~/.gnupg/options.

 

 

 

 

 

 

 

 

USO GnuPG

 

Creare una chiave

Per creare una chiaveGlossario utilizziamo il comando gpg --gen-key:

è possibile scegliere quali algoritmi utilizzare inserendo il rispettivo numero (nell’esempio digitiamo 1).

Subito dopo ci verrà richiesta la lunghezza della coppia di chiavi pubblica/privata ElGamal da generare (DSA ha una lunghezza standard di 1024bit):

è anche possibile inserire valori intermedi che verranno automaticamente arrotondati a multipli di 32.

Inoltre, si possono inserire valori maggiori di 2048 ma la generazione potrebbe richiedere molto tempo come illustrato in figura:

 

Nella scelta della lunghezza dobbiamo tener conto del trade-off prestazioni/sicurezza: una chiaveGlossario più lunga offre sicuramente maggiore sicurezza ma aumenta il tempo di calcolo per cifrare e decifrare. 

Successivamente, il sistema chiederà di inserire nomi, commenti e indirizzi e-mail, che verranno usati per la costruzione della chiave (questi potranno essere modificati in parte anche successivamente):

 

Infine, occorre scegliere una "passphrase" (frase segreta) che andrà immessa ogni volta che si useranno funzionalità che richiedono la chiave privata:

 

A questo punto è stata generata la coppia di chiavi privata e pubblica che vengono memorizzate rispettivamente nel portachiavi privatoGlossario e in quello pubblicoGlossario. La directory "~/.gnupg/", che viene creata la prima volta che si avvia l'eseguibile gpg, serve per contenere i suddetti portachiavi. In particolare I file più importanti che si possono trovare sono:


Le nostre chiavi segrete contenute nel portachiavi privato (
secring.gpg) sono protette mediante cifratura con uno degli algoritmi simmetrici supportati da GnuPG; le chiavi usate per tali cifrature derivano dalla passphrase.
 

Ogni record di secring.gpg ha la forma seguente:

 

Il campo S2K (String-to-key) è uno specificatore usato sia per generare le chiavi simmetriche che proteggono il nostro portachiavi privato sia per generare le chiavi di sessione per la cifratura dei messaggi; in particolare esso contiene le informazioni necessarie affinché data una passphrase si riesca a ricavare la chiave simmetrica da usare per mettere in chiaro la chiave privata cifrata. Tali informazioni sono generate in fase di creazione di una nuova chiave privata.

Il campo Dati chiave Segreta contiene tutte le informazioni relative alla chiave segreta.

Checksum è un campo di controllo di 16 bit ottenuto calcolando la somma di tutti gli otteti che compongono i dati della chiave privata modulo 65536.

 

Ogni qualvolta è necessario utilizzare la chiave privata bisogna inserire la passhrase (che non viene mai memorizzata). Dopodichè vengono eseguiti i seguenti passi:

Tale meccanismo è descritto dettagliatamente nella RFC 2440.

 

Una buona passphrase ha le seguenti caratteristiche:

Nel febbraio 1999 fu scoperto un cavallo di TroiaGlossario che cercava chiavi private PGPGlossario sull'hard disk e le spediva via FTP: se le passphrase fossero state scelte male, le chiavi private sarebbero potute essere facilmente scoperte.

Scelta la passphrase, bisogna TENERLA BEN NASCOSTA (non lasciarla attaccata con un post-it al monitor del pc :D) e stare attenti a NON DIMENTICARLA (se succedesse, non sarebbe più possibile usare la propria chiave privata, ad esempio per leggere i messaggi ricevuti).

E' possibile notare il progresso nella generazione della chiave mediante alcuni caratteri mostrati a video. Il significato di questi è il seguente:

. Gli ultimi 10 test di Miller-Rabin sono falliti
+ Il test di Miller-Rabin ha avuto successo
! Ricarica il pool dei numeri primi con nuovi valori
^ Controlla un nuovo valore per il generatore
< La dimensione di un fattore primo viene decrementata
> La dimensione di un fattore primo viene incrementata

 

 

Revocare una chiave

È cosa saggia a questo punto generare anche un certificato di Revoca. Ci sono vari motivi per voler revocare una chiaveGlossario esistente, ad esempio se la chiave privata è stata smarrita o è caduta nelle mani sbagliate, oppure se non si vuole più usare lo stesso UID, oppure se la lunghezza della chiave non è più sufficiente, ecc. 

Per generare un certificato di revoca usiamo il comando --gen-revoke:

Si può notare dall'immagine che viene chiesto di specificare il motivo di revoca, un commento addizionale e la passphrase (altrimenti chiunque potrebbe revocare la chiave). Questo ha uno svantaggio: se si dimentica la passphrase, la chiave diventa inutilizzabile e non è neanche possibile revocarla (questo è il motivo per cui conviene creare il certificato di revoca subito dopo la generazione delle chiavi).

Inserita la passphrase l'output generato è il seguente:

 

 

Esportare una chiave

Per comunicare la chiave pubblica ad un corrispondente o per pubblicarla bisogna prima esportarla. Ciò può essere fatto con il comando --export specificando l'ID della chiave o una qualsiasi altra parte dello User ID che identifichi la chiave pubblica da esportare.

 

 

La chiaviGlossario viene esportata in un formato binario nel file indicato dall' opzione --output (che può essere abbreviata con -o), ma ciò può risultare sconveniente quando la chiave viene spedita per posta elettronica o pubblicata in una pagina web. E' possibile tuttavia specificare l'opzione --armor che forza l’output ad essere generato in un formato protetto da un’armatura ASCII:

 

 

Importare una chiave

Una chiave pubblica può essere aggiunta al proprio portachiaviGlossario mediante il comando --import:

 

Una volta che la chiave è stata importata è possibile modificare il livello di fiducia che si ha nel possessore della chiave mediante il comando trust nella schermata di edit accessibile digitando gpg --edit-key userID:

Notiamo che alla destra del campo "trust" compaiono due simboli staccati da un barra obliqua: il primo simbolo definisce il grado di fiducia nei confronti della persona, mentre il secondo definisce la validità della chiave. I simboli che esprimono il livello di fiducia in una persona sono riportati nella seguente tabella:

- non definita
q non conosciuta (scelta 1)
n nessuna (scelta 2)
m marginale (scelta 3)
f piena (scelta 4)
u definitiva * (scelta 5)

* una persona con fiducia definitiva è considerata responsabile, nel firmare le chiavi di altri, come se stessi

Prima del comando trust la fiducia nella persona è non definita (simbolo "-"). Una volta eseguito il comando verrà richiesto di inserire il livello di fiducia che si desidera assegnare. Di seguito si può vedere l'esito dell'operazione:

 

Inoltre la chiave importata deve essere convalidata; ciò può essere fatto personalmente oppure dal modello Web of TrustGlossarioGlossario.

E' anche possibile associare alla chiave importata una immagine jpg mediante il comando addphoto nella schermata di edit accessibile digitando: gpg --edit-key userID.

 

 

Convalidare una chiave

Prima di convalidareGlossariopersonalmente una chiaveGlossario bisogna assicurarsi che questa appartenga effettivamente alla persona identificata dallo userID. Ciò può essere fatto verificando il fingerprint della chiave, incontrando l'utente, controllando un documento di identità o con qualsiasi metodo (o combinazione di essi) che si ritenga più idoneo.

L’impronta digitale di una chiave può essere velocemente visualizzata con il comando --fingerprint oppure con il comando fpr dopo che si è entrati nella schermata di edit:

 

Dopo aver verificato il fingerprintGlossario con il possessore della chiave si può procedere con la firmaGlossario mediante il comando sign:

N.B.

nell'immagine precedente, la risposta alla domanda è utile agli altri utenti per conoscere quanto attentamente è stata verificata la chiave prima della firma ma non contribuisce a determinare il livello di validità della chiave.

Si può notare, a questo punto, che la chiaveGlossario risulta firmata e che la validità (in accordo all'algoritmoGlossario del Web of TrustGlossarioGlossario) è piena (f):

 

Notiamo che alla destra del campo "trust" compaiono due simboli staccati da un barra obliqua: il primo simbolo definisce il grado di fiducia nei confronti della persona, mentre il secondo definisce la validità della chiave. I simboli che esprimono il livello di validità di una chiave sono riportati nella seguente tabella:

- non definita
q informazioni insufficienti per il calcolo
n nessuna
m marginale
f piena

 

 

Cifrare

Il comando per cifrare è --encrypt:

l'opzione --recipient serve per specificare il destinatario, è possibile anche indicare il destinatario di default con l'opzione --default-recipient.
Per evitare il rischio che qualcun altro si spacci per noi, è consigliabile firmareGlossario qualsiasi cosa si voglia cifrare.

E' possibile cifrare un messaggio anche solo con algoritmi simmetrici. Il comando utilizzato per la cifratura simmetrica è  --symmetric:

# gpg --output MsgCifrato.gpg --symmetric TestoDaCifrare.txt

Prima di cifrare ci verrà richiesta la passphrase la quale preventivamente sarà stata concordata col destinatario del messaggio.

E' possibile scegliere l'algoritmo simmetricoGlossario da usare nella modalità di cifratura ibrida e nella modalità simmetrica attraverso l'opzione: --cipher-algo.
Inoltre si può decidere la funzione hash da usare nella trasformazione della passphrase in chiave simmetrica, attraverso l'opzione: --s2k-digest-algo.

 

Decifrare

Il comando per decifrare sia che si è utilizzata la modalità ibrida che quella simmetrica è --decrypt:

ovviamente ci verrà richiesta la passphrase. L'opzione --output (che può essere abbreviata con -o) serve per redirigere l'output su un file (se non specificato l'output predefinito è lo stdout).

 

 

Firmare e verificare

Per firmare dati con la propria chiave, si usa il comando:

# gpg --sign [dati]

Durante questa operazione, i dati vengono anche compressi, quindi il risultato non sarà leggibile. Per avere un risultato leggibile si può usare:

# gpg --clearsign [dati]

In questo modo si firmeranno i dati lasciandoli leggibili. Con il comando:

# gpg --detach-sign [dati]

è possibile scrivere la firma in un file separato. Questa opzione è utile specialmente per firmare file binari (come ad esempio archivi). Anche l'opzione --armor può tornare utile.

Spesso si troveranno dati cifrati e firmati allo stesso tempo. Il comando completo è:

# gpg [-u mittente] [-r destinatario] [--armor] --sign --encrypt [dati]

Quando dei dati cifrati sono stati anche firmati, la firma viene verificata dopo aver decifrato i dati. È possibile verificare le firme con il comando

# gpg --verify [dati]

Ovviamente per fare questo è necessario possedere la chiave pubblica del mittente.

 

 

 

 

 

 

 

 

 

Glossario

 

Algoritmo a chiave pubblica/privata:
Algoritmo che opera con 2 chiavi una detta pubblica (usata per cifratura e verifica), l'altra privata (usata per decifratura e firma).
Algoritmo crittografico:
Algoritmo che impiega la scienza della crittografia, includendo algoritmi di cifratura, funzioni hash, algoritmi per la firma digitale e per key agreement
Algoritmo simmetrico:
Algoritmo che utilizza la stessa chiave per cifrare e decifrare
Autenticazione:
Processo che verifica l'identità affermata da (o per) un'entità di sistema
Cavallo di Troia (Trojan Horse):
Programma che contiene all' interno un secondo programma che permette al suo creatore di accedere al sistema senza autorizzazione
Chiave:
Parametro di input che varia le trasformazioni effettuate da un algoritmo crittograficoGlossario
Chiave di sessione:
Chiave utilizzata nell'ambito di una sola sessione
Cifratura:

Trasformazione crittografica dei dati dalla forma originaria (chiamata "plaintext") in una forma (chiamata "ciphertext") che ne cela il significato, in modo da prevenire la loro conoscenza e il loro uso. La trasformazione inversa, sempre se attuabile, è chiamata decifraturaGlossario

Confidenzialità
dei dati:
Proprietà che l'informazione deve avere affinché non sia disponibile o rivelabile a individui, entità o processi non autorizzati
Convalidare una chiave:

Procedura che il destinatario di una chiave pubblica attua per controllare che la chiave risponda a determinati requisiti aritmetici per contrastare certi tipi di attacchi (es: verificare il fingerprint della chiave con il possessore e firmare la chiave)

Crittoanalisi:
Scienza matematica che si occupa dell' analisi di un sistema crittografico atta ad ottenere la conoscenza necessaria per rompere o circuire la protezione che il sistema è designato a fornire
Crittografia:
Scienza matematica che si occupa di trasformare i dati in modo da rendere il loro significato non comprensibile (confidenzialità dei datiGlossario), prevenire eventuali alterazioni non individuabili altrimenti (integrità dei datiGlossario), prevenire l'uso non autorizzato (autenticazioneGlossario) e prevenire il ripudio di commissioni o azioni (non ripudioGlossario). Se la trasformazione è reversibile, la crittografia si occupa anche di ripristinare dati cifrati in una forma comprensibile
Decifratura:
Trasformazione che ricostruisce il testo in chiaro a partire da un testo precedentemente cifrato
Fingerprint:
Risultato hash usato per autenticare una chiave pubblica (key fingerprint) o altri dati
Firma digitale:
Valore calcolato con un algoritmo crittograficoGlossario apposto ad un data object in maniera tale che chiunque riceva i dati possa usare la firma per verificare l'origine, l'integrità dei datiGlossario e proteggersi dal ripudio di commissioni o azioni (non ripudioGlossario)
Firmare una chiave:
Apporre una firma digitaleGlossario ad una chiave
Firmare un documento:
Apporre una firma digitaleGlossario ad un documento
Funzione hash:
Algoritmo che calcola un valore basato su un data object (per esempio un messaggio o un file) generalmente di lunghezza variabile (possibilmente molto grande) mappando il data object su un data object più piccolo ("hash risultante") che normalmente è un valore di grandezza fissato
GnuPG:

Gnu (acronimo ricorsivo di "GNU's Not Unix") Privacy Guard (sito ufficiale) è una alternativa OpenSource di PGP nata nel 1997 ad opera di Werner Koch

GPL (General Public License): Licenza per garantire la libertà di condividere e modificare software libero (ulteriori informazioni: qui)
Integrità dei dati:
Proprietà che i dati non sono stati cambiati, distrutti o persi in modo non autorizzato o accidentale
Non ripudio:
Servizio che previene ad una entità la possibilità di negare precedenti commissioni o azioni
Numero primo:
Numero divisibile solo per se stesso e per l'unità
Numero primo sicuro:
Numero primo della forma 2q+1, dove q è anch'esso primo. Alcuni esempi:
 
5, 7, 11, 23, 47, 59, 83, 107, 167, 179, 227, 263, 347, 359, 383, 467, 479 ...
Open source:
Possibilità di accedere, utilizzare, distribuire e modificare liberamente il codice
PGP (Pretty Good Privacy):
Software di crittografia usato sia per la posta elettronica che per la protezione dei file di uso personale (sito ufficiale)
Phil Zimmerman:
Ideatore di PGP (ulteriori informazioni: qui)
Portachiavi pubblico:
Contenitore dove vengono memorizzate le chiavi pubbliche di tutti gli utenti con cui si vogliono mantenere dei contatti (in GnuPG prende il nome di pubring.gpg)
Portachiavi privato:
Contenitore dove vengono memorizzate le chiavi private dell'utente (in GnuPG prende il nome di secring.gpg)
Sistema crittografico:
Sistema che fa uso della crittografiaGlossario (ulteriori informazioni: qui)
Sistema ibrido:
Applicazione che combina due o più algoritmi crittograficiGlossario, in particolare combina crittografia simmetrica e asimmetrica
Trust Paths:
Cammini che uniscono due nodi nel grafo associato al Web of Trust
Web of Trust:
Struttura gerarchica per la regolamentazione della fiducia riposta nelle chiavi o nelle persone

 

 

 

 

 

 

Bibliografia

 

  1. Gnu Privacy Handbook

  2. Sito ufficiale di riferimento per GnuPG

  3. Tesina di approfondimento su PGP

  4. Handbook of Applied Cryptography

  5. Sito ufficiale PGP

  6. GnuPg Mini Howto

  7. RFC 1208 del 3/91: A Glossary of Networking Terms

  8. RFC 2828 del 8/96: Internet Security Glossary

  9. RFC 2440 del 10/98: OpenPGP Message Format

 

 

 

 

 

 

 

 

 

 

 

Legenda dei simboli

 

Glossario riferimento ad una sezione della tesina
riferimento ad una pagina esterna alla tesina
Glossario riferimento ad una voce del glossario