Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
/ 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.
/ 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
/ 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.
/ 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.
/ 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.
/ 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
/ 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.
/ 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
/ 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).
/ 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
/ 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.
/ 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.
/ 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.
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.