Sei sulla pagina 1di 14

/ utilizzata in principio per assicurare riservatezza.

Ora contiene tutti i


meccanismi basati sull'eleaborazione di dati che servono per ottenere: integrità,
autenticazione e non rinnegabilità.

/ i protocolli di rete sono pensati per un ambiente in cui ci si può fidare gli uni
degli altri.
- È facile fare IP SPOOFING, cambiare l'ip mittente su un messaggio.
- Il protocollo ARP serve per sapere quale indirizzo MAC sia associato a un
ip, anche in questo caso una macchina che riceve una risposta ARP non ha modo di
verificare che la risposta sia quella vera. Spesso gli OS accettano risposte
ARP anche se non sono state fatte richieste.
- Dati trasferiti tramite protocolli HTTP, SMTP, FTP, TCP
- Se l'atk ha accesso a questi dati può eludere la riservatezza dei dati e
modificare i contenuti del pacchetto
- se un utente vuole usare servizi web (email, ebanking) c'è il problema di
autenticazione. Sul web si inviano dei pacchetti dove però il mittente può
essere modificato
- i documenti possono essere modificati in modo fraudolento
- firma (ex: un contratto)
Per risolvere questi problemi si utilizzano gli algoritmi crittografici.

/ per capire la differenza tra algoritmi che utilizzano e non la crittografia si


considerano 3 modi per avere una garanzia di comportamento corretto nel corso
dell'esecuzione di un protocollo
- protocolli arbitrati: un'entità esterna controlla l'esecuzione del
protocollo così da verificare che A e B non commettano scorrettezze. Servono però
tanti arbitri fidati da ambo le parti
- protocolli giudicati: la terza parte fidata non controlla tutto l'andamento
ma A e B raccolgono dati sull'andamento, se si accorgono di qualcosa di
sbagliato si rivolgono alla terza entità. Questo protocollo soffre meno
dipendenza dalla terza identità ma i due utenti devono comunque lavorare di più per
raccogliere dati.
- protocolli autogaranti: da solo è sufficente a verificare la coorettezza
dei partecipanti. Quando B riceve il messaggio da A può controllare che sia tutto
a posto. Questo meccanismo appesantisce il protocollo a livello crittografico

/ Supponiamo di parlare di un sistema di cifratura. Abbiamo un messaggio in chiaro


dato in input a un algo che lo cifra e in output otteniamo il testo cifrato. Questo
viene spedito a B che lo da a un algo di decifratura ottenendo il testo in chiaro.
Un algo di questo tipo si chima AD USO RISTRETTO dato che l'algoritmo deve essere
chiaro solo ad A e a B. Se C ne entra in possesso non è più utilizzabile.
Perciò l'algo non è commerciabile o distribuibile. Inoltre non sono molto efficaci.
Se per fare la cifratura l'algoritmo prende una fotografia e ci scrive il messaggio
(magari con un inchiostro cangiante), il file in output è una semplice foto e l'atk
non ha modo di capire il protocollo. Se l'atk capisce che è un bitmap senza
intestazione basterà inserirla e potrà vedere l'immagine.

/ gli algo AD USO GENERALE hanno due proprietà:


- la segretezza dell'algo non è richiesta: se si viene a conoscenza dell'algo
il sistema rimane protetto (spesso tenuto segreto per questione di copywrite)
- la sicurezza dell'algo non dipende dalla segretezza
Serve quindi un'informazione aggiuntiva, la CHIAVE DI CRIFRATURA/DECIFRATURA. Le
chiavi devono essere mantenute segrete. L'atk può scoprire la chiave, questa deve
quindi essere semplice da sostituire.
L'algo prende il testo e la chiave di cifratura restituisce il testo cifrato.
L'algo di decifratura prende il testo cifrato, la chiave di decifratura e
restituisce il messaggio in chiaro. Serve però anche un algo che, con un input
casuale, restituisce le chiavi di cifratura
Se facciamo un utilizzo di riservatezza è importante tenere segreta la chiave per
decifrare.

/ Se le due chiavi sono uguali l'algo viene detto A CHIAVE SIMMETRICA.


- Per un algo che serve all'inegrità l'algo genera una prova d'integrità con
una chiave k e il messaggio in chiaro e ritorna il messaggio con la prova di
integrità.
- L'algoritmo per verificare l'autenticità prende in input il messaggio, la
prova di autenticità, la chiave e restituisce true o false.
- Se si tratta di identificazione sicura si usa la chiave per generare una
prova di identità, la prova viene utilizzata per verificare l'identità con la
chiave k e restituisce true o false

/ ci sono sistemi che utilizzano due chiavi diverse, una per la cifratura e una per
quella di decifratura.
- per l'integrità è importante mantenere segreta quella di decifratura
- per la verifica d'integrità quella per generare il sigillo
- per l'identificazione quella per generare la prova
Questi sono detti sistemi A CHIAVE ASIMMETRICA o A CHIAVE PUBBLICA

/ ONE TIME PAD: algo di cifratura a chiave simmetrica. Ci serve un algo per
generare la chiave, uno per cifrare e uno per decifrare.
Quello per la chiave è un generatore casuale di stringhe, quello di cifratura è uno
XOR come quello di decifratura.
Supponiamo di voler cifrare una stringa "10110011" lo mettiamo in xor con k
"11010010" => "01100001".
Per decifrare si fa lo xor tra il cifrato e la chiave ottenendo di nuovo il testo
in chiaro.
Se sono verificate le proprietà:
- k generata in modo casuale
- k lunga quanto m
- k usata solo una volta
Allora il cifrario è a SEGRETEZZA PERFETTA, il che significa che l'atk a partire
dal testo cifrato (a patto che sia disponibile a lui) può solo risalire alla
lunghezza del testo in chiaro.
Se si utilizza una chiave più corta, quindi riutilizzata per fare lo xor, l'atk può
acquisire più info. Se il testo in chiaro è 11001001 e la chiave 1001 (che
replicata diventa 10011001) il cifrato sarà 01010000. L'atk vedendo il cifrato può
capire quali bit solo uguali nel chiaro (~ ALLEGATO 1). Questo è un caso estremo
che viola le tutte le proprietà. Se si usa un algo pseudocasuale si possono dare
comunque informazioni percentuali all'atk.
La chiave deve essere scambiata e per scambiare un giga di testo bisogna scambiare
un giga di chiave. Per scambiare la chiave si può inviarne una fino a che non siamo
sicuri che il ricevente non l'abbia ricevuta. Questo non è però applicabile in
certi campi. Bisogna trovare una soluzione per scambiare una chiave più piccola e
maneggevole senza andare per tentativi. Inoltre questo algo ha un altro problema,
siccome cifratura e decifratura avvengono con successo solo se il testo e la chiave
sono perfettamente allineati, l'atk potrebbe inserire nel testo cifrato bit scuri
potrebbe disallineare il testo cifrato dalla chiave in questo modo la decifratura
sarà impossibile

/ la sicurezza di one time pad si basa sulla TEORIA DELL'INFORMAZIONE, cioè il


testo cifrato non contiene informazioni per estrarre il testo in chiaro se non è
nota la chiave.

/ Data la bassa realizzabilità dello scambio chiave, si rinuncia alla prop della
segretezza perfetta data dalla teoria dell'informazione e la si ottiene dalla
TEORIA DELLA COMPLESSITÀ. Dato il testo cifrato sarà possibile estrarre info sul
testo in chiaro ma per farlo servono molte risorse (spazio, tempo, ...). In questo
modo si può virtualizzare la segretezza perfetta

/ PSEUDOCASUALE: una sequenza prodotta da un algo non può mai essere casuale, il
generatore è buono quando è difficile distinguere la sequenza pseudocasuale da una
casuale, se ciò avviene è difficile trovare regoralità in S e quindi da C estrarre
informazioni di P.

/ CIFRARI A FLUSSO: dato un testo in chiaro P e una chiave K, K viene data a un


generatore di sequenze casuali (PRNG, pseudo random number generator). Questo
genera una sequenza pseudocasuale S. P viene messo in xor con S.
Per la decifratura abbiamo C e K, la K viene data al PRNG creando la stessa S, si
fa xor tra C e S riottenendo P.
P viene messo in xor con S e non con K, anche se K viene scelta in modo casuale S
avrà delle regolarità poichè proddotta da un algo, il che significa che se sono
note le regolarità di S guardando C si possono ottenere delle info (come in one
time pad). Perciò questo algo non è a segretezza perfetta.
La robustezza di un cifrario a flusso dipende dal PRNG.
Nel ifrario a flusso, se si usa due volte la stessa chiave K (per cifrare P1,K ->
C1=Sk xor P1 e P2,K -> C2=Sk xor P2), con |P1|==|P2|. Il cifrario diventa
vulnerabile ad attacchi di tipo KNOWN PLAINTEXT xk l'atk avendo P1, C1 può ottenere
Sk, Se poi fa xor tra C2 e Sk ottiene P2.

/ RC4: (~ codice, da non imparare). Utilizzato dall'87 al 2015. L'algo è molto


semplice il che è importante nella sicurezza poichè permette di analizzare meglio e
trovare bachi nel codice più facilmente. Venne utilizzato come cifrario per WEP, un
protocollo per la comunicazione wifi tra dispositivo e un access point wifi. WEP
utilizzava RC4 male poichè usava una sola porzione della chiave lasciando il resto
fisso. Con troppa frequenza quindi la chiave si ripeteva. Sostanzialmente risalire
alla chiave di cifratura non era così difficile (5 min circa). Da notare che non è
una vulnerabilità di RC4, ma del protocollo.

/ Il pensionamento degli algoritmi è un aspetto tipico degli algoritmi. Tipicamente


in sicurezza vengono proposti algo che vengono studiati e testati prima di essere
adottati senza garanzia formale della sicurezza. Non ci sono mai dimostrazioni
della loro robustezza e se ci sono sono relative. Con il tempo saltanop così fuori
delle vulnerabilità. Gradualmente quindi l'algo viene abbandonato.

/ SALE: stringa pseudocasuale che viene generata per creare la chiave di cifratura
assieme alla password (su openssl rc4). Quest'opzione esiste per cifrare ogni volta
con una chiave diversa anche se si usa la stessa password (~ ALLEGATO 2). Se lo si
utilizza questo verrà salvato nel testo cifrato. Un esempio sono le passw salvate
su server. Se le password vengono trasformate in hash e poi salvate un atk dovrà
solo fare tanti tentativi prima di trovarne una. Se invece si utilizza il sale
l'atk dovrà fare tentativi diersi per ogni possibile password che vuole provare, un
tentativo per ogni sale utilizzato. Questo richiama infatti la vulnerabilità di
Hash usato senza sale.

/ gli attacchi a cifrari si classificano anche sulla base delle informazioni


disponibili all'atk. Più info sono a lui disponibili, più lui è forte e più
l'attacco è pericoloso. Un cifrario che resiste ad attacchi più forti è un cifrario
più robusto.

- L'attacco basilare è il CIPHERTEXT ONLY ATTACK dove l'atk conosce


# algoritmo
# un testo cifrato C
Gli obbiettivi dell'atk sono decifrare C oppure ottenere K. Un cifrario che
non resiste a questo attacco è inutile
Un altro più pericoloso è il KNOWN PLAINTEXT ATTACK dove l'atk conosce
# algo
# P e C, una o più coppie

- L'obbiettivo è decifrare un nuovo testo cifrato oppure scoprire K.


Ancora più robusto è il CHOSEN PLAINTEXT ATTACK dove l'atk conosce:
# algo
# ha la possibilità di scegliere un P ed ottenere C
La versione statica consiste nello scegliere una serie di P e ottiene una
serie di C su cui lavora per decifrare un altro testo oppure ottenere K.
La versione adattiva, più forte, consiste nel richiedere P1, ottenere C1 e
fare delle elaborazioni per poi richiedere P2, ottenere C2, fare delle
elaborazioni, ecc.. Qui non si devono scegliere tutti i P all'inizio ma man mano
che fa le elaborazioni.

- Un attacco CHOSEN CIPHERTEXT l'atk conosce:


# algo
# può scegliere Ci ed ottenere Pi
Anche qui c'è una versione statica e una adattiva, analoga al precedente.
L'obbiettivo è decifrare un nuovo testo cifrato oppure ottenere K.
In alcuni questi due possono essere combinati nel CHOSEN TEXT nel caso in cui
l'atk possa scegliere P o C ed ottenere i corrispondenti.

/ ATTACCHI A FORZA BRUTA AI CIFRARI: per fare un attacco a forza bruta a un


cifrario l'atk deve avere
- alog
- sapere se accetta chiavi di lunghezza diverse
- qual'è la lunghezza della chiave utilizzata
- avere un C
- avere info sulla struttura del P, deve sapere cosa sta cercando (un pdf in
inglese, una lettera tra due aziende, un immagine particolare, ...)
Dati questi elementi l'atk usa l'algo di decifratura su C usando come K tutte le
possibili chiavi utilizzabili. Ogni volta viene generato un P diverso, l'atk
guardandoli può capire se è quello che stava cercando.
Più informazioni ha sul P cercato più è veloce nel decifrarlo.
Se trova più candidati o vuole sapere la chiave oppure vuole esattamente sapere
qual'è il P dovrà procurarsi un altro C e ripetere l'operazione, la poswsibilità
che un C2 con la stessa K generi qualcosa di sensato e che la K sia sbagliata è
veramente basso.
Questo è un simil cipher text only, simile xk l'atk deve avere info anche su P.
Il costo di questo attacco sta proprio nel provare tutte le possibili K
dell'insieme. Se K è formata da n bit l'atk deve fare 2**n tentativi. Se quindi la
len della K è abbastanza grande per trovare quella giusta può esserci bisogno di
troppo tempo.

/ One time pad è l'unico cifrario che non può essere scalfito da un attacco a forza
bruta. Se l'atk prova a fare xor tra C e varie K ottiene 2**m P. Si sa che |C|==|
Ki|==m, quindi si hanno 2**m k. Inoltre se |C|==m allora |P|==m, se guardiamo tutte
le possibili sequenze di bit di lunghezza m sappiamo che sono 2**m. Allora
l'attacco a forza bruta ha prodotto tutte le possibili sequenze di bit lunghe m e
quindi non ha dato nessuna info all'atk. (~ non ho capito perchè anche sapere info
su cosa sta cercando non serve a nulla)

/ nei cifrari a flusso non c'è bisogno che K sia lunga quanto P. Sia |K|==n e |P|
==m di solito n<<m.
Negli attacchi a forza bruta l'atk parte da C e testa tutte le K producendo così
2**n P. Ma |C|==|P|==m, quindi ci sono 2**m testi candidati ad essere un P. Mentre
in one time pad le stringhe di bit candidate e le stringhe di bit ottenute sono le
stesse, qui avremo che 2**n <<<< 2**m. (di solito n= 128,256 bit e m possono essere
kB o GB).
Un attacco a forza bruta su un sistema in cui n<<m resrtringe moltissimo le
possibilità, quindi più le restringe e più info ha l'atk più è facile che tra i
testi trovati ci sono candidati per ciò che l'atk sta cercando.
Nella crittografia moderna |K|<<|P|==|C| sempre.

/ riutilizzare una chiave in un cifrario a flusso comporta delle vulnerabilità. La


Si generata da Ki è sempre la stessa, l'atk può quindi utilizzare una coppia P1,C1
per decifrare un C2.

/ CIFRARI A BLOCCHI: cifrari a chiave simmetrica, l'algo di cifratura prende in


input P e K e restituisce C. L'algo di decifratura prende C e K e restituice P (~
ALLEGATO 3). Il testo in chiaro non viene gestito come un flusso ma lo si valuta
nella sua interezza e lo si divide a blocchi, di una dimensione prefissata, e poi
elaborano un blocco alla volta. Se la len del chiaro non è un multiplo della len
del blocco aggiungono un complemento (padding) per avere un altro blocco intero. In
realtà anche se il padding viene aggiunto anche se la len del chiaro è multiplo
della len del blocco e si aggiunge un blocco intero di padding.
Cifrando un blocco alla volta implica o un rallentamento, se il sistema aspetta
abbastanza dati da cifrare, oppure un aumento dell'occupazione di banda o disco.
L'aumento dello spazio non è critico dato che un blocco di solito è di 64 o 128
bit.
Nei cifrari a blocchi questi seguono i PRINCIPI DI SHANNON:
- principio di diffusione
- principio di confusione

/ PRINCIPIO DI CONFUSIONE: la relazione tra la K e C deve essere + complicata


possibile. Noi supponiamo sempre che C è in mano all'atk, quindi questo non deve
trovare info sulla K dal C (ad esempio se C[n]= P[n]*K, se l'atk vede che il testo
di C son tutti num pari sa che K è un num pari).

/ PRINCIPIO DI DIFFUSIONE: ad ogni bit del testo cifrato deve dipendere da + bit
del testo in chiaro e ogni bit del P influenza più bit del C.
Se un bit di C dipende da un solo bit di P, allora facendo piccole modifiche a P
otteniamo piccole modifiche a C (~ ALLEGATO 4). L'atk vedendo entrambi i C può
vedere dove è stata fatta l'unica modifica, dandogli così un info molto forte.
Se l'atk vuole alterare P e ogni bit è relazionato a un solo bit di C gli basterà
modificare n bit di C. Se vale invece il principio di diffusione, se viene
modificato un bit di C P cambia in un modo che difficilmente può controllare.
Tutti i cifrari basati sullo xor (a flusso e OTP) non rispettano questo principio
poichè la cifratura avviene tramite uno xor di S bit a bit con P.

/ AES: cifrario a blocchi standard americano. I suoi principi sono usati in molti
cifrari. Il testo in chiaro viene diviso in blocchi di 128 bit e viene visto come
una matrice di 4x4 byte. La K può essere 128, 192, 256 bit. Per prima cosa vengono
estratte le 10 K di round.
Il P viene messo in xor con la prima K. Un round è fatto di 4 operazioni:
- una sostituzione di byte: dal P dopo lo xor si usano le due metà del byte
analizzato come indice di colonna di una tabella, l'elemento individuato viene
sostituito al byte originale. La tabella è una specifica definita nello standard (~
DIAPO). La sostituziobne di byte complica la relazione tra P e C xk sostituisce dei
byte con altri che sono in linea di principio non correlati. Qui si riconosce una
tecnica antica di cifratura, il cifrario di Cesare. Questo consiste nel sostituire
una lettera con un altra di x passi avanti nell'alfabeto. Una variante è assegnare
a ogni lettera un'altra dell'alfabeto ma in questo modo dovremmo condividere una K
di 26 caratteri (~ DIAPO). Si utilizza quindi più spesso la MONOALPHABETIC
SUBSTITUTION in cui si inserisce una keyword prima della chiave, la quale consiste
nell'intero alfabeto meno le lettere usate per la keyword (~ DIAPO).
- shift di righe: la prima riga rimane uguale, nella seconda viene fatto uno
shift circolare a sx, nella terza uno shift circolare a sx di due posizioni, nella
quarta uno shift circolare a dx di una posizione. Questa è la prima fase in cui si
crea diffusione.
- mix di colonne: moltiplicazione riga x colonna con un'altra matice data
(matrice data x matrice originaria). Ciascuna riga viene moltiplicata per una
colonna in modo da ottenere un nuovo elemento della nuova matrice. Il primo
elemento dipenderà da 4 elementi della prima colonna della matrice originaria (~
ALLEGATO 5). Questa operazione avviene dopo uno shift, il primo byte 9d era prima
nella posizione a destra, il primo byte quindi dipende dalla diagonale della
matrice originale (~ STAMPARE TUTTI GLI STATI DELLA MATRICE PER VEDERE I PASSI).
Con il passare dei round poi il primo elemento dipenderà da tutti gli elementi
della 2*, 3* e 4* riga grazie agli shift. Inoltre dipende dagli altri elementi
della sua riga poichè gli elementi delle altre righe dipenderanno da questi. Nel
giro di 10 round AES ottiene diffusione completa, ogni bit di P influsice su tutti
i bit di C.
- xor con la seconda chiave di round
Tutti i round successivi sono uguali (cambia solo la chiave di round), mentre nel
10* round manca il mix di colonne.
La decifratura è simmetrica alla cifratura ma va implementata a parte.
Blocchi da 128 bit

/ CRIFRARIO DI FEISTEL (~ DIAPO): Antenato di AES. P viene diviso in due (a,b) e


ogni porzione segue un cammino diverso.
- Round 1: b viene messa in funzione con la K generando b'. Poi xor tra a e
b'. A questo punto si scambia a e b (a elaborata, b mai toccata).
- Round n: si ripete con diverse chiavi di round.
la funzione F è una combinazione di permutazioni e S-BOX (~ ?).
La decifratura consiste nell'ordine in cui vengono usate le chiavi.

/ Sia |P|>|blocco| allora P viene diviso in blocchi con un aggiunta se |P| non è
multiplo di |blocco|. Il cifrario agisce su ogni blocco ma come mette in relazione
i blocchi? Il modo più semplice è agire su ogni blocco, cifrarlo e poi accostare i
blocchi cifrati producendo C. Questo viene detto ELECTRONIC CODEBOOK (ECB). La
decifratura è simile, si scompone C in blocchi, si decifra ciascuno con l'algo e K,
concatenando i blocchi decifrati si ottiene P. Parte dell'ultimo blocco in chiaro
contiene il padding, che va riconosciuto ed eliminato. Se P contiene 2 blocchi
identici, siccome la cifratura dipende dal cifrario, da P e da K accade che i
blocchi di testo cifrato sono identici (~ ALLEGATO 6). QUesto può dare all'atk info
potenti.
Il problema è che i blocchi hanno dimensioni limitate, 64 (DES) o 128 (AES, 16
ASCII) bit.
I blocchi poi non vanno perforza cifrati in ordine poichè ognuno è indipendente
dall'altro. Questo rende ECB PARALLELIZZABILE. Si possono quindi dedicare cpu
diverse a blocchi diversi. Se l'atk decide di scambiare la posizione di due blocchi
l'user non ha modo di accorgersi dello scambio. ECB non da garanzie per
l'integrità. Quindi cambiando un bit all'interno di un blocco si ottiene un chiaro
con modifiche importanti, cosa desiserata. Ma all'esterno dei blocchi questi
possono essere scambiati e la porprietà non si propaga a tutto il testo. Inoltre un
blocco può essere eliminato o duplicato.

/ PKCS (public key cryptography standard): sono specifiche introdotte (1991) dai
laboratori della RSA. Questi non sono davvero standard, poichè ne esistono di due
tipi:
- standard de facto: non sono mai stati standardizzati ma si sono diffusi e
tutti gli utilizzano
- standard de iure: standard formalizzati da qualche organizzazione
Questi sono standard de facto anche se ormai fanno parte di protocolli
standardizzati.
In realtà non si applicano solo a chiave pubblica, ma anche il padding
(completamento degli algo a chiave simmetrica a blocchi) seguono PKCS#5. Sono
all'incirca 15 tra validi e abbandonati. Questi propongono specifiche per
utilizzare correttamente la crittografia. Questi non sono basati su dimostrazioni
di correttezza come tutto ciò che riguarda la crittografia ma in molti casi su
esperienza e su ipotesi di lavoro. Chi si occupa di crittografia o di sicurezza non
può ignorare i PKCS poichè compaiono spesso nei protocolli di uso comune.

/ DES: antenato di AES, ormai deprecato poichè la chiave è troppo corta (56 bit) e
porta a diverse vulnerabilità. Blocchi da 64 bit

/ Con ECB se due blocchi di P sono uguale allora i due blocchi in C saranno anche
loro uguali. I blocchi sono quindi limitati e l'atk può riconoscere e associare un
blocco di C a un contenuto in chiaro senza decifrarlo veramente. Può iniziare a
compilare un dizionario in cui a ogni blocco di C associa un significato. Questo
viene detto ATTACCO A DIZIONARIO.

/ CBC (Cypher Block Chaining): alternativa a ECB ma che ovvia al problema della
cifratura di blocchi identici.
Il P viene diviso in blocchi e aggiunto l'eventuale padding. Sia P1 cifrato in C1,
per cifrare P2 si fa xor tra P2 e C1 e poi si cifra il risultato generando C2, e
così via (~ ALLEGATO 7). C1 si ottiene mettendo in xor P1 con IV (initial vector),
si cifra il risultato con K ottenendo C1.
Se P2 e P4 fossero uguali, comunque questi dipendono da altri blocchi e i relativi
C2 e C4 saranno molto probabilmente diversi.
Il IV viene scelto in base al protocollo, non tutti i modi sono adeguati. Ad
esempio nel 2011 sono state trovate vulnerabilità nel protocollo di TLS.
Se viene cambiato un solo bit di P1, se il cifrario ha una buona proprietà di
diffusione, C1 verrà modificato ampiamente (circa 50%). Questo avrà ripercussione
sulla cifratura di C2 e così a catena su tutti i blocchi.
Qui guadagnamo una buona diffusione ma perdiamo totalmente la parallelizzabilità,
non possiamo affidare i vari blocchi a cpu diverse.
Per decifrare partiamo da C1 e otteniamo P1 xor IV, mettendolo a sua volta in xor
con IV (P1 xor IV xor IV) otteniamo P1. Da C2 decifriamo anche qui con K ottenendo
C1 xor P2, mettendolo in xor ancora con C1 (C1 xor P2 xor C1) otteniamo P2. Analogo
per gli altri blocchi (~ FARE DISEGNO). Per decifrare quindi Cn abbiamo bisogno di
Cn-1 e di K.
Se viene modificato un bit di C1 questo impatterebbe su P1 all'incirca al 50%. Su
P2 l'impatto è di un solo bit, quello modificato in C1. Da P3 in avanti non vi è
più alcun impatto. Una modifica dell'atk del pacchetto ha quindi un impatto
limitato.
Se invece si scambiano i blocchi C2 e C3 nella decifratura verrebbero danneggiati i
blocchi P2, P3 e P4.
Se l'atk cancella C3, P3 viene cancellato e P4 rimane danneggiato.

/ CFB (Cipher FeedBack): l'algo prende in input non P ma IV, lo cifra con K e ciò
che viene generato viene messo in xor con P1 per generare C1. Viene quindi generata
una S1 messa in xor con P1 per creare C1. A questo punto C1 viene cifrato con K per
creare S2 che messa in xor con P2 genera C2, e così via (~ DIAPO DISEGNO). Questa
modalità assomiglia a CBC, quindi non parallelizzabile, se si cambia un bit di P1
questo influisce solo su 1 bit di C2 ma poi aumenta nei successivi Ci. Questa
modalità genera una cifratura simile a quelli a flusso (per S) ma la differenza
importante è che i vari Si dipendono dai Ci e quindi dai Pi. Questo non permette di
vedere disgiunto il PRNG dal cifrario. In questo caso l'operazione di generazione
della S è intrecciata alla cifratura.
Per la decifratura si parte da IV e con K si genera S1, messa poi in xor con C1 per
ottenere P1. C1 viene cifrato con K generando S2, mettento in xor S2 e C2 otteniamo
P2, analoghi gli altri passi (~ DIAPO DISEGNO). La decifratura usa sempre l'algo in
modalità cifratura per rigenerare Si mentre si cifrava Pi.
Se l'atk modifica un bit di C1, verrà alterato 1 bit di P1, la modifica però si
propagherà in modo disastroso su P2. Da P3 in poi non avremo alcun problema.
L'idea originale di CFB era quella di cifrare un byte o un bit per volta e non
quello di cifrare i blocchi (come si fa ora), |VI|==1 blocco (8 byte), la Si
prodotta era quindi lunga 8 byte e solo la porsione iniziale della Si veniva messa
in xor con Pi per ottenere 1 byte di C (C1). Questo era CFB-8. Il testo cifrato
(lungo 8 bit) veniva inserito in fondo a una sequenza, dove ogni volta che veniva
aggiunto un blocco Ci questa veniva shiftata quindi di 8 bit (per far spazio a
quello nuovo). La sequenza quindi veniva poi cifrata con K e usata in xor con P2 (~
FARE DISEGNO). Questa modalità rallenta il cifrario di 8 volte. Il cifrario cifra
tutta la sequenza ma poi solo 8 bit di P venivano cifrati ogni step.

/ OFB (Output FeedBack): ancora di più qui si trasforma un cifrario a blocchi in


uno di flusso. Si parte sempre da IV e lo si cifra con K e il cifrario. Si fa poi
xor tra la S1 ottenuta e P1 per generare C1. Qui però per generare S2 si utilizza
S1, il cifrario e K (a differenza di CFB dove al posto di S1 si usava C1) (~
DIAPO). Il comportamento è quello di un cifrario a flusso poichè si producono
sequenze pseudocasuali. Se il cifrario è buono allora le Si avranno buone proprietà
di pseudocasualità ma ogni bit di C dipenderà solo da un bit di P, proprietà di
diffusione quindi non ce ne sono nel meccanismo finale anche se il cifrario a
blocchi utilizzato ha ottime proprietà di diffusione.
il processo di decifratura usa lo stesso algo di quello di cifratura. Si parte da
IV che viene cifrato con K generando S1, S1 in xor con C1 genera P1. S1 viene poi
cifrata con K generando S2, S2 in xor con C2 genera P2, e così via (~ DIAPO).
Il fatto di usare solo la modalità di cifratura è un vantaggio per cifrari come AES
in cui le operazioni di cifratura sono diverse da quelle di decifratura, il quale
diversamente necessiterebbe di due algoritmi: uno per la cifratura e uno per la
decifratura.
Si può precomputare la porzione di codice in cui si calcolano le sequenze, per poi
parallelizzare la parte di cifratura effettiva.

/ CTR (CouTeR Mode): (~ DIAPO) Trasforma un cifrario a blocchi in un cifrario a


flusso eccetto che la sequenza viene prodotta a blocchi e non in byte.
Il IV è formato da una stringa pseudocasuale e da un counter, il counter parte da
un numero casuale determinato dall'inizio della cifratura. NONCE si utilizza per
indicare una sequenza casuale generata apposta e usata una sola volta. Viene
cifrato questa concatenazione di NONCE e il counter con K per generare S1. Una xor
tra S1 e P1 genera C1. Per i passi successivi il counter viene incrementato di uno
ogni step.
Il cifrario è basato sullo xor quindi non ha proprietà di diffusione ma è altamente
parallelizzabile. Questa è la modalità preferita da utilizzare con AES.
Per decifrare basta rigenerare la Si da mettere in xor con Ci per generare Pi. Chi
decifra quindi deve conoscere la NONCE e la K. Anche qui si usa solo la mod
cifratura.

/ GCM (Galois/Counter Mode): Utilizza il cifrario in mod CTR. (~ DIAPO)


Un counter parte da 1 e viene cifrato con K generando S1. S1 xor P1 produce C1. Il
counter viene incrementato, lo si cifra con K generando S2. S2 xor P2 genera C2. Il
resto serve per gerantire l'integrità e la segretezza.
Per la decifratura si cifra il counter con K per generare Si. Si xor Ci genera Pi
(~ DIAPO)

/ CCMP (Counter Mode/CBC-MAC): (~ DIAPO) mod di cifratura che utilizza CTR, parte
del lavoro garantisce l'integrità. La parte in rosso è AES in mod counter. Questo è
utilizzato da WAP2 per la cifratura dei frame nel wifi.
Viene caricato il contatore, viene assegnato valore 1 al counter, il counter viene
cifrato in AES con K generando S1. Il primo blocco di frame P1 viene messo in xor
con S1 per generare C1. Il counter viene incrementato, cifrato di nuovo con K
generando S2 e S2 xor P2 genera C2

/ I cifrari possono essere usati per ottenere riservatezza nelle comunicazioni in


rete. Queste però avvengono tramite lo stack di protocolli TCP/IP. Dobbiamo
distinguere i livelli
- applicativo
- trasporto
- rete
- data link
Se cifriamo a livelli diversi dello stack proteggiamo parti diverse dei dati che
viaggiano in rete ed otteniamo dei benefici diversi.

/ LIVELLO APPLICAZIONE: se cifriamo qui i dati sono protetti già quando vengono
consegnati a livello di trasporto. In questo caso la protezione può essere
specifica per l'applicazione. aspetti di autenticazione e di integrità possono
essere regolati specificatamente in modo da essere legati e pensati proprio x
quella specifica applicazione.
Il lato negativo è che per ogni diversa app richiede una nuova implementazione.
Dato che ogni implementazione comporta dei bug questa non è la scelta favorita.
Inoltre è anche più costoso reimplementare il software ogni volta.
PGP è un protocollo di posta elettronica, una parte contiene il messaggio con data,
ora e nome file. Questa viene compressa con uno zip per poi essere cifrato con
chiave simmetrica.
Gli algo di cifratura utilizzati sono a chiave simmetrica

/ SSL/TLS: protocollo per rendere sicuro HTTP (diventa così HTTPS). Questo
protocollo introduce un nuovo livello, poichè il livello di record layer di SSL è
tra TCP e sotto i protocolli di applicazione. Non è un vero e proprio livello,
poichè i protocolli a lui sopra devono essere consapevoli di avere un layer SSL o
TLS sotto di loro, la presenza del layer non è quindi trasparente.
Il formato (~ DIAPO) del pacchetto è formato da un'intestazione, il testo e da una
parte per l'integrità.
Il protocollo riceve i dati di app e diventa sua responsabilità dividerli in
paccheti, volendo anche comprimerli, vengono aggiunti dati per l'integrità, viene
cifrato il tutto e poi si attacca un'intestazione che viaggia in chiaro.
Gli algo usati per cifrare sono a chiave simmetrica (AES per lo più o CHACHA20).

/ IPsec: ha due mod:


- livello trasporto: immediatamente sotto a questo.
Vengono cifrati i dati del pacchetto passato poi al livello rete. A questo
prima di passarlo viene aggiunta un'intestazione, una coda e una parte per
l'autenticazione. Il pacchetto a livello rete vedrà l'IP poic`he non è stato
cifrato.
- mod tunnel: tutto il pck di livello rete viene cifrato, gli si aggiunge
header, coda e autenticazione. Qui viene cifrato quindi anche l'IP. Viene quindi
aggiunta una nuova intestazione per l'instradamento dei pck. Se abbiamo un'azienda
con due sedi distinte che vogliono scambiarsi messaggi su una rete pubblica. Se
piazzano due gateway prima delle due reti locali, i pacchetti possono viaggiare in
chiaro fino a un gateway, questo poi metterà poi come ip esterno al pacchetto
cifrato l'altro gateway. L'altro riceve il pacchetto e decriptandolo può inviarlo
al vero ricevente. Dall'esterno quello che si vede è solo un passaggio di pacchetti
tra i due gateway. Da qui deriva il termine tunnel, poichè si crea un tunnel per i
pacchetti tra i due gateway.

/ DATA LINK: protocolli wifi, cifratura dei frame.


Scendendo nello stack si proteggono più dati poichè ogni livello dello stack
aggiunge info al pck.

/ DA DES AD AES: DES è stato sostituito poichè non era più robusto. Per dimostrare
che un cifrario è diventato debole serve un analisi fatta da ricercatori, come nel
caso di RC4 dove è stato mostrato che fosse troppo difficile gestire le chiavi dato
che PRNG era parzialmente prevedibile.
Ci sono attacchi più efficenti di quelli a forza bruta, ma puramente teorici. Sono
stati proprio gli attacchi a forza bruta a determinare il pensionamento di DES.
Quando ci si è accorti che DES stava diventando troppo debole si è iniziato ad
usare 3DES. Questo consiste nel cifrare 3 volte P con DES utilizzando 3 K diverse
(quindi una da 56bit x 3), l'attacco a forza bruta diventa proibitivo. Se le
cifrature fossero state solo due, nel caso in cui l'atk avesse avuto diverse coppie
P,C l'attacco sarebbe stato ridotto a un costo di O(2**56).
DES3 è stato poi standardizzato in un modo particolare (~ DIAPO). Si cifra P con
K1, il risultato lo si decifra con K2 (decifrando con una chiave diversa il
risultato è un'altra cifratura), il risultato lo si cifra con K3, producendo così
C. La ragione di questa particolarità è che se si utilizza qst schema con la stessa
chiave la prima cifratura e la seconda decifratura si annullano. Una variante di
DES3 è di utilizzare solo due K, K1 e K2, dove K1 va usata anche al posto di K3. Si
forma così una chiave di 56bit x 2.
Per la decifratura il processo è analogo ma prima si decifra con K3, poi si cifra
con K2 infine si decifra con K1.
3DES è lento dato il numero di cifrature e i blocchi sono corti, 64 bit.

/ AES:
- chiavi da 128/192/256 bit, blocchi da 128 bit
- cifrario iterativo (non feistel)
- progettato secondo i criteri:
# ottenere resistenza agli attacchi noti
# ottenere codice veloce e compatto su molte CPU
# semplicità di progettazione

/ Con i sistemi di cifratura a chiave simmetrica, il mittente e il destinatario


devono poter condividere la K. È quindi necessario un canale sicuro per scambiarla.
Con l'avvento di internet subentrò la necessità di trovare metodi per mantenere la
segretezza di dati scambiati tra privati, i metodi usati in ambito militare non
erano adatti allo scopo.

/ CIFRARI A CHIAVE PUBBLICA: Ogni user ha una K pubblica e una K privata. Se B


vuole contattare A cifrerà P con la KApub ottenendo C. A decifra C con KApr
ottenendo P. Se A vuole scrivere a B non può utilizzare la stessa coppia di chiavi
perchè i cifrari a chiave pubblica creano un canale a senso unico, a differenza dei
cifrari a chiave simmetrica in cui la K condivisa definisce un canale privato tra i
due che è bidirezionale.
Il vantaggio è che se qualcun'altro vuole cifrare un mex per alice può farlo
utilizzando la KApub mentre nella chiave simmetrica il canale è ristretto alla
comunicazione tra A e B.
Avendo una K pubblica non abbiamo il problema della distribuzione della K.

/ RSA: cifrario basato sull'aritmetica modulare (a%m=r se a=mq+r inoltre a≡b mod n
se a mod m = k e b mod m = k).
Si sceglie una coppia di numeri primi p e q, si calcola poi n = p*q. Si sceglie poi
e coprimo con (p-1)*(q-1) inoltre 2<=e<=(p-1)*(q-1). Si determina poi d tale che
d*e≡1 mod (p-1)*(q-1). Per cifrare un messaggio P questo va visto come un numero,
P**e % n = C. La decifratura è C**d % n = P solo se P<n
Per qualsiasi cifrario abbiamo bisogno di
- un generatore di chiavi
- algo di cifratura
- algo di decifratura
Gli algo devono essere efficenti. Per cifrare è necessario che tutti conoscano e ed
n, Kpub=(e,n). Per decifrare è necessario conoscere d e n Ppr=(d,n). Ovviamente la
parte segreta della Kpr è d dato che n è anche in Kpub.
Per trovare e si utilizza l'algo di Euclide per il massimo comune divisore. Per
determinare d si usa un algoritmo di Euclide. La cifratura si realizza con l'algo
dei quadrati ripetuti.
Spiegazione di m<n: C**d % n = (m**e % n)**d % n = m**(e*d) % n => noi sappiamo che
e*d≡1%(p-1)(q-1) => m**1 % n = m.
Una strategia per l'attaccante è, dato n, trovare p e q. Questo è noto come il
problema della fattorizzazione e non si conoscono algo poilinomiali. Si sa che è un
problema NP ma non si sa se è NP-completo. L'algo migliore che si conosce ha un
costo 2**O(radcub(|n|)). Confrontato con un attacco forza bruta che avrebbe un
costo di o(2**|n|), il primo è più facile. Quindi un atk che vuole bucare RSA non
userà la forza bruta, inoltre le K di RSA devono essere abbastanza lunghe per
proteggersi dall'altro, 1024, 2048, 4096 bit. Questo rende le computazioni +
peransti. Inoltre gli algo per RSA hanno costi cubici, O(|n|**3) mentre nei cifrari
a chiave simmetrica le operazioni sono + veloci poichè sono solo manipolazioni di
bit. Il cifrario a K pubblica e in particolare RS hanno il vantaggio di poter
essere a K pubblica, il che si basa su proprietà matematiche molto forti. I cifrari
a K simmetrica sono basati su manipolazioni di bit, operazioni a + basso livello e
quindi + veloci. Questo non è vero solo per RSA ma per tutta la crittografia a K
pubblica in contrapposizione alla crittografia a K simmetrica.
In RSA è possibile un attacco a forza bruta su P.

/ in RSA n è un parametro fondamentale ed è parte della Kpub e della Kpri.


Nei cifrari a K simmetrica la K è unica e n = |K|.

/ ALGO QUADRATI RIPETUTI: per calcolare a**b % m consideriamo la rappresentazione


binaria di b: (b)2 = bn bn-1 ... b0.
a**b = a**(bn bn-1 ... b0) = a**b0 * a**(b1*2) * ... * a**(2**n * bn).
Con questo si scrive un algo efficace: (~ ALGO)
L'elevamento a potenza in modulo ha un costo di O(|n|**3). È un operazione costosa.

/ Con una coppia di chiavi, KApri e KApub, si formano diversi canali diretti ad A.
Questo apre la possibilità di un attacco a forza bruta su P. Se lo spazio dei
possibili P è piccolo (ad esempio l'atk sa che B risponde ad A "si" oppure "no"),
l'atk vede passare il testo cifrato e siccome conosce KApub può cifrare "si" e "no"
e vedere quale dei due coincide con il testo cifrato, questo è utilizzabile se
l'insieme dei possibili messaggi è piccolo. Per proteggersi dall'attacco si gonfia
artificialmente l'insieme dei testi in chiaro.
Quando si utilizza RSA gli standars PKCS propongono una risposta.
- PKCS1 v1.5: si assembla il mex von 1 byte FF, 16 bit iniziali con valore
HEX 02 e in mezzo una stringa pseudocasuale (random pad) il quale garantisce che la
len dei messaggi sia abbastanza grande. Se anche i mex fossero solo si o no l'atk
deve provare tutte le posibili stringhe pseudocasuali della len di random pad. In
questo modo lo spazio dei messaggi è ingrandito. Quando A riceve il mex e lo
decifra è in grado di riconoscere la parte in eccesso dal mex.
- PKCS1 v2.0: il mex viene completato in modo standard e poi messo in xor con
funzioni hash di stringhe pseudocasuali. Anche qui comunque si amplia il mex con un
padding pseudocasuale per ampliare lo spazio dei messaggi.

/ Abbiamo visto che i cifrari a K simmetrica sono + efficenti di quelli a K


pubblica, dato le operazioni di calcolo svolte da quest'ultimi. RSA inoltre
necessita di chiavi + lunghe, il che impatta sull'efficenza che sullo spazio (o
banda). I cifrari a chiave simmetrica invece comportano il problema dello scambio
della K mentre con i cifrari a K pubblica la Kpub può essere distribuita
tranquillamente. Quest'ultimo aspetto rende questo tipo di cifrari la scelta
migliore tendenzialmente anche se poco pratici.
Vorremmo quindi un cifrario leggero ma che ci dia la possibilità si cambiare le
chiavi in modo agevole. La soluzione è adottare uno SCHEMA IBRIDO prendendo il
meglio dei due mondi.
Si usano i sistemi a K pubblica per lo scambio delle chiavi, una volta che queste
sono condivise si cifrano i dati a chiave simmetrica.
Esempio: A e B vogliono comunicare, ognuno ha una Kpri e una Kpub. B conosce KApub,
genera quindi una chiave K da utilizzare, ad esempio, con AES e cifra K con RSA
usando KApub. Invia questo pck ad A. A può decifrare il pck con KApri ottenendo K.
Ora A e B condividono la chiave K e il resto può avvenire su un canale a K
simmetrica basato su K. All'inizio i due non condividevano info segrete, il costo
della cifratura di K, una chiave AES, è il costo della cifratura di 256bit che
anche se fatto con un cifrario a K pubblica non ha un gran costo computazionale
data la dimensione ridotta del testo da cifrare (ovvero K). Dopo A e B condividono
K e possono usare quindi un cifrario a chiave simmetrica, leggero e veloce senza
più il problema dello scambio chiave.
In PGP avviene proprio questo. (~ DIAPO) La parte finale è il mex con la data e il
nome del file, la parte centrale riguarda info per l'integrità. Queste due parti
vengono compresse e successivamente cifrata con un sistema a K simmetrica. La K
viene poi cifrata con una K pubblica e trasmessa al destinatario. Infine nel
pacchetto è presente un id di chiave pubblica, così che se il destinatario ne ha
più di una sa quale è stata utilizzata.
Il destinatario identifica la K pub utilizzata, recupera la K privata
corrispondente e con questa decifra la K simmetrica cifrata che utilizzerà poi per
decifrare tutto il messaggio compresso.
Praticamente mai viene usata la Kpub per proteggere i dati ma viene sempre usato lo
schema ibrido.

/ PROTOCOLLO DIFFIE-HELLMAN: protocollo per lo scambio di un segreto su un canale


pubblico. In realtà quello che si fa è accordarsi su un segreto, dato che al
termine del protocollo i due user condivideranno un segreto che nessuno dei due
all'inizio aveva deciso.
A e B devono accordarsi su due parametri, un numero primo p, e un numero g,
entrambi pubblici. Si richiede che g sia un generatore del gruppo moltiplicativo %
p. A sceglie un numero x tra 1 e p-1, B sceglie y compreso tra -1 e p-1. A calcola
z = g**x % p e B calcola t = g**y % p. A e B si scambiano z e t. A calcola t**x %
p, B calcola z**y % p. Questi calcoli saranno segreti e questi valori saranno
coincidenti, corrisponde a g**xy % p.
Le computazioni affrontate sono elevamenti a potenza in modulo, per cui si conosce
un algoritmo polinomiale, anche se a costo cubico. Non sono quindi algo leggeri ma
nemmeno così pesanti
L'atk vede passare z e t, se conoscesse x o y sarebbe in grado di fare le stesse
operazioni e ricostruire il segreto condiviso. Questo è un protocollo a K pubblica
per z e t, poichè determinate dalla Kpriv e dai parametri pubblici.
Ancora se da z l'atk riuscisse ad estrarre x o da t y sarebbe ancora in grado di
usare l'altra delle due K pubbliche per generare il segreto condiviso. Dato z se si
vuole trovare x tale che g**x=z il problema è noto come PROBLEMA DEI LOGARITMI
DISCRETI. Di questo si conoscono solo algo difficili, del costo di e**O(radcub(|
P|)), stessa complessità della fattorizzazione di RSA. I due problemi sono infatti
legati, e gli algo conosciuti sono essenzialmente gli stessi. Quando si trova un
modo per rendere più efficente uno dei due in genere funziona anche sull'altro. La
len delle K deve essere tali per proteggere l'algo da un attacco cheè più facile di
uno a forza bruta.
Come con RSA:
- crittografia a K pubblica
- algo costosi O(|p|**3)
- chiavi lunghe (1024, 2048, 4096 bit)
In cambio si ottiene che le K pubbliche sono scambiabili senza il bisogno di un
canale segreto.
Finchè A e B non cambiano la Kpri e quindi la Kpub, ogni volta che proveranno a
condividere un segreto condivideranno lo stesso segreto: g**xy % p. Questo è
inevitabile poichè il segreto dipende solo dalle scelte di A e B. Il segreto
dipende da X e Y quindi nessuno dei due può scegliere interamente il segreto ma
entrambi collaborano, ottima risorsa in caso uno dei due sia un user malevolo o nel
caso in cui uno dei due abbia un PRNG debole per cui, ad esempio, x è facile da
interpretare.
DH non è un cifrario, si può utilizzare solo per decidere un segreto. Non si può
quindi usare per cifrare info.

/ CONFRONTO DH CON RSA: in RSA A e B hanno una coppia di K, Kpub e Kpriv.


A sceglie x, la K simmetrica da cifrare con KBpub. Qui è A a scegliere il ssegreto
e B non ha parola a riguardo. Se A è malevolo può quindi portare a termine azioni
malevole. In cambio le coppie di chiavi non devono essere sostituite ad ogni
segreto da scambiare.

/ il gruppo moltiplicativo % p è l'insieme dei numeri da 1 a p-1 considerati con la


moltiplicazione in modulo. Sapendo che il segreto condiviso con DH è g**xy % p, in
una situazione ideale questa può assumere valori in un insieme ampio di valori
possibili, se l'insieme fosse ridotto l'atk potrebbe fare un attacco a forza bruta
sul segreto condiviso. È interesse quindi che il segreto possa avere un valore di
un insieme ampio. L'insieme non potrà essere più ampio dell'insieme dei numeri da 1
a p-1. Si deve fare in modo che i valori possibili del segreto siano quelli
dell'insieme specificato e non di un sott'insieme
Esempio: p=7, Fp={1,2,3,4,5,6}. Se prendiamo g=2, guardiamo i valori possibili che
g**xy % p può assumere:
- 2**1 % 7 = 2
- 2**2 % 7 = 4
- 2**3 % 7 = 1
- 2**4 % 7 = 2
- 2**5 % 7 = 4
- 2**6 % 7 = 1
- ...
Quando si eleva g a un numero e si ottiene 1 a quel punto i valori son tutti li e
si ricomincia da capo a generarli. Con g=2 abbiamo quindi {2,4,1}.
Se scegliamo g = 3:
- 3**1 % 7 = 3
- 3**2 % 7 = 2
- 3**3 % 7 = 6
- 3**4 % 7 = 4 (basta fare 6*3 % 7)
- 3**5 % 7 = 5
- 3**6 % 7 = 1
Quindi con g = 3 otteniamo {1,2,3,4,5,6} e sono tutti i numeri di Fp.
Se p è abbastanza grande va bene anche ottenere un sott'insieme di Fp.

/ Sappiamo che A e B devono condividere p e g come parametri pubblici che può


essere vista come una base di vernice. A sceglie un colore privato KApri e lo
mischia con la base ottenendo il colore KApub, stessa cosa fa B. Le Kpub possono
essere distribuite e entrambi potranno usare quella dell'altro. A può usare KBpub
che mescolata con KApri, B mescola KApub con KBpri ed entrambi ottengono lo stesso
risultato (~DIAPO). L'analogia serve a capire che è facile mescolare le verinici,
quindi calcolare potenze e moduli, ma non è facile risalire ai colori originali dal
risultato.

/ SSL/TLS: vediamo come DH e RSA vengono usati nel protocollo per lo scambio delle
chiavi simmetriche.
Lo scambio di K viene fatto in 3 modi diversi:
- RSA
- DH PERSISTENTE (DH): le chiavi DH esistono prima e dopo lo scambio
- DH EFFIMERO (DHE): le chiavi sono costruite apposta per lo scambio
SSL/TSL è formato da diersi protocolli (~DIAPO):
- record layer: quello che effettivamente si occupa della cifratura a K
simmetrica dei dati, qui viaggiano HTTP e altri protocolli resi sicuri da SSL.
- handshake protocol: il server e il client si scambiano le chiavi e se
richiesta avviene l'autenticazione
- change cipher protocol
- Alert protocol
La versione più recente è TLS 1.3 questa ammette solo DHE, quelle prima solo RSA o
DH.

/ HANDSHAKE PROTOCOL (~DIAPO):


1- inizia con un mex di hello del client che richiede la connessione e invia
una stringa pseudocasuale (nota come CLIENT RANDOM) e le proprie capacità
criptografiche, quali algo a K simmetrica e pubblica il client è in grado di
utilizzare (noi utilizzeremo solo RSA, DH o DHE). Il client deve anche dire cosa
riesce a gestire in termini di autenticazione
2- il server risponde con il mex di hello dove invia la sua stringa
pseudocasuale (SERVER RANDOM) e, sapendo ora le capacità criptografiche del client,
sceglierà secondo una graduatoria la CIPHER SUITE, l'insieme di algo e protocolli
criptografici usati durante lo scambio (secondo una graduatoria). Se il client ha
capacità criptografiche troppo deboli può rifiutare la connessione. A questo punto
sono stati decisi gli algo e i protocolli che verranno utilizzati nello scambio
(supponiamo RSA). Il server allora invia la propria Kpub al client all'interno del
certificato
3- il client calcola una stringa pseudocasuale x, la cifra con KSpub e la
invia al server
4- il server decifra con KSpriv e viene a conoscenza di x
5- x viene usata come base per determinare le chiavi simmetriche

Se invece si utilizza DH
2- il server manda la propria KSpub
3- il client invia KCpub
4- i due fanno i calcoli per terminare DH ed ottenere il segreto condiviso
che verrà utilizzato come base per creare le chiavi. Questo per evitare che il
client scelga appositamente info a lui comode.

Se si utilizza DHE, mente nella versione persistenza il server e client hanno delle
chiavi che avevano da prima dello scambio e che manterranno dopo, qui le Kpub
vengono generate al momento dello scambio. Questo fatto significa che se un atk
vede uno scambio di dati e riesce a coglierlo, per decifrarlo gli serve la chiave
K. In RSA se l'atk riesce ad ottenere KSpriv e ha visto tutto lo scambio è in grado
di ricostruire il segreto x e da x la chiave K e decifrare i dati scambiati.
In DH se l'atk scopre la Kpri del client o del server e ha raccolto i dati dello
scambio avrà la Kpub della controparte, ottiene così il segreto condiviso, dal
quale ottiene la chiave K e riesce così a decifrare i dati. Con DHE se l'atk ha
raccolto anche tutti i dati dello scambio ha bisogno di una Kpriv per ottenere il
segreto e la chiave. Ma essendo le chiavi effimere, e quindi vengono eliminate alla
fine dello scambio, l'atk deve riuscire a coglierle durante lo scambio o non
riuscirà a ricostruire la chiave K. Questa proprietà viene detta FORWARD SECRECY,
ovvero tutto ciò che viene protetto adesso sarà protetto in futuro anche se l'atk
riesce a raccogliere info criptografiche da client o da server.

Potrebbero piacerti anche