Privatezza, autenticita', integrita'
I tre servizi fondamentali offerti da un sistema di
sicurezza consistono nel
-
garantire la privatezza delle informazioni scambiate
: che nessuno vi possa accedere oltre agli utenti autorizzati.
-
assicurarne l'integrita' : che le informazioni non
vengano manomesse da terzi
-
e l'autenticita' : garantirne cioe' l'autore.
Esistono due tipologie di approccio al problema:
una detta a "chiave pubblica", basata sulla riservatezza di alcuni parametri e
sulla pubblicazione a tutti dei restanti, ed una dette a "chiave privata", che
prevede la scelta di una chiave condivisa (shared key) da applicare alla
sessione di messaggi che gli utenti andranno a trasmettersi.
Crittografia a chiave
pubblica (Public key)
Al'interno di un contesto public key, un ipotetico
utente A possiede una coppia di chiavi di cifratura e decifratura: Ka, di
dominio pubblico, e Ka-1, nota solo a lui e inversa a Ka (che permette
cioe' di decifrare il testo crittografato con la chiave Ka).
Per un qualsiasi altro utente che voglia
comunicare un messaggio ad A, sara' sufficiente cifrare il messaggio con
la chiave pubblica di A, Ka; solamente il destinatario sara' in possesso
della chiave inversa, e dunque solo lui sara' in grado di leggerlo.
Cifrare : [[EKa(P)]]
Decifrare : [[Eka-1(C)]]
Firma digitale
Se invece l'utente vuole utilizzare le public keys
come strumento di firma digitale da apporre ai propri messaggi, sara' per
lui sufficiente codificare il plain text impiegando la propria chiave
privata, in modo che tutti possano decifrarlo per mezzo della sua chiave
pubblica, avendo conferma dell'identita' del mittente.
Firmare : [[EKa-1(P)]]
Decifrare : [[Eka(C)]]
I metodi impiegati per implementare questa
soluzione teorica prevedono l'impiego di algoritmi caratterizzati da
valori di tipo privato (noti solo al detentore della chiave) e valori di
tipo pubblico, noti a “tutti”, intendendo cosi' i restanti utenti del
sistema, siano essi utenti standard, oppure attaccanti alla sicurezza
della comunicazione.
[Nota: Gli algoritmi trattati di seguito sfruttano
le regole dell'algebra modulare; per chiarimenti, consultare il compendio
di algebra modulare (Fai
click qui per visualizzare la pagina)
Cifrario a
blocchi RSA
Si definisce
la chiave K, caratterizzata dai seguenti paramentri: m, p, q, a, b.
Tra loro, questi sono legati
nel seguente modo:
-
m=p*q (dove p e q sono due
numeri primi)
-
a e b sono numeri interi
maggiori di 0
-
Il massimo comun divisore
tra b e (funzione toziente) di m e' pari a 1
-
a*b =1 mod m (a = (b)^-1 mod m)
m e b sono di dominio
pubblico, mentre a, p e q sono privati.
Per cifrare il messaggio si
applichera' C=(P)^b e per decodificarlo P=(C)^q.
Essendo b noto, chiunque
puo' codificare un messaggio destinato al detentore della chiave, ma solo
il destinatario potra' applicare il procedimento inverso e leggere il
testo in chiaro.
Il procedimento inverso a
questo puo' essere invece utilizzato per firmare il messaggio: il
mittente infatti firma con l'algoritmo C=(P)^a, essendo il parametro a noto a lui solo,
mentre il destinatario sara' poi in grado di leggere il testo in chiaro
calcolando P=(C)^b, avendo cosi' garanzia dell'identita'
del mittente. (Firma RSA). [Nota: Il procedimento e' reso
possibile dalla condizione specificata in precedenza: a*b =1 mod m].
Il parametro a e' calcolabile invertendo b,
ma senza la conoscenza di p e q non e' possibile decifrare il messaggio; un ipotetico attacco alla
sicurezza, e' dunque reso difficoltoso dal calcolo di tutte le possibili coppie
di numeri primi p e q. La sicurezza dell'algoritmo e' basata sulla difficolta' del calcolo della fattorizzazione di m.
DSA : Digital Signature
Algorithm
Il messaggio in chiaro P viene suddiviso in blocchi da 160 bit.
Si definisco i parametri pubblici p, ά, β e
il parametro privato a,
dove
p e' un numero primo di 1000/2000
bit.
Si sceglie un numero casuale
K, privato, appartenente all'insieme ridotto Z(p-1). [Vedi compendio di
algebra modulare]

E si firma il messaggio

dove

Per il destinatario sara' possibile verificare l'autenticita' del
messaggio controllando che

poiche' p e ά sono parametri noti.
Questo tipo di firma
digitale e' piu' efficace in termini di protezione da attacchi esterni
dell'RSA, in quanto la difficolta' di decifratura si basa sul calcolo di
logaritmi discreti e non di potenze.
Una firma con questo metodo
occupa molto spazio: firmando ogni blocco da 160 bit con un'aggiunta di
parametri per ulteriori 160 bit, la lunghezza totale delle informazioni
scambiate raddoppia.
Per ovviare a questo
inconveniente, decisamente sensibile e pesante nella gestione di messaggi
lunghi, si ricorre alla funzioni di “hash”.
Funzioni di “hash”
Derivano il loro nome dal verbo inglese
“hash”=triturare. Il loro compito e' infatti quello di comprimere un
messaggio M di lunghezza variabile in un “digest” di dimensioni ridotte
(nello standard italiano 128 bit), sul quali si andra' poi ad apporre la
firma digitale.
H = h(P) Dove H e' il
digest, h e' una funzione di hash e P il plain text su cui viene
applicata.
Una proprieta' fondamentale di queste funzioni e'
quella di rendere impossibile ( o quanto meno molto difficoltoso)
risalire, possedendo il messaggio da esse processato, risalire al plain
text originale (dette percio' funzioni “unidirezionali” o “one way
functions”).
Un secondo requisito fondamentale e' che due
messaggi differenti sottoposti a procedura di hashing restituiscano due
risultati a loro volta differenti; se questo non avviene si ha una
collisione.
Il numero minimo di tentativi da effettuare per
individuare almeno una collisione su un codice hash di n bit e' di circa
1.17*(n)^1/2.
Perche' la codifica sia difficilmente soggetta ad
attacchi e le condizioni sopra citate si verifichino contemporaneamente,
e' necessario utilizzare una codifica hash di almeno 100 bit.
Crittografia a chiave
privata / condivisa (Shared key)
In un sistema a chiave pubblica, (ad esempio il
sistema RSA) la distribuzione delle chiavi non e' necessaria, ma questa
metodologia e' lenta, dunque per cifrare messaggi lunghi si impiegano
chiavi private, e la loro scelta e la loro comunicazione richiedono dei metodi per essere
resa sicura.
Esistono due tipologie base di instaurazione delle
chiavi:
- Ricevute da un'entita' esterna fidata (KDC=Key
Distribution Center)
- Create dai due interlocutori per comune accordo
Instaurazione delle chiavi di
sessione
Quando due utenti desiderano comunicare in una
sessione, il KDC crea la chiave di sesione e le invia a entrambi.
Kerberos
E' il protocollo principalmente utilizzato per la
distribuzione delle chiavi di sessione all'interno di reti aziendali o
LAN; come pre-requisito per poter essere impiegato richiede che tutto il
sistema in gestione sia sincrono (cioe' che gli ororlogi di tutti gli
utenti connessi siano sincronizzati).
All'interno dei messaggi scambiati, verra' indicato in seguito con T il time-stamp, cioe' l'indicazione
dell'istante di emissione del messaggio, e con L il life time, cioe' il
suo periodo di validita'.
Principio di funzionamento:
Quando un utente A chiede al KDC di essere messo
in comunicazione con un utente B, manda un messaggio in chiaro al server,
contenente il proprio identificativo e quello di B.
Il KDC calcola allora la chiave di sessione Kab e
la invia insieme all'identificativo di B, il time-stamp T e il life-time L
ad a, cifrando il tutto con la chiave pubblica di A. Inoltre il server
invia all'utente anche un secondo messaggio, contenente le medesime
informazioni del primo, eccetto che l'identificativo di B e' sostituito
con quello di A, ma questo secondo messaggio sara' invece cifrato con la
chiave pubblica di B, e viene denominato “ticket per B”.
Una volta ricevuto il messaggio del server,
l'utente A decifra la parte codificata con la chiave pubblica ad esso
relativa, lasciando invece inalterata la seconda parte cifrata con la
public key di B.
Decifrando il messaggio, A entra in possesso delle
informazioni Kab, T e L.
A questo punto l'utente A invia un messaggio a B,
composto da due parti: la prima consistente nel “ticket per B” ricevuto in
precedenza dal KDC, e la seconda, cifrata con la comune chiave di sessione
Kab, composta dal proprio identificativo e dal time-stamp.
L'utente B decifra prima il messaggio cifrato con
la sua chiave pubblica, ottenendo da questo la chiave Kab, che utilizzera'
poi per leggere la seconda parte del messaggio ricevuto, contenente il
time-stamp di A, che conferma al tempo stesso l'identita'
dell'interlocutore, il suo effettivo possesso della giusta chiave di
sessione (Kab) e l'attualita' delle informazioni ricevute (grazie al
time-stamp).
A questo punto l'operazione si conclude con la
conferma che l'utente B invia ad A, tramite un messaggio cifrato con la
chiave di sessione, contenente il valore T ricevuto dall'interlocutore
aumentato di 1.
Schema base Kerberos

- A-->KDC : [[A, B]]
- KDC-->A : [[EKa(Kab, B, T, L),
EKb(Kab, A, T, L)]] (EKb(Kab, A, T,
L)= Ticket per B)
- A-->B : [[EKb(Kab, A, T, L),
EKab(A, T)]]
- B-->A : [[EKab (T+1) ]]
Diffie & Hellman key
agreement protocol
Protocollo base per due utenti
Questo algoritmo viene impiegato due o piu' utenti vogliono stabilire una chiave di sessione effimera
senza sfruttare la mediazione di un server.
Gli utenti che applicano questo protocollo
conoscono a priori i dati
- p: numero primo
- x: elemento primitivo di Zp
Supponendo che sia l'utente ad iniziare il
protocollo, questi inviera' all'utente B un numero Ba, dato
dall'elevamento della base nota a entrambi x alla potenza Aa, scelta
scelta casualmente.
L'utente B a sua volta scegliera' un numero
random Ab e calcolera' x^(Ab), inviandolo ad A.
I due utenti potranno ora ricavare la comune
chiave di sessione con l'operazione [X^(Ab)^Aa].
Nota : Tutte le operazioni sopra citate si
svolgono nel contesto dell'algebra modulare, e sono da intendere
calcolate in modulo p.
Protocollo a gruppi
(esemplificato per 3 utenti)
Il protocollo Diffie-Hellman a gruppi permette
a un gruppo di 3 o piu' utenti di scambiarsi una chiave di sessione
effimera senza sfruttare la mediazione di un server. Il numero di
messaggi richiesto e' naturalmente maggiore al crescere del numero dei
partecipanti alla creazione della chiave: per n utenti, essi saranno
#messaggi = n* (n-1).

- X^Aa mod p = W
- X^Ab mod p = Y
- X^Ac mod p = Z
- Z' = Z^ (Aa) mod p
- W' = W^(Ab) mod p
- Y' = Y^(Ac) mod p
In questo modo ogni utente potra' calcolare la
chiave Kabc come elevamento dell'ultimo numero ricevuto al numero
casuale Aa, Ab o Ac scelto da lui in partenza.
Kabc = X^Aa^Ab^Ac.
Shamir three pass protocol
Questo protocollo puo' essere impiegato tra due
utenti per scambiarsi un'informazione riservata, come una chiave di
sessione, senza bisogno di un segreto condiviso. Tutto cio' che il
procedimento richiede per poter funzionare e' che le chiavi impiegate
dagli utenti A e B per cifrare i propri messaggi siano simmetriche e
commutative: che sia cioe' valido Eka[Ekb(P)] = Ekb[Eka(P)].
Detta X la chiave che A deve trasmettere a B, i
messaggi scambiati saranno i tre seguenti:
- A--->B :
Eka(X)
- B--->A : Ekb[Eka(X)]
(Equivalente a dire Eka[Ekb(X)] ) Quando A riceve questo messaggio
puo' applicare la propria chiave per decifrare ed ottenere Ekb(X).
- A--->B :
Ekb(X) B ha ricevuto la chiave di sessione X
codificata con la sua stessa chiave Kb senza aver fatto ricorso a nessun
segreto con A per lo scambio ne' aver dovuto ricorrere alla mediazione
di un server!
Station to station protocol
Questo protocollo e' attualmente utilizzato sulla
rete internet: prevede lo scambio di chiavi di sessione autenticato.
L'utente A calcola Ba = X^Aa e lo invia a B, come
avviene anche nel primo step del protocollo Diffie-Hellman.
B, una volta ricevuta la mezza chiave di A,
calcola a sua volta la mezza chiave di sua competenza, eseguendo Bb = X^Ab
e calcola Kab come elevamento della base nota X ad Aa e Ab. A questo punto
esegue l'hashing delle due mezze chiavi, Ba e Bb, firmandole con la sua
chiave privata Kb-1. Come ultima operazione, B invia ad A un
messaggio contenente il proprio certificato d'identita' C(B), la propria
mezza chiave Bb e il codice hash delle mezze chiavi firmato con la sua
chiave privata Ekb-1[h(Ba, Bb)].
Quando A riceve il messaggio, e' in grado di
calcolare Kab a sua volta, di controllare l'identita' di B grazie al
certificato C(B) e verificare che il codice hash calcolato
dall'interlocutore sia corretto, calcolandolo a sua volta. Il
protocollo si conclude con la certificazione dell'identita' di A e del suo
possesso delle mezze chiavi corrette: questi infatti invia a B un
messaggio contenente il proprio certificato rilasciato dalla T.A. C(A) ed
il codice hash delle due mezze chiavi firmato con la sua chiave privata
Ka-1.
Schema base:

- A-->B Ba
- B--->A [[C(B), Bb, Ekb-1[h(Ba, Bb)]
- A--->B [[C(A), Eka-1[h(Ba, Bb)]
Se i due utenti volessero verificare
reciprocamente di aver calcolato Kab nel modo esatto, essi dovrebbero
cifrare la il codice hash scambiato, oltre che con la propria chiave
pubblica, anche con la chiave Kab.
Otway-Rees Protocol
Supponendo che sia l'utente A ad inoltrare la
richiesta di poter comunicare con l'utente B tramite una chiave segreta di
sessione Kab,
- A inviera' a B un messsaggio composto da due
parti: una, in chiaro, contenente il poprio identificativo, quello di B
ed un numero casuale I, identificativo del protocollo; l'altra,
codificata con la chiave Kas, contenente un NONCE(A) e le informazioniA,
B ed I. Questa seconda parte viene detta “ticket per il server” e non
puo' essere decifrata da B
- B si limitera' dunque a leggere la parte in
chiaro e ad inoltrare al server quella cifrata, accompagnata da una
seconda parte, in chiaro, contenente le informazioni appena ricevute, ed
una terza, cifrata con Kbs, contenente un NONCE(B), I, A e B.
- Il server, ricevuto il messaggio, e' in grado
di dcifrare le informazioni contenute nela parte cifrata dai due utenti
e rispondere a B con un messaggio composto da tre parti: una, in chiaro,
contenente I; una, cifrata con chiave Kas, contenente NONCE(A) e la
chiave di sessione Kab (detta “ticket per A”); una, cifrata con Kbs,
contenente NONCE(B) e la chiave di sessione Kab.
- B invia ad A il “ticket per A” ricevuto dal
server, in modo che anch'esso possa conoscere la chiave di sessione.
Torna a inizio
pagina