Sicurezza nelle reti di calcolatori.

Introduzione

Alice e Bob sono due persone che intendono comunicare con sicurezza, ma potrebbero essere anche due router che devono scambiarsi tabelle di instradamento, oppure due host che vogliono stabilire una connessione di trasporto sicura, due applicazioni che vogliono scambiare messaggi. I nomi Alice e Bob sono stati scelti per indicare una generica entità "A" che vuole comunicare in modo sicuro con una generica entità "B".

Comunicazione Sicura

Alice manda un messaggio a Bob e vuole che solo Bob riesca a comprenderne il contenuto, perchè sul mezzo che stanno usando potrebbero esserci altre persone in ascolto. Un intruso (Trudy) può intercettare, leggere ed elaborare qualsiasi cosa venga trasmessa da Alice a Bob. Inoltre, Bob vuole essere sicuro che i messaggi che riceve provengano realmente da Alice, ed Alice vuole essere sicura che sta comunicando effettivamente con Bob. Alice e Bob vogliono anche essere sicuri che il contenuto dei messaggi scambiati non sia stato modificato durante il percorso. Queste considerazioni contengono i requisiti richiesti ad una comunicazione sicura:

Dopo aver individuato i requisiti che una comunicazione deve possedere per essere sicura, resta da specificare cosa c'è di insicuro sul canale.

Alice, il mittente, vuole inviare dati a Bob, il ricevitore. Dopo aver assicurato la riservatezza delle informazioni, l'autenticazione dei due soggetti e l'integrità dei messaggi, Alice e Bob si scambieranno, con sicurezza, messaggi di controllo e informazioni. Tutti i messaggi, o anche alcuni, saranno criptati. Un intruso passivo ascolta e registra i messaggi che vede passare sul canale, un intruso attivo può eliminare i messaggi, o può inserirne di nuovi.

Considerazioni sulla sicurezza della rete Internet

Prima di entrare negli aspetti tecnici della sicurezza di rete si consideri la rete Internet.

Un intruso può veramente ascoltare e registrare i messaggi? È facile farlo? Un intruso può rimuovere o aggiungere messaggi? La risposta è "Sì". Un packet sniffer è un programma in esecuzione su una macchina della rete che riceve passivamente tutti i frame di livello 2 che passano sull'interfaccia di rete del dispositivo. Su una rete locale Ethernet la trasmissione è di tipo broadcast, di conseguenza, il packet sniffer riceve tutti i frame che vengono trasmessi dai dispositivi della rete locale. Ogni host con una scheda Ethernet può essere sfruttato da un packet sniffer, è sufficiente che l'interfaccia di rete sia impostata per funzionare in modalità "promiscua" affinchè riceva tutti i frame in transito. I frame possono poi essere consegnati ad un programma applicativo per estrarre i dati del livello Applicazione.

Ogni dispositivo connesso a Internet invia datagrammi IP sulla rete. I datagrammi portano, oltre ai dati, l'indirizzo IP del mittente. Un utente che ha il controllo completo della macchina può facilmente modificare il campo indirizzo sorgente IP contenuto nel datagramma. Questa tecnica è detta IP spoofing. Un utente può quindi costruire pacchetti contenenti dati falsi e farli apparire come se avessero una provenienza diversa.

Nella discussione che segue "Bob" e "Alice" rappresentano due generiche entità. Potrebbero essere due persone che si scambiano mail, oppure stanno per effettuare una transazione, così come potrebbero essere due applicazioni. Si ricordi, infatti, che sulla rete viaggiano pacchetti di servizio, ad esempio verso il server DNS, oppure per lo scambio delle tabelle di instradamento tra i router. Un intruso potrebbe modificare questi pacchetti.

Principi di Criptografia

Le tecniche di Criptografia consentono ad un mittente di camuffare i dati dentro messaggi che mostrano un altro contenuto, in modo che un intruso non riesca a capire il vero messaggio. Il ricevitore deve essere capace di estrarre le informazioni nascoste nel messaggio.

Alice vuole inviare un messaggio a Bob. Il messaggio nella sua forma originale è detto testo in chiaro. Alice cripta il suo testo in chiaro usando un algoritmo di criptografia. Ottiene un testo cifrato incomprensibile ad un intruso. Nei moderni sistemi di criptografia le tecniche di criptografia sono note, pubbliche, standardizzate, e libere di essere usate da chiunque, anche da un intruso. L'intruso non conosce la chiave per decifrare i messaggi.

Alice fornisce una chiave KA, che può essere una sequenza di numeri o di caratteri, come input all'algoritmo per criptare. Questo, con la chiave KA e con il testo in chiaro, produce il testo cifrato. Bob, con il testo cifrato e con la chiave KB, applica l'algoritmo per decriptare il testo cifrato e produce il testo in chiaro originale. Nel cosiddetto sistema a chiave simmetrica, le chiavi di Alice e di Bob sono identiche e segrete. Nel sistema a chiave pubblica, la chiave di Alice è conosciuta da tutti, mentre la chiave di Bob è segreta.

Criptografia a chiave Simmetrica

Tutti gli algoritmi di criptografia sostituiscono un elemento del testo in chiaro con un elemento cifrato ottenuto mediante un appropriato calcolo, fino a produrre il messaggio criptato.

Il cifrario di Cesare associa ad ogni lettera del testo in chiaro una lettera che, nell'alfabeto, si trova k posizioni dopo (trattando l'alfabeto come un insieme circolare: dopo la z viene la a). Ad esempio se k=4, allora ogni lettera "a" nel testo in chiaro viene sostituita con la lettera "d" nel testo cifrato; la "b" nel testo in chiaro diventa "e" nel testo cifrato, e così via. Il valore di k è denominato chiave. Ad esempio il testo in chiaro "Bob, ti amo. Alice" diventa "yly, qf xjl. rifzb". Il messaggio criptato sembra incomprensibile, ma siccome la chiave può assumere solo 25 possibili valori, non è, richiesto molto tempo per decifrare il messaggio.

Un miglioramento al cifrario di Cesare si può ottenere sostituendo una lettera con un'altra senza ricorrere ad una chiave, ma usando una tabella di corrispondenza, simile al gioco "aneddoto cifrato" pubblicato sulle riviste di enigmistica. La tabella seguente mostra una possibile regola di codifica.

Lettera in chiaro: a b c d e f g h i j k l m n o p q r s t u v w x y z
Lettera cifrata m n b v c x z a s d f g h j k l p o i u y t r e w q

Tabella - Cifrario per sostituzione

Il messaggio in chiaro "bob, ti amo. alice." diventa "nkn, us ahk. Mgsbc". Anche questo sembra un testo incomprensibile, ma adesso ci sono 26! possibili accoppiamenti rispetto ai 25. La decodifica del messaggio tentando tutte le possibili 26! combinazioni, richiede molto tempo. Ma anche in questo caso se si considera la frequenza delle lettere usate, o la frequenza di parole con poche lettere (gli articoli, le preposizioni, ecc) si riesce a decodificare il messaggio. Se poi l'intruso ha un'informazione sul possibile contenuto del messaggio, è ancora più agevolato a risalire al messaggio in chiaro. Ad esempio se Trudy, la moglie di Bob, pensa che Bob ha una relazione con Alice, allora nel messaggio precedente avrebbe trovato due parole di tre e cinque lettere che rappresentano la codifica di "Bob" e di "Alice", scoprendo così 7 delle 26 coppie di lettere. In tal modo restano meno tentativi per scoprire l'intero cifrario.

Da questo esempio si possono trovare le seguenti vulnerabilità:

Un'altro algoritmo di codifica viene attribuito a Blaise de Vigenere. L'idea di base del cifrario di Vigenere consiste nell'uso di molti cifrari, dove ogni cifrario codifica una lettera in una specifica posizione del messaggio in chiaro. In questo modo la stessa lettera appare con codifica diversa nello stesso messaggio. Nella tabella che segue, il cifrario di Vigenere ha due diversi cifrari di Cesare (con k=6 e k=20), mostrati sulle righe della tabella. Si potrebbe decidere di usare questi due cifrari di Cesare, C1 e C2, secondo la ripetizione C1, C2, C2, C1, C2. Cioè, la prima lettera del testo in chiaro viene codificata con il cifrario C1, la seconda e la terza con il cifrario C2, la quarta con C1, e la quinta con C2. La codifica dalla sesta lettera in poi usa ciclicamente la stessa successione di cifrari. Il messaggio in chiaro "bob, ti amo. alice" viene così criptato: "ghu, mb ffh. tenvj". Notare che la prima lettera "b" nel testo in chiaro è criptata con la corrispondenza C1, mentre la seconda "b" è criptata usando C2. In questo esempio la chiave di codifica e di decodifica è rappresentata dalla conoscenza delle chiavi (k=4, k=20) dei due cifrari e dalla successione C1, C2, C1, C2, C2.

Lettera in chiaro a b c d e f g h i j k l m n o p q r s t u v w x y z
C1 (k=6) f g h i j k l m n o p q r s t u v w x y z a b c d e
C2 (k=20) t u v w x y z a b c d e f g h i j k l m n o p q r s

Criptografia a chiave pubblica

Dal cifrario di Cesare al 1970, le comunicazioni criptate richiedevano che i due interlocutori condividessero la stessa chiave segreta: la chiave simmetrica usata per criptare e decriptare. Il problema principale è che i due interlocutori devono accordarsi sulla chiave, probabilmente comunicandosela, quindi con il rischio che venga intercettata. Ai tempi dei romani questo scambio poteva avvenire direttamente, ad esempio due centurioni si incontravano in un luogo privato, si comunicavano la chiave e poi si separavano, ma oggi le persone si incontrano sulla rete, mai direttamente. È necessario che i due interlocutori si scambino la chiave usando una comunicazione criptata. Nel 1976, Diffie ed Hellman proposero un algoritmo (oggi denominato "scambio delle chiavi Diffie-Hellman") che consentiva di scambiare le chiavi in forma criptata. Si tratta di un approccio radicalmente diverso e molto elegante che ha portato allo sviluppo dei moderni sistemi di crittografia a chiave pubblica. I sistemi di criptografia a chiave pubblica posseggono alcune interessanti proprietà che sono poi state sfruttate anche per l'autenticazione e la firma digitale.

L'uso della chiave pubblica per criptare è molto semplice. Si supponga che Alice deve comunicare con Bob. Questi non devono scambiarsi la chiave segreta condivisa (come nel caso dei sistemi a chiave simmetrica), Bob (il destinatario dei messaggi di Alice) possiede due chiavi - la chiave pubblica che ognuno (compreso l'intruso) può conoscere e una chiave privata che conosce solo Bob. Allo scopo di comunicare con Bob, Alice deve procurarsi prima la chiave pubblica di Bob. Alice, con questa chiave e mediante un algoritmo di criptografia pubblico (cioè tutti possono conoscerlo), cripta i suoi messaggi destinati a Bob. Bob riceve i messaggi criptati di Alice e, mediante la sua chiave privata e un algoritmo pubblico, decripta i messaggi di Alice. In questo modo Alice può mandare un messaggio segreto a Bob senza scambiarsi la chiave privata.

Dato un qualsiasi messaggio m, risulta che dB(eB(m)) = m, cioè codificando il messaggio m con la chiave pubblica di Bob (eB) e poi decodificando il testo così cifrato con la chiave privata (dB), si ottiene nuovamente il messaggio m. Anche scambiando l'ordine delle chiavi si ottiene lo stesso risultato, cioè: eB(dB(m)) = dB(eB(m)) = m.

La criptografia a chiave pubblica si basa su questa semplice osservazione. Un primo problema è che un intruso, sebbene intercetti i messaggi criptati di Alice senza capirne il contenuto, conosce la chiave pubblica di Bob e l'algoritmo di criptografia usato da Alice. Trudy può allora predisporre un attacco scegliendo il testo in chiaro, cioè applica l'algoritmo di criptografia di Alice e la chiave pubblica di Bob per criptare un messaggio di sua scelta. L'efficacia dell'algoritmo a chiave pubblica si basa sulla scelta delle chiavi: deve essere impossibile o almeno estremamente difficile in pratica, determinare la chiave privata di Bob o decifrare i messaggi di Alice verso Bob. Un secondo problema è che, siccome la chiave di criptografia di Bob è pubblica, chiunque può inviare un messaggio cifrato a Bob spacciandosi per Alice. Nel caso di una singola chiave segreta, il fatto che il mittente conosce la chiave segreta, implicitamente conferma al ricevitore l'identità del mittente. Nella criptografia a chiave pubblica questa certezza viene a mancare perchè chiunque può mandare un messaggio a Bob, usando la sua chiave pubblica. Sarà necessario ricorrere ad un Certificato per collegare un'entità (come Bob) ad una specifica chiave pubblica.

L'algoritmo RSA (le iniziali dei tre matematici che l'hanno creato: Ron Rivest, Adi Shamir, Leonard Adleman) è il principale algoritmo di criptografia a chiave pubblica. Si supponga che Bob voglia ricevere messaggi criptati. L'algoritmo RSA richiede due componenti:

Per costruire le chiavi Bob deve:

Le operazioni di codifica di Alice e quelle di decodifica di Bob avvengono come segue:

Perché RSA funziona?

La criptografia RSA sembra una magia. Come succede che il processo di decodifica di un messaggio criptato restituisce il messaggio originario? Nell'aritmetica dell'orologio, o aritmetica modulare, le operazioni di addizione, di moltiplicazione e di elevazione a potenza forniscono risultati in un intervallo pari al numero n di ore sul quadrante.

Cioè il risultato di ogni operazione è il resto della divisione per n.

Nella codifica RSA, un messaggio, rappresentato da un numero intero m, viene dato come esponente al valore della chiave pubblica, usando l'aritmetica modulo n per criptare. Per decriptare il testo cifrato c viene eseguita l'elevazione di d alla potenza c, usando ancora l'aritmetica modulo n.

Il risultato dell'operazione di criptografia seguito dall'operazione di decriptografia è (me)d. Si ha:

(me)d mod n = me·d mod n

Gauss osservò alcune proprietà dei numeri primi nell'aritmetica modulare. In particolare, se p e q sono primi, ed n = p·q, allora x·y mod n è equivalente a x(y mod (p-1)(q-1)) mod n. Applicando questa proprietà si ha:

(me)d mod n = m(ed mod (p-1)(q-1)) mod n

Ma ricordando che e e d sono stati scelti in modo che e·d - 1 sia esattamente divisibile per (p-1)·(q-1), o equivalentemente che e·d diviso per (p-1)·(q-1) dia resto 1, ovvero e·d mod (p-1)·(q-1) = 1. questo porta a:

(me)d mod n = m1 mod n = m

cioè:

(me)d mod n = m.

Anche invertendo l'ordine delle potenze si ottiene ancora il messaggio originario.

(me)d mod n = m = (md)e mod n

La sicurezza di RSA si basa sul fatto che non esiste un metodo per trovare i fattori primi (p e q) di un numero, in questo caso n. Se qualcuno conoscesse p e q, allora dalla chiave pubblica e, potrebbe risalire alla chiave segreta d. La sicurezza non è garantita perchè non è stato mai dimostrato che è impossibile trovare i fattori primi di un numero in un modo diverso dal procedimento per tentativi.