Reading Time: 8 minutes

PGP

Il sistema crittografico denominato PGP (Pretty Good Privacy), frutto del lavoro illuminato di Phil Zimmermann, introduce uno schema generale che può essere impiegato sia per la posta elettronica sia per la conservazione di informazioni sul disco fisso di una stazione locale.

Il PGP definisce uno schema in grado di garantire la riservatezza dei dati e di autenticare i partecipanti durante lo scambio di messaggi.

Piuttosto che sviluppare una serie di algoritmi proprietari per implementare le funzionalità del PGP, Zimmermann ha adottato alcuni degli algoritmi standard che si sono dimostrati più affidabili nel campo della crittografia.

Per la codifica del messaggio, lo schema prevede una interfaccia per algoritmi simmetrici come IDEA e CAST, entrambi con chiavi di 128 bit e DES a tre stadi, con chiavi di 168 bit.

Per le componenti in cui è previsto l’uso di algoritmi asimmetrici, PGP prevede la possibilità di impiegare sia RSA sia DSA.

Infine, per produrre un digest del messaggio possono essere usate sia le funzioni MD5 sia le funzioni SHA.

I servizi nel complesso messi a disposizione dal sistema PGP sono:

I partecipanti allo scambio di messaggi di posta elettronica possono utilizzare tali funzionalità, anche solo in parte, secondo le specifiche necessità del servizio.

Se non si desidera la riservatezza, ma solo autenticare la fonte, il corpo del messaggio non sarà codificato.

Si provvederà soltanto a produrre una semplice segnatura del messaggio.

Se entrambe le funzioni sono richieste, al messaggio originale viene prima allegata la sua segnatura e poi il tutto è codificato per mantenere la riservatezza.

Per riconoscere la presenza di un messaggio PGP, all’interno della sezione Body di un messaggio di posta elettronica, il sistema introduce appositi delimitatori, per indicare l’inizio e la fine del blocco PGP, oltre a una serie di informazioni riguardanti la natura dei dati e la versione del protocollo utilizzato.

Il servizio di autenticazione ha lo scopo di garantire l’identità dei partecipanti coinvolti.

Chi produce il messaggio (mittente) è responsabile della generazione di un digest di almeno 128 bit.

Il digest può essere generato utilizzando sia MD5 sia SHA.

L’ingresso della funzione di digest è rappresentato dal corpo del messaggio di posta elettronica.

Una volta ottenuto il digest il mittente provvede a codificarlo con la propria chiave privata e a inviarlo al ricevente.

L’algoritmo utilizzato per produrre la segnatura del messaggio è un algoritmo asimmetrico scelto tra RSA e DSA (alcune implementazioni software prevedono anche la possibilità di utilizzare altri algoritmi come ElGamal).

Il ricevente è in grado di stabilire la fonte del messaggio attraverso i seguenti passi:

  1. decodifica la segnatura del messaggio appena ricevuto utilizzando la chiave pubblica del mittente;
  2. riproduce un digest a partire dal testo ricevuto;
  3. confronta i digest ottenuti ai passi precedenti

Se il confronto produce un risultato positivo la fase di autenticazione dei messaggi può ritenersi conclusa con successo.

Il testo del messaggio e la sua segnatura non vengono generalmente trasmessi al ricevente in chiaro.

Per mantenere la confidenzialità dei dati trasmessi, i due blocchi vengono codificati utilizzando un algoritmo simmetrico tra quelli supportati (IDEA, CAST, 3DES).

La chiave usata nel processo di codifica viene generalmente denominata session key.

La sua validità è relativa al solo messaggio corrente.

La sua effettiva lunghezza dipende dall’algoritmo simmetrico adottato. Trattandosi di un algoritmo simmetrico, la stessa chiave usata dal mittente per la codifica deve essere usata per la decodifica del messaggio.

Per rendere possibile tale operazione il ricevente deve essere messo a conoscenza della chiave comune, trasferendo la session key codificata entro lo stesso messaggio PGP in cui se ne fa uso. Il ricevente estrae l chiave simmetrica dal messaggio PGP ricevuto e la utilizza per decodificare il resto del messaggio.

La chiave simmetrica viene allegata al messaggio PGP dopo essere stata a sua volta codificata utilizzando un algoritmo asimmetrico.

Per codificare la session key viene utilizzata la chiave pubblica del ricevente, in modo che solo l’utente destinatario può estrarre con successo la chiave simmetrica dal messaggio trasferito.

Nel trasferimento di informazioni attraverso un sistema di comunicazione, riuscire a ridurre alla sorgente la quantità di dati da trasmettere, significa poter aumentare le prestazioni dell’intero sistema.

Nel caso della trasmissione di dati riservati, la compressione introduce un secondo aspetto positivo: consente di eliminare le correlazioni presenti nel messaggio originale.

Correlazioni che potrebbero essere utilizzate da un hacker per tentare una qualche forma di crittoanalisi, nel tentativo di decodificare i dati trasferiti.

Il PGP utilizza lo standard commerciale ZIP per effettuare una preliminare compressione dei dati prima della operazione di codifica simmetrica.

La compressione viene effettuata prima della codifica, in quanto ogni buon algoritmo di crittografia di fatto elimina intrinsecamente le stesse ridondanze eliminate da un buon protocollo di compressione.

Invertendo l’ordine delle operazioni (prima la codifica e dopo la compressione) il guadagno finale risulterebbe inconsistente (fattore di compressione molto vicino a uno).

I sistemi di posta elettronica prevedono l’inoltro di blocchi costituiti esclusivamente da caratteri di testo appartenenti al set ASCII ridotto (7 bit).

Per evitare eventuali problemi di consegna dei messaggi cifrati, il PGP prevede la conversione del messaggio binario, risultato della codifica simmetrica, in una sequenza di caratteri ASCII, conforme alle specifiche dettate dalla RFC822.

Per ottenere questa trasformazione viene adottata la codifica denominata base64, che comporta un’espansione della dimensione del messaggio PGP pari al 33%.

La perdita è in parte compensata dall’uso del sistema (ZIP) per la compressione dei dati.

Poiché molti sistemi di posta elettronica non sono in grado di trattare messaggi troppo lunghi, il PGP prevede la possibilità di frammentare il messaggio risultante in una serie di sottomessaggi.

L’intestazione, contenente tutte le informazioni per la decodifica, è presente solo nel primo frammento.

I diversi frammenti devono essere preliminarmente riassemblati dal ricevente prima di essere decodificati.

Le sezioni che costituiscono un generico messaggio PGP sono indicate generalmente come:

  • Session Key;
  • Signature;
  • Message.

La sezione Message, presente obbligatoriamente, può essere a sua volta scomposta in 3 sottocampi:

  1. Filename, riporta il nome del file contenuto nel successivo campo Data;
  2. Timestamp, contiene l’indicazione temporale del momento in cui il file è stato generato;
  3. Data, contiene i dati utente.

La sezione Signature, presente ogni volta che si richiede l’autenticazione della fonte e l’originalità dei dati trasportati nella sezione Message, si compone invece di quattro sottocampi.

  1. Timestamp, riporta l’istante in cui è stata generata la segnatura del messaggio.
  2. Source Key ID, identifica quale chiave pubblica del mittente deve essere utilizzata per decodificare la segnatura del messaggio. La presenza di questo identificatore permette di utilizzare molteplici coppie di chiavi pubbliche/private per ogni utente, costringendo però chi trasmette a specificare di volta in volta quale coppia si è usata all’interno del messaggio corrente.
    Il PGP prevede l’invio di un identificativo che consente di risalire alla chiave asimmetrica, piuttosto che l’inoltro della chiave pubblica.
  3. Digest, riporta i primi due ottetti del digest ottenuto processando la sezione Message. I primi due ottetti del digest sono trasmessi in chiaro per consentire al ricevente di verificare la correttezza della chiave pubblica che sta utilizzando per decodificare il campo Mesage Signature.
  4. Message Signature, rappresenta la versione codificata del digest del messaggio.

La sezione Session Key, presente ogni volta che viene richiesta la riservatezza della trasmissione dati, si compone di soli due sottocampi:

  1. Destination Key ID, identifica la chiave pubblica del ricevente utilizzata per codificare la session key. La presenza di questo identificatore permette di utilizzare molteplici coppie di chiavi pubbliche/private per ogni utente, obbligando però chi trasmette a specificare di volta in volta la coppia usata all’interno del messaggio corrente.
    L’identificativo trasmesso dal mittente consente al ricevente di stabilire la chiave privata da utilizzare per decodificare la session key.
  2. Session Key, contiene la chiave comune indispensabile per decodificare il resto del messaggio PGP.

Per utilizzare lo schema PGP è quindi indispensabile che le chiavi pubbliche degli utenti coinvolti nella trasmissione dati siano state preliminarmente inserite in una struttura dati memorizzata sul disco fisso delle stazioni utilizzate, per generare e decodificare il messaggio PGP.

La struttura contenente le chiavi pubbliche deve essere protetta da operazioni di scrittura, che potrebbero comportare la modifica dei dati da parte di un hacker.

Le chiavi private devono invece essere protette anche da accessi in lettura non autorizzati.

La soluzione adottata prevede di memorizzare le chiavi private dopo averle codificate con un algoritmo simmetrico.

Per poterle usare al momento della creazione o ricezione di un messaggio PGP, l’utente deve digitare una personale passphrase.

La passphrase viene trasformata in chiave simmetrica attraverso una funzione di digest e utilizzata per decodificare la chiave privata prima dell’uso.

Terminata la decodifica della chiave privata, la passphrase e il suo digest vengono scartati senza essere memorizzati dalla stazione.

La passphrase deve essere digitata ogni volta in cui l’utente desidera interagire con le chiavi private PGP.

Nella generazione del messaggio è necessario digitare, oltre alla passphrase, una coppia di identificativi che stabiliscono quali Key ID si intende utilizzare.

Per semplificare la creazione/manutenzione delle strutture dati contenenti le chiavi pubbliche degli utenti, il PGP prevede messaggi di formato speciale proprio per il loro trasferimento attraverso la posta elettronica.

Gli utenti che ritengono inaffidabile questo processo possono utilizzare altri canali (consegna fisica di usb, accesso controllato a un KDC, uso di certificati e di una PKI).

Indipendentemente dal canale utilizzato, le chiavi pubbliche devono essere memorizzate localmente, prima di poter essere utilizzate dal PGP.

Durante l’operazione di memorizzazione, a ciascuna chiave pubblica viene associato uno specifico livello di fiducia: massimo se la chiave pubblica memorizzata è presente anche nella struttura usata per memorizzare le chiavi private.

Ciò accade ogni volta in cui la chiave pubblica viene generata dall’utente locale.

Nella pratica, il PGP associa un livello di fiducia a ciascuna chiave pubblica, permettendo agli utenti di certificare le proprie chiavi e di estendere la fiducia anche a quelle certificate dagli altri utenti, rendendo opzionale l’intervento di una autorità di certificazione.

Lo schema complessivo, adottato dal PGP, per validare l’identità dell’utente e attribuirgli la sua chiave pubblica è oggi noto come modello Web of Trust e rappresenta un’alternativa a soluzioni di certificazione e/o gestione delle chiavi centralizzate.

Il livello di fiducia viene calcolato autonomamente dal PGP al momento della memorizzazione delle chiavi pubbliche.

Il compito di stabilire il livello di fiducia per ogni chiave è lasciato al singolo utente.

Per questo, prima di confezionare un messaggio PGP per il trasferimento delle chiavi pubbliche, il livello di fiducia riportato per ogni chiave viene eliminato.

Il PGP, magari nella versione OpenPGP (descritta nella RFC 2440), oggi è notevolmente diffuso tra gli utenti Internet, oltre che per la robustezza e versatilità del servizio, anche perché il software viene distribuito liberamente, ed è compatibile con i principali sistemi operativi e con i più diffusi programmi di posta elettronica.

Per le realtà che preferiscono avvalersi di software con disponibilità di un supporto tecnico, esiste anche una versione commerciale di PGP completamente supportata dall’azienda sviluppatrice.

Anche se OpenPGP è oramai entrato nel processo di standardizzazione promosso dallo IETF, il PGP si configura come un sistema in rapida evoluzione più che come uno standard definitivo.

Molti suoi aspetti sono continuamente rivisti e ampliati sia nella versione commerciale (distribuita da McAfee), sia in quella open-source.

error: Content is protected !!

La maggior parte dei contenuti del blog ComputerSec vengono pubblicati a beneficio di tutti e in modo completamente gratuito.
Tuttavia per supportare il blog, e per avere ulteriori vantaggi, puoi decidere di abbonarti e sfruttare al 100% tutti i contenuti!
Abbonati Ora!

Complimenti! Ti sei iscritto alla nostra Newsletter

C'è stato un errore durante l'invio della richiesta. Per favore riprova.

Computer Security will use the information you provide on this form to be in touch with you and to provide updates and marketing.