



























































Studia grazie alle numerose risorse presenti su Docsity
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Prepara i tuoi esami
Studia grazie alle numerose risorse presenti su Docsity
Prepara i tuoi esami con i documenti condivisi da studenti come te su Docsity
Trova i documenti specifici per gli esami della tua università
Preparati con lezioni e prove svolte basate sui programmi universitari!
Rispondi a reali domande d’esame e scopri la tua preparazione
Riassumi i tuoi documenti, fagli domande, convertili in quiz e mappe concettuali
Studia con prove svolte, tesine e consigli utili
Togliti ogni dubbio leggendo le risposte alle domande fatte da altri studenti come te
Esplora i documenti più scaricati per gli argomenti di studio più popolari
Ottieni i punti per scaricare
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Il seguente documento contiene nozioni teoriche di network security. Gli argomenti trattati sono i seguenti: - Algoritmi di cifratura: basi, algoritmi - crittografia simmetrica: DES (molto dettagliato), 3DES - stream cipher - metodi di utilizzo dei block cipher - funzioni hash - Modification Detection Codes - Message Authentication Codes - Algoritmi RSA e Diffie-Helman nel dettaglio - protocolli di autenticazione e attacchi sicurezza WAWN, LAN - GSM, WPA, EPA, PGP, S/MIME
Tipologia: Appunti
1 / 67
Questa pagina non è visibile nell’anteprima
Non perderti parti importanti!




























































Autenticazione: procedura che viene usata per verificare l'identità di qualcuno o qualcosa Controllo degli accessi: capacità di discriminare tra i diritti di ognuno dei partecipanti ad una sessione di comunicazione. Per poter fare controllo degli accessi, è necessario prima fare autenticazione. Confidenzialità, riservatezza: soltanto gli utenti autorizzati devono avere accesso alle informazioni protette. È necessaria prima l'autenticazione. Protezione d'integrità: garantire che nessuno abbia modificato il contenuto di un messaggio. In generale, si tratterà di garantire che nessuno possa modificare il messaggio senza essere scoperto. Non ripudio: garanzia, che si può dare ad un messaggio, che il mittente non possa negare di aver scritto un messaggio. Dall'altra parte, il non ripudio può essere visto come la garanzia che il destinatario, una volta ricevuto un messaggio, non abbia la possibilità di dire di non averlo mai ricevuto. Gli attacchi possono essere commessi nei confronti sia dei protocolli di crittografia che di rete. In generale, si distinguono due tipi di attacco: Attivo, in cui l'attaccante è in grado di generare traffico da immettere nella rete; Passivo, in cui l'attaccante si limita ad intercettare il traffico in una o entrambe le direzioni, per avere accesso a dati riservati. La crittologia è l'insieme di diverse discipline tra cui:
è l'alfabeto, un insieme finito di elementi con cui rappresentare un messaggio. è l'insieme dei possibili messaggi che si possono voler trasmettere, in chiaro. è un elemento di , un messaggio che si vuole trasmettere.
è l'insieme dei possibili messaggi che si possono voler trasmettere, in forma cifrata. In generale, si ha è il messaggio , ma in forma cifrata. è rappresentato con l'alfabeto. è l'insieme di tutte le chiavi possibili. è una chiave,. Lo schema generico è il seguente: La coppia è il keypair, la coppia di chiavi che servono per poter comunicare. L’algoritmo di cifratura è ed è una biiezione. L’algoritmo di decifratura è In generale, l'algoritmo deve essere una biiezione, in modo tale da garantire che possa essere invertita; ogni elemento deve avere un unico rappresentante , così come deve avere un unico rappresentante.
Un algoritmo di tipo block cipher (cifratura a blocchi) è un algoritmo che accetta soltanto messaggi di una certa lunghezza; se il messaggio è più lungo, quindi, questo dovrà essere spezzettato. Sia che sono messaggi lunghi esattamente bit, che è la lunghezza del blocco, mentre le chiavi e possono avere, in generale, lunghezze diverse. Quando il blocco è lungo , si ha cioè, la lunghezza del blocco incide sul numero massimo di possibili messaggi che ci possono essere (tipicamente, ). Ad ogni coppia corrisponde esattamente un unico , quindi se un certo appare più volte all'interno del messaggio originale, allora anche apparirà più volte nel messaggio cifrato. Si dice, allora, che è un sistema senza memoria.
L'entropia è una grandezza che definisce il livello di incertezza a cui è soggetta una variabile casule, indica qual è il grado di casualità associata ad un fenomeno. Se per esempio ad un evento è associata tutta la probabilità allora l'entropia sarà nulla perché la variabile casuale ha un risultato deterministico, con probabilità. Si ha: se e soltanto se c'è un per un qualche e c'è , cioè non c'è alcuna incertezza sul risultato della variabile casuale. , cioè tutti i risultati sono equiprobabili, non si può predire assolutamente nulla del risultato che si avrà da ogni singolo esperimento. L'entropia associata ad un messaggio è l'incertezza associata all'osservazione di all'uscita del canale di comunicazione. Con indicheremo, da qui in avanti, l'entropia associata alla chiave dell'algoritmo di cifratura. Vedremo che la chiave migliore è quella con la massima casualità nei bit, il che significa che tutti i bit sono equiprobabili nella scelta della chiave: questo fenomeno è strettamente legato all'entropia; in particolare, cercheremo la chiave ottima attraverso la massimizzazione dell'entropia. Nel caso di uno spazio di chiavi grande (cioè è il numero di bit), l'entropia associata deve essere
Un algoritmo di cifratura offre la segretezza perfetta se, e solo se, e sono statisticamente indipendenti. Questa definizione di segretezza perfetta è di Shannon e dice che: Osservando non si deve poter dedurre alcuna informazione di ; L’incertezza su dopo aver osservato deve essere la stessa che si aveva prima di osservare. Affinché un algoritmo possa offrire la sicurezza perfetta, è necessario che cioè, l'entropia della chiave deve essere maggiore o almeno uguale a quella del messaggio di partenza. L’unico algoritmo che offre la perfect secrecy è l'algoritmo di Vernam, o one-time-pad.
Tra le ipotesi si ha: La chiave è lunga esattamente quanto ; La chiave non può essere usata più di una volta; Il generatore di numeri casuali usato per generare la chiave è perfetto: ogni singolo bit ha probabilità di valere 1; ed sono statisticamente indipendenti. Questo algoritmo consiste nel porre in XOR e. Si deve poi trasmettere la chiave attraverso un canale sicuro, mentre il messaggio può essere trasmesso su un canale insicuro. Il ricevitore non dovrà far altro che porre nuovamente in XOR le due stringhe (ora perfettamente casuali) per ottenere nuovamente il messaggio originale. Appurato che la sicurezza perfetta non si può ottenere, possiamo però pensare che questa possa essere un limite superiore a cui far tendere un generico algoritmo di cifratura. 1b- Crittografia simmetrica Nel caso di algoritmi di cifratura simmetrici, Alice e Bob sono in possesso della stessa chiave di cifratura k che condividono: questa chiave permette loro di comunicare attraverso un canale insicuro. Il problema principale di questo approccio è la distribuzione della chiave.
Scopi principali della cifratura a blocchi sono: Fare in modo che ciascun bit di dipenda da tutti i bit di e di : Rendere il più difficile possibile trovare una qualsiasi relazione statistica tra ed senza conoscere ; Cambiare un singolo bit di dovrebbe significare che ogni singolo bit di ha il 50% di probabilità di essere cambiato; Cambiare un singolo bit di dovrebbe significare un cambiamento di. Substitution cipher Sono una sottoclasse semplice degli algoritmi a blocchi. Si usa la chiave come indice delle possibili permutazioni su. Imponendo i messaggi di lunghezza , ogni chiave sarà lunga bit, con.
modo tale da amplificare l'effetto valanga: infatti, se si facesse lavorare l'algoritmo per una sola volta, un bit cambiato avrebbe effetto soltanto su bit (il singolo blocchetto su cui è operata la sostituzione); al contrario, a noi interessa che, se viene cambiato un solo bit della parola originale, tutti i bit del testo cifrato risultino invertiti con probabilità.
L'algoritmo di cifratura DES è simmetrico a blocchi, in cui Il numero di bit del blocco è bit; La lunghezza della chiave è bit, più altri 8 bit di ridondanza (che servono per proteggere la chiave da errori). Questo algoritmo è stato pensato per essere molto efficiente se implementato in hardware, e molto inefficiente se implementato in software; infatti, il DES lavora sui singoli bit, mentre i processori devono gestire almeno 8 bit per volta (nei processori moderni, 32 o 64). Il primo e l'ultimo stadio, le permutazioni, sono indipendenti dalla chiave, ed hanno come unico scopo quello di rendere meno efficiente l'implementazione in software dell'algoritmo. L'algoritmo, inoltre, può essere usato sia per cifrare che per decifrare, cambia soltanto il modo con cui si devono derivare le sottochiavi. Il generatore di sottochiavi si occupa di derivare delle chiavi da 48 bit, una per ogni step dell'algoritmo. Nel caso in cui si stia decifrando invece che cifrare, allora le chiavi andranno usate in ordine inverso per i vari step. Le permutazioni iniziale e finale, che non sono casuali, sono una lo speculare dell'altro, cioè si annullano a vicenda. Questa loro proprietà fa sì che la stessa implementazione possa essere usata sia per cifrare che per decifrare il testo.
Generatore di sottochiavi Gli step dell'algoritmo
Note finali su DES Le chiavi scelte possono essere di tre tipi:
Le chiavi e nel 3DES sono usate in cascata: cioè: Si cifra il testo con DES e con la chiave ; Si decifra il risultato con e con la chiave ; Si cifra nuovamente con DES e con la chiave. Questo utilizzo delle chiavi permette la compatibilità con il DES originale: infatti, basta usare ed il risultato è un DES (3 volte più lento) compatibile con l'originale. Questo fatto è possibile grazie proprio alla natura simmetrica del DES.
Gli algoritmi di cifratura a flusso sono un particolare tipo di algoritmo di cifratura a blocco, in cui abbiamo dei blocchi molto piccoli (di solito, da 1 bit fino a 8 bit), ma l'algoritmo è detto statefull, cioè viene preso in considerazione uno stato, una condizione dell'algoritmo, dovuto a ciò che è stato cifrato precedentemente. Con un algoritmo di questo tipo, non si può più creare un attacco di tipo probabilistico, perché la stessa sequenza di bit nel messaggio sarà codificata con due blocchi diversi in. Stream cipher sincroni Come possiamo vedere dal grafico, la chiave viene usata per generare iterativamente delle sottochiavi da usare all'interno di una funzione , che di norma è uno. In questa maniera, ogni singola sottochiave generata è lunga esattamente come il blocco che viene cifrato, quindi anche i blocchi di testo cifrato e non cifrato corrispondono tra loro. Con questo approccio, siamo lontanissimi dalla perfect forward secrecy. Per decifrare, si ha lo schema:
Nel caso in cui il testo da cifrare sia più lungo della dimensione del blocco, per poter usare un algoritmo di cifratura a blocchi, servono delle regole. Ci sono diversi modi di operare, con vantaggi e svantaggi, tuttavia nessuno di questi può garantire l'integrità dei dati o l'autenticazione del mittente, ma soltanto la confidenzialità tra chi cifra e chi decifra, indipendentemente da chi essi siano. Electronic Code Book (ECB) ECB è la modalità di utilizzo dell'algoritmo più semplice in assoluto. Ad un blocco del messaggio corrisponde un blocco del testo cifrato. Un utilizzo di questo tipo espone ad attacchi non solo passivi (come l'analisi di frequenza), ma anche attivi, come per esempio il man in the middle: chiunque può cambiare il messaggio, oppure rimandarlo successivamente (replay attack), o anche solo modificare l'ordine con cui vengono mandati i blocchi. Si tratta di un protocollo molto semplice, in cui gli errori si propagano solo all'interno del singolo blocco. Meglio non usarlo. Cipher Block Chaining mode (CBC) CBC è il tentativo di inserire un po' di memoria all'interno di un algoritmo a blocchi. Anche in questo caso, gli errori non si propagano, se non al blocco interessato ed al successivo. Interessante notare come, in presenza dello stesso blocco in posizioni diverse, il testo cifrato non è
identico: questo fatto rende il protocollo molto più sicuro dal punto di vista degli attacchi di frequenza. Se da un lato un algoritmo di questo tipo è molto più sicuro dell'ECB da modificazioni dell'ordine dei blocchi, questi possono sempre essere aggiunti o modificati in una maniera tale da rendere il tutto predicibile. Ovviamente, visto che c'è un vettore di inizializzazione IV, questo dovrà essere casuale e non dovrà essere usato due volte. Output FeedBack mode (OFB) OFB è il punto di congiunzione tra gli algoritmi di cifratura a blocco ed a flusso. Con questo metodo di cifratura, abbiamo tre diversi flussi di dati: il messaggio in chiaro, ; la chiave generata, ; il testo cifrato,. Questo tipo di cifratura non propaga gli errori, dal momento che qualsiasi errore nel testo cifrato influenza soltanto il blocco all'interno del quale si trova l'errore. È da notare il fatto che la chiave generata, cioè il flusso di bit , può essere calcolato in anticipo, partendo dalla chiave , senza nemmeno conoscere il messaggio che si dovrà poi mandare. Questo stesso flusso, inoltre, può avere la dimensione che si preferisce, da blocchi di un singolo bit a un unico blocco totale. Un difetto di questo approccio è il fatto che l'algoritmo non è protetto dalla perdita di dati: se manca anche un solo bit tutto il flusso che segue risulta sbagliato (è uno stream cipher sincrono). Si noti anche il fatto che non è necessario che la funzione sia invertibile, infatti si usa sempre in senso diretto (non applicabile in caso di cipher asimmetrici).
Le funzioni di hash possono essere con o senza chiave; se sono senza chiave, vengono chiamate Modification Detection Code (MDC), altrimenti sono chiamate Message Authentication Code (MAC). Lo scopo degli MDC è garantire la protezione d'integrità dei dati, cioè garantire che il messaggio di cui si possiede il digest è proprio quello che si sta leggendo. Nel caso in cui si abbia a che fare con dei MAC, allora gli scopi sono non solo la protezione di integrità, ma anche l'autenticazione dell'autore del messaggio. Lo scopo principale è fare in modo che trovare due messaggi che collidono significhi calcolare almeno hash, dove è la lunghezza dell'hash stesso.
Gli algoritmi MDC devono avere alcune proprietà, tra cui: Preimage resistance, deve essere impossibile calcolare il messaggio a partire dal digest. Questa proprietà è importante, perché tra gli usi che si fa degli MDC c'è quello dell'autenticazione, dove l'utente si autentica al server mandando il digest dove la challange è una stringa casuale di bit imposta dal server (cosa da non fare, è troppo pericolosa). Weak collision resistance, deve essere possibile, dato , trovare un messaggio tale per cui. Questo fatto è essenziale per le cosiddette firme digitali. Quello che si fa, infatti, è andare a firmare il digest del messaggio (che di solito è più corto del messaggio stesso), in modo tale da non rendere il calcolo della firma e la verifica un lavoro troppo oneroso per i calcolatori (pensiamo, ad esempio, al chip integrato in una smartcard, ha pochissima potenza computazionale). Se l'MDC non è sicuro da attacchi di questo tipo, allora sarà facile trovare un messaggio arbitrario che risulti esser stato firmato da qualcuno. Strong collision resistance, deve essere impossibile trovare una qualsiasi coppia di messaggi ed che abbiano qualsivoglia digest. Questo fatto è importante perché l'attaccante potrebbe avere qualche potere sul messaggio da firmare; in questo caso, vale la regola che (se l'MDC è sicuro) la resistenza della funzione di hash è direttamente proporzionale alla lunghezza del digest. One-way property, deve essere impossibile ricavare il testo del messaggio a partire dal suo digest. Perché un MDC offra questa proprietà, ci deve essere una dimostrazione; ad oggi, non esiste alcuna dimostrazione che provi questa proprietà per nessun MDC usato, se non sotto certe ipotesi non sempre verificate; nonostante questo, può essere dimostrata la complessità computazionale minima per ricostruire il messaggio, dato il digest. Funzioni di hash iterative Quello che si fa con le funzioni iterative è dividere il messaggio in blocchi e continuare a comprimere questi blocchi fino a raggiungere la lunghezza finale del digest.
La funzione di compressione lavora su bit, quindi servono iterazioni della funzione per avere il risultato in bit da dare alla trasformazione finale. La funzione è dove il primo elemento è un vettore di inizializzazione , che può essere un valore predefinito (non deve essere casuale, altrimenti la funzione non sarebbe ripetibile), oppure una funzione del messaggio stesso. MD L'algoritmo MD5 è stato pubblicato nel 1991 con l'RFC 1321, ed è il successore dell'MD4. Per questo protocollo Il messaggio può avere qualsiasi dimensione; La lunghezza del digest è di 128 bit; La funzione di compressione lavora con blocchi di dati da 512 bit ed è a 4 passi. Per ovviare al fatto che il messaggio potrebbe non essere lungo esattamente un multiplo della dimensione del blocco , si ha un padding. Quindi, il testo passato alla funzione di compressione è composto da Il messaggio da proteggere; Un bit a ; Tanti 0 quanti ne sono necessari; La lunghezza del messaggio, espressa in 64 bit. Da questo limite si ha che, se la lunghezza del messaggio è superiore, il numero contenuto in questo campo sarà espresso in modulo 64. Nell'algoritmo MD5 non è prevista la trasformazione finale g. MD5 è molto veloce, ma la sua sicurezza sta diminuendo progressivamente (bastano 2^45 tentativi per trovare due messaggi che collidono). SHA- SHA-1 è un algoritmo MDC pubblicato nel 1993. In SHA-1: Il messaggio deve essere lungo al massimo bit; Il risultato del digest è lungo La dimensione del blocco della funzione di compressione è 512 bit. La funzione di compressione è a 5 passi.
1d- Crittografia asimmetrica Il concetto principale che sta dietro alla crittografia asimmetrica è che esistono alcune operazioni che sono estremamente semplici da fare in una direzione, mentre sono estremamente difficili da fare in senso inverso. Per esempio, dati e due numeri primi, è semplicissimo calcolare ma è difficilissimo, trovare e a partire dal solo. Tutta la sicurezza degli algoritmi di cifratura asimmetrici si basa proprio sul presupposto che, per risolvere certi problemi, gli algoritmi usati sono estremamente inefficienti. Definiamo la chiave pubblica di Alice, la chiave privata e l'insieme il keypair, la coppia di chiavi personale di Alice. Il messaggio in chiaro è , il messaggio cifrato è. L'algoritmo di cifratura asimmetrico è rappresentato da , mentre l'algoritmo per decifrare è. Una delle proprietà fondamentali delle chiavi è che deve essere computazionalmente impossibile ricavare la chiave privata a partire dalla chiave pubblica. Uno dei problemi principali che ancora oggi affligge il mondo della crittografia è la distribuzione delle chiavi: in che modo Bob ha la garanzia di possedere la vera chiave pubblica di Alice, e non per esempio la chiave pubblica di Trudy che gliel'ha data facendo finta di essere Alice? infatti, lo scambio delle chiavi avviene nello stesso luogo (internet) in cui avviene lo scambio dei dati. Come detto, la crittografia asimmetrica si basa su problemi irrisolti della matematica discreta. Si ha: Logaritmi discreti Diffie-Hellman, ElGamal e DSS; Fattorizzazione discreta RSA; La crittografia asimmetrica si propone di risolvere tre diversi aspetti della comunicazione tra le persone: Mantenere la confidenzialità tra due persone; l'algoritmo più usato a tal scopo è RSA. Generare firme digitali; le firme sono utili per l'autenticazione, per la protezione dell'integrità dei dati e per il non ripudio dei messaggi. Per questo scopo si possono usare gli algoritmi RSA, ElGamal e DSS. Derivare delle chiavi effimere da usare per comunicazioni segrete e non recuperabili; per questo obbiettivo si possono usare Diffie-Hellman ed RSA.
D'ora in avanti, lavoreremo soltanto con numeri interi in. Numero primoSi dice numero primo un numero intero divisibile soltanto per se stesso e per.
grande numero intero positivo che divide entrambi due numeri e , con resto. Per definizione, vale Numeri coprimiUna coppia di numeri e è coprima se
quando vale L'operatore è quella funzione che restituisce il resto della divisione del numero per il numero , che è il più piccolo numero non negativo tale per cui. Il valore è detto resto. Allora, due numero e sono congruenti in modulo se, divisi per , danno lo stesso resto; in questo caso, e sono detti equivalenti in modulo. Proprietà dell'operatore modulo Moltiplicativo inverso il moltiplicativo inverso del numero è quel valore tale per cui cioè Teorema: Dimostrazione L'insieme dei numeri che dividono divide anche , dove se un numero divide sia che , allora divide anche , se divide sia che , allora divide anche. Algoritmo di EuclideL'algoritmo di Euclide serve per calcolare il massimo comun divisore di due numeri, applicando ricorsivamente il teorema precedente. Insieme L'insieme è l'insieme di tutti i numeri. Per esempio, si ha Insieme L'insieme è l'insieme di tutti i numeri che sono anche primi con. Ad esempio, si ha È da notare che il numero non appartiene a , perché per definizione vale quindi e non sono coprimi. Il gruppo è abeliano, cioè: