Site hosted by Angelfire.com: Build your free website today!
 .   .   .   C   i   p   h   e   r   t   e   x   t   .   .   .

.   .   .   C   i   p   h   e   r   t   e   x   t   .   .   .

.   .   .   C   i   p   h   e   r   t   e   x   t   .   .   .

 

Presentazione

 

Algoritmi di cifratura

Cifratura a blocchi
Cifrari Monoalfabetici
Shifting cypher
Substitution cypher
Affine cypher
Cifrari Polialfabetici
Vigenère cipher
Permutation cipher

Cifratura DES

Cifrtura a catena
One-Time-Pad
Periodic Stream Cipher
Approfondimento
DES: Feistel cypher
DES-CBC
   DES-PCBC
  DES-ECB
  DES-CTR
  DES-CFB
  DES-ITL
DES in cascata
 
Privatezza, autenticita', integrita'
Public Key
Firma digitale
RSA
DSA
Funzioni di Hash
Shared Key
kerberos
Diffie & Hellman
Shamir Protocol
  Station to Station Protocol
Otway-Rees

Certificazione di identita'

 
Mutua Identificazione: protocolli di Needham-Shroeder
NSPK a 3 messaggi
NSPK a 7 messaggi
Certificazione da parte di un garante terzo
Certification Authorities
 
 

Riassunto di algebra modulare

e-mail

 

 

 

 

 

 

 

 

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

  1. A-->KDC : [[A, B]]
  2. KDC-->A : [[EKa(Kab, B, T, L), EKb(Kab, A, T, L)]] (EKb(Kab, A, T, L)= Ticket per B)
  3. A-->B : [[EKb(Kab, A, T, L), EKab(A, T)]]
  4. 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).

  1. X^Aa mod p = W
  2. X^Ab mod p = Y
  3. X^Ac mod p = Z
  4. Z' = Z^ (Aa) mod p
  5. W' = W^(Ab) mod p
  6. 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:

  1. A--->B  :      Eka(X)
  2. 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).
  3. 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:

  1. A-->B    Ba
  2. B--->A   [[C(B), Bb, Ekb-1[h(Ba, Bb)]
  3. 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