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 crittografia è questione antica.
Gnu Privacy Guard(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
crittografico alternativo a
PGP totalmente open
source che rispetta lo standard internet
OpenPGP,
descritto nella
RFC 2440.
Utilizza un sistema “ibrido” (simile a quello utilizzato da
PGP) con l’utilizzo combinato di algoritmi simmetrici (crittografia
tradizionale) e asimmetrici (crittografia
a chiave pubblica).
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 asimmetrica analizzandone gli aspetti
principali. Dopodichè faremo una breve panoramica su
PGP per poi introdurre finalmente
che cosa è GnuPG. Analizzeremo come avviene
la cifratura e la decifratura
in GnuPG e in che modo sia possibile
apporre firme digitali ai documenti. Illustreremo,
a questo punto, gli algoritmi
supportati e in particolare vedremo
la cifratura e firma con ElGamal e la firma con DSA. Spiegheremo, di seguito,
il modello
utilizzato per la convalida delle chiavi noto come Web
of Trust, confronteremo GnuPG e
PGP evidenziandone le differenze.
Infine mostreremo i passi da seguire per l'installazione
e i comandi principali per l'uso
di GnuPG.
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 deve soddisfare affinché possa
essere considerato sufficientemente robusto (cioè difficilmente attaccabile
da tentativi di crittoanalisi 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 crittografia tradizionale viene utilizzata un unica chiave (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 digitali. Per fare ciò la chiave privata
verrà usata per firmare (cifrare) mentre la chiave pubblica per
verificare (decifrare).
Uno dei software che è divenuto molto famoso nell’ultimo decennio in tema di crittografia è il PGP (Pretty Good Privacy), sviluppato da Phil Zimmermann 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
Gnu (acronimo ricorsivo di "GNU's Not Unix") Privacy Guard (GnuPG) è uno strumento per comunicare in modo sicuro nato in Germania nel 1997 per opera di Werner Koch, uno sviluppatore indipendente interessato alla crittografia open source. GnuPG è un sistema crittografico che permette la cifratura/decifratura e autenticazione di messaggi. La cifratura/decifratura si basa su un sistema “ibrido” simile a quello usato da PGP con l’utilizzo combinato di algoritmi simmetrici (crittografia tradizionale) e asimmetrici (crittografia a chiave pubblica), 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 chiavi. Tale nozione è utilizzata anche in uno schema noto come "Web of Trust" (rete della fiducia), la quale estende la certificazione delle chiavi non firmate di proprio pugno. Infatti la convalida di una chiave 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 GPL).
Cifratura e decifratura in GnuPG
GnuPG fa uso di
diversi concetti di
crittografia come algoritmi
simmetrici, algoritmi a
chiave pubblica, e hashing Oneway.
Gli algoritmi asimmetrici non sono una soluzione ideale poiché le operazioni di
cifratura e
decifratura 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).
Sia PGP che GnuPG possono utilizzare algoritmi ibridi. In particolare GnuPG funziona utilizzando l'algoritmo asimmetrico ElGamal per condividere una chiave che sarà utilizzata nel sistema simmetrico scelto (RIJNDAEL, 3DES, BLOWFISH...).
|
Fig. Cifrare in GnuPG |
Fig. Decifrare in GnuPG |
Il messaggio viene quindi criptato usando tale chiave, detta
chiave di sessione, e successivamente spedito al
destinatario.
La chiave di sessione (criptata utilizzando
l’algoritmo a chiave pubblica/privata) e il messaggio da spedire
(cifrato con
l’algoritmo simmetrico) sono automaticamente combinati
in un solo pacchetto.
Il destinatario usa la propria chiave privata per decifrare la
chiave di sessione che viene poi usata per decifrare il messaggio.
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.
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.
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.
Una firma digitale è un valore calcolato con un algoritmo crittografico apposto ad un data object che deve godere delle seguenti proprietà:
deve essere facilmente prodotta dal legittimo proprietario
nessun utente deve poter riprodurre la firma di altri
chiunque deve poter facilmente verificare la firma
deve essere non ripudiabile (il firmatario non può negare la sua firma)
Un sistema di firma digitale deve garantire due importanti proprietà:
E' possibile apporre una firma digitale a un documento utilizzando gli algoritmi a chiave pubblica/privata e funzioni hashcome 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 cifratura 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 (DSA) è un algoritmo per la firma a chiave pubblica che funziona come
appena descritto e rappresenta l’algoritmo principale usato da
GnuPG per
firmare documenti.
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 sessione, cifratura dei messaggi, firma dei messaggi).
Gli algoritmi supportati sono :
E' possibile impostare l'algoritmo simmetrico e la funzione hash 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 chiave 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).
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
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:
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:
Cifratura
La cifratura 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
|
Sicurezza
Quindi rompere l'algoritmo di ElGamal equivale a risolvere efficientemente tale problema.
L’algoritmo proposto da ElGamal per la firma digitale è alquanto diverso da quello già citato destinato alla cifratura.
Generazione chiave pubblica e privata
Per generare la chiave pubblica e privata, come nell'algoritmo di cifratura occorre effettuare le seguenti operazioni:
Viene scelto un numero primo p molto grande e un generatore gÎZp* con 1<g<p-1
Viene scelto un intero Kprv tale che 1<Kprv<p-1 dove MCD(Kprv,p-1)=1, che è utilizzato come chiave privata
Viene calcolato il valore Kpub=gKprvmodp
La chiave pubblica sarà costituita dalla tripla (p,g,Kpub).
Firmare un documento
Supponiamo che Biagio voglia firmare un documento D (D in realtà è l'hash del documento, come spiegato nella sezione firma digitale), 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
|
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.
Il Digital Signature Algorithm (DSA) è l' algoritmo
principale a chiave pubblica usato da
GnuPG
per
firmare documenti.
L'algoritmo DSA utilizza la funzione hash 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:
(Web of Trust)
Un punto debole degli algoritmi a chiave pubblica è la diffusione delle chiavi: un malintenzionato potrebbe manomettere il portachiavi 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:
|
La soluzione adottata da GnuPG (e anche dal
PGP) è la firma delle chiavi: una
chiave pubblica può essere firmata da altre persone, certificando così
che la chiave appartiene veramente alla persona
che sostiene di esserne il proprietario (convalida della chiave).
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 --fingerprint, 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 Trust (rete della fiducia), il quale
non richiede all’utente di convalidare 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:
|
non c’è nessuna informazione sul giudizio che il possessore della
chiave ha nel firmare altre chiavi |
|
il possessore non firma opportunamente le chiavi degli altri |
|
il
possessore capisce le implicazioni che comporta firmare una chiave
ed è capace di convalidare le chiavi propriamente prima di firmarle |
|
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 Uso"). 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à:
|
non
c’è nessuna informazione sulla validità della chiave pubblica (le chiavi del proprio
portachiavi che non
siano le proprie hanno inizialmente questo livello di fiducia) |
|
la chiave pubblica non appartiene alla persona che sostiene di
esserne il proprietario |
|
la
chiave pubblica potrebbe appartenere alla persona che sostiene di
esserne il proprietario |
|
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:
|
è stata firmata personalmente, oppure |
|
è
stata firmata da una persona di cui ci si fida pienamente con una
chiave pienamente valida, oppure |
|
è 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 |
il percorso delle chiavi firmate (trust path) 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 GnuPG.
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 convalidare propriamente le chiavi di altri,
allora, Annarella può dedurre che la chiave 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 path che risale da Angelo ad Annarella è 6 (caso 2).
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:
Non include PGP Disk (programma che consente di creare partizioni cifrate)
Non include la cifratura automatica degli allegati e-mail
Non fornisce plug-in per l'integrazione con Outlook, Outlook Express o altri programmi e-mail
Non opera con PGP Admin o altri PGP deployment tools
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 (GPL) 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:
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 |
Innanzitutto
dobbiamo scaricare i sorgenti GnuPG 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:
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 =
Esistono diversi tipi di generatori che variano in base al sistema operativo utilizzato come ad esempio:
/dev/random, utilizzato
nei sistemi Linux e *BSD, attivabile inserendo la stringa "linux".
Questo generatore fornisce un'entropia di alta qualità
catturando il rumore esterno come gli intervalli tra i vari interrupt
del sistema, generati da dispositivi come interfacce di rete, dischi
rigidi, tastiera, mouse, etc.
(Anche gli utenti di Solaris, con
installato il pacchetto SUNWski, possono usare /dev/random)
Entropy Gathering Daemon (EGD), fornisce una buona scelta sui sistemi che non dispongono di buoni generatori di numeri casuali, attivabile inserendo la stringa "egd". Si tratta di un demone Perl che controlla l'attività del sistema e la trasforma in dati casuali
Generatore Unix, se nessuno dei precedenti metodi è presente, è
possibile usare tale generatore inserendo la stringa "unix". Tuttavia
questo generatore è molto lento e andrebbe evitato, inoltre la qualità
dei numeri casuali generati non è molto buona, quindi ne è sconsigliato
l'uso per cifrare dati importanti
E’ ora
possibile compilare il programma con il comando
make,
È 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 Troia (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
.
Per creare una chiave 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 chiave 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:
Le nostre chiavi segrete contenute nel portachiavi privato (
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:
si applicano alla passphrase le trasformazioni in accordo con lo specificatore S2K per ottenere la chiave simmetrica da usare
si decifra, con la chiave simmetrica, il pacchetto che contiene la chiave privata
si calcola sui dati appena decifrati (escluso i 16 bit che rappresentano il checksum) la somma di tutti gli ottetti (che compongono la chiave privata) modulo 65536
si confronta il risultato con il checksum, se sono uguali allora la passphrase inserita è valida
Tale meccanismo è descritto dettagliatamente nella RFC 2440.
Una buona passphrase ha le seguenti caratteristiche:
Nel febbraio 1999 fu scoperto un cavallo
di Troia che cercava chiavi private
PGP sull'hard disk e le spediva via
FTP: se le passphrase fossero state scelte male, le chiavi private sarebbero
potute essere facilmente scoperte.
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 |
È cosa saggia a questo punto generare anche un certificato di Revoca. Ci sono vari motivi per voler revocare una chiave 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
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:
La chiavi 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:
Una chiave pubblica può essere aggiunta al proprio portachiavi 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 Trust.
E' anche possibile associare alla chiave importata una immagine jpg mediante il comando addphoto nella schermata di edit accessibile digitando: gpg --edit-key userID.
Prima di convalidarepersonalmente una chiave 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 fingerprint con il possessore della chiave si può procedere con la firma 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 chiave risulta firmata e che la validità (in accordo all'algoritmo del Web of Trust) è 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 |
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
firmare qualsiasi cosa
si voglia cifrare.
# 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 simmetrico 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.
ovviamente ci verrà richiesta la
passphrase. L'opzione
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.
Algoritmo che opera con 2 chiavi una detta pubblica (usata per cifratura
e verifica), l'altra privata (usata per decifratura e firma). |
|
Algoritmo che impiega la scienza della crittografia, includendo algoritmi
di cifratura, funzioni hash, algoritmi per la firma digitale e per
key agreement |
|
Algoritmo
che utilizza la stessa chiave per cifrare e decifrare |
|
Processo che verifica l'identità affermata da
(o per) un'entità di sistema |
|
Programma che contiene all' interno un secondo programma che permette
al suo creatore di accedere al sistema senza autorizzazione |
|
Parametro di input che varia le trasformazioni effettuate da un algoritmo
crittografico |
|
Chiave utilizzata nell'ambito di una sola sessione |
|
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 decifratura |
|
dei dati: |
Proprietà che l'informazione deve avere
affinché non sia disponibile o rivelabile a individui, entità o
processi non autorizzati |
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) |
|
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 |
|
Scienza matematica che si occupa di trasformare i dati in modo da
rendere il loro significato non comprensibile (confidenzialità
dei dati), prevenire
eventuali alterazioni non individuabili altrimenti (integrità
dei dati), prevenire l'uso non autorizzato
(autenticazione)
e prevenire il ripudio di commissioni o azioni (non
ripudio).
Se la trasformazione è reversibile, la crittografia si occupa anche di
ripristinare dati cifrati in una forma comprensibile
|
|
Trasformazione che
ricostruisce il testo in chiaro a partire da un testo precedentemente
cifrato |
|
Risultato hash usato per autenticare una chiave pubblica (key
fingerprint) o altri dati |
|
Valore calcolato con un algoritmo
crittografico apposto ad un data object in maniera
tale che chiunque riceva i dati possa usare la firma per verificare
l'origine, l'integrità
dei dati e proteggersi dal ripudio di commissioni o azioni (non
ripudio) |
|
Apporre una firma digitale ad una chiave |
|
Apporre una firma digitale ad un documento |
|
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 |
|
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) |
Proprietà che i dati non sono stati cambiati, distrutti o persi in modo non autorizzato o accidentale | |
Servizio che previene ad una entità la possibilità di negare
precedenti commissioni o azioni |
|
Numero divisibile solo per se stesso e per l'unità |
|
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 ... |
|
Possibilità di accedere, utilizzare, distribuire e modificare liberamente
il codice |
|
Software di crittografia usato sia per la posta elettronica che per
la protezione dei file di uso personale (sito
ufficiale) |
|
Ideatore di PGP (ulteriori informazioni:
qui) |
|
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) |
|
Contenitore dove vengono memorizzate le chiavi private dell'utente
(in GnuPG prende il nome
di s |
|
Sistema che
fa uso della crittografia
(ulteriori informazioni:
qui) |
|
Applicazione che combina due o più
algoritmi crittografici, in particolare combina
crittografia simmetrica e asimmetrica |
|
Cammini che uniscono due nodi nel grafo associato
al Web of Trust |
|
Struttura gerarchica
per la regolamentazione della fiducia riposta
nelle chiavi o nelle persone |
riferimento ad una sezione della tesina | |
riferimento ad una pagina esterna alla tesina | |
riferimento ad una voce del glossario |