Scarica Crittografia: Cifrari Simmetrici, Asimmetrici e Scambio di Chiavi e più Appunti in PDF di Sicurezza delle reti solo su Docsity!
CIFRARI
- Aperti: metodo per cifrare e decifrare è pubblico
- chiusi: tutto è segreto principio di Kerkhoffs: metodi e algoritmi segreti prima o poi verranno conosciuti dall’avversario, il segreto deve essere concentrato nelle chiavi. si vuole evitare il concetto di “security through obscurity" - ottenere sicurezza nascondendo informazioni o inventando metodi complessi per recuperare le stesse, metodi che però potranno essere studiati e rilevati dal nostro avversario.
Cifrari aperti
- simmetrici: chiavi condivise (ambiente sicuro —> rete non sicura —> ambiente sicuro)
- caratteristiche:
- mittente e ricevente condividono stessa chiave
- si usa stessa chiave per cifrare e decifrare
- cifratura e decifratura sono efficienti
- difficile, praticamente impossibile decifrare senza conoscere la chiave
- testo in chiaro (plaintext): testo prima della encryption
- testo cifrato (ciphertext): testo dopo encryption asimmetrici chiavi diverse per chi cifra e decifra
Cifrari simmetrici pre-informatici
- character-oriented:
- cifrario di cesare:
- numera le lettere dell’alfabeto
- genera una chiave K tra 0-
- per cifrare si sostituisce la lettera numero X con la lettera numero (X+K+21)%
- è un cifrario debole siccome basta provare a decifrarlo con tutte le chiavi da 0-20 fermandosi poi quando si trova un testo di senso compiuto (attacco del tipo forza bruta)
- cifrari monoalfabetici a 1 lettera: come il cifrario di cesare ma la chiave K identifica una sostituzione arbitraria di ciascuna lettera dell’alfabeto (non è possibile decifrarlo usando tutte le chiavi possibili siccome esistono diverse chiavi per N lettere, sono tuttavia deboli il metodo per decifrare il testo senza conoscere la chiave consiste nell’analisi della frequenza delle lettere nel testo cifrato (crittanalisi statistica) ) - attacco:
- confrontare la frequenza delle lettere nel testo cifrato con la frequenza delle lettere nella lingua del testo in chiaro
- ipotizzare possibili corrispondenze tra lettere del testo cifrato e lettere del del testo originario
- verificare se il testo parzialmente decifrato è possibile nella lingua del testo in chiaro, in caso contrario annullare una parte e ricominciare a ipotizzare
- cifrari monoalfabetici a N lettere: ogni N-upla di lettere del testo in chiaro viene sostituita con una sequenza fissata di N lettere (è comunque possibile attuare un'analisi statistica per decifrarlo)
- polialfabetici: una lettera o N-upla de lettere può essere cifrata diversamente a seconda della sua posizione nel testo (analisi statistica risulta molto più difficile)
- cifrario di playfair: si sceglie come chiave una parola arbitraria per esempio “security” e si prepara una tabella di questo tipo → s e c u r i/j t y a b d f g h k l m n o p q v w x z
- sostituire:
- lettere ripetute inserendo una lettera riempimento
- lettere sulla stessa riga con lettere successive a dx
- lettere sulla stessa colonna con lettere in basso
- debolezze:
- possibile analisi statistica
- più il testo cifrato è lungo più è facile decifrarlo
- se esistono parti di testo fisse la decifratura è molto semplice
- se esistono parti di testo probabili il compito è facilitato
- cifrario di vigenère (polialfabetico): selezionare una chiave K=K0K1…Kn-1 dove ogni sottochiave Ki consiste in un numero tra 0 e 20 per cifrare: sostituire la lettera Tj del testo con la lettera (Tj+K(J%n))%21, ovvero applicare alla lettera Tj il cifrario di cesare corrispondente alla sottochiave K(J%n) individuata nella posizione J di Tj nel testo - debolezze: supponiamo si conosca n, allora è possibile fare l’analisi statistica - più il testo cifrato è lungo più è facile decifrare - se esistono parti di testo fisse il compito è estremamente facilitato
- bit-oriented:
- cifrario di vernam: analogo a quello di vigenère ma bit-oriented selezionare una chiave binaria K=K0K1…Kn- per cifrare: sostituire il bit Tj del testo con la lettera Tj+K(J%n), ovvero applicare operazione di OR esclusivo (XOR) a ogni bit Tj del testo utilizzando il bit K(J%n) della chiave individuato nella posizione J di Tj nel testo
- debolezze: supponiamo si conosca n allora si può effettuare un'analisi statistica su bit che distano n posizioni con riferimento alla frequenza di particolari gruppi di bit nell’insieme dei possibili testi di partenza
- più il testo cifrato è lungo più è facile decifrare
- se esistono parti di testo fisse il compito è estremamente facilitato
- one time pad: come cifrario di vernam ma la chiave ha la stessa lunghezza del testo. è l’unico cifrario totalmente sicuro, ma non ha rilevante utilità pratica.
- a sostituzione: un gruppo di caratteri viene sostituito con un altro gruppo di caratteri
- a permutazione: gruppi di caratteri vengono spostati nel testo
- debolezze: è possibile elaborare successivi raffinamenti di ipotesi di permutazione basandosi sulla frequenza di digrafi e trigrafi o sulla presenza di testo fisso o probabile. il cifrario migliora effettuando più permutazioni in cascata con diverse chiavi.
- AES (advanced encryption standard)
- necessita di chiavi più lunghe (128bit)
- riferimento a macchine a 64 bit
- robustezza rispetto ad attacchi lineari e differenziali
- da 10 a 14 rounds
- efficiente
- unici attacchi noti di tipo forza bruta
Block cipher: due problemi:
- usare chiavi più lunghe → una chiave corta rende il cifrario più debole rispetto agli attacchi di forza bruta idea: cifrare più volte e ogni volta con una chiave diversa cifratura a due fasi: problema: in realtà non è più forte siccome ci può essere un attacco di forza bruta basato sul valore del testo cifrato intermedio, occorre conoscere almeno due coppie prodotte con il cifrario. (meet in the middle) soluzione → cifratura a 3 fasi: non ha i problemi di quella a due fasi applicata al DES produce il triple DES→ usato di solito con K1=K3 e con la seconda fase usata all’inverso (in modalità decryption)
- cifrare testi più lunghi idea: dividere il testo in blocchi, cifrare ogni blocco, eventualmente usare il blocco cifrato precedentemente come input aggiuntivo ECB (electronic codebook) → problema : un blocco ripetuto viene cifrato nello stesso modo ed è quindi possibile un’analisi statistica. non soddisfa il modello più restrittivo di sicurezza di un meccanismo di cifratura, può fornire un livello di sicurezza adeguato per messaggi corti CBC (cipher block chaining) → è la modalità di cifratura più usata per un cifrario a blocchi e non presenta i problemi di ECB ed è altrettanto efficiente IV rappresenta un vettore di inizializzazione lungo quanto un blocco problema: un errore di trasmissione di un solo bit rende impossibile decifrare il corrispondente blocco e il blocco immediatamente successivo inoltre prima di poter applicare il sistema di encryption a blocchi bisogna avere a disposizione il testo in chiaro CFB (cipher feedback) → trasforma il cifrario a blocchi in uno stream (flusso) cipher però è meno efficiente di CBC problema: un errore di trasmissione di un bit nel testo cifrato si propaga per diversi blocchi e perciò risulteranno indecifrabili il blocco successivo e alcuni di quelli che lo seguono OFB (output feedback) → trasforma il cifrario a blocchi in stream cipher, meno efficace di CBC, problema : un errore di trasmissione di un bit rende indecifrabile il solo gruppo di bit locale mentre il resto del testo può essere decifrato
CIFRARI ASIMMETRICI per cifrare e decifrare si usano chiavi diverse non è possibile ottenere K2 da K1 e viceversa non è possibile decifrare anche se si conosce K1 perchè K1,K2 sono generate insieme è possibile cifrare con entrambe le chiavi
sono basati su principi diversi da quelli della crittografia tradizionale:
- in quelli convenzionali la difficoltà di lettura di un messaggio cifrato consiste nel fatto che la trasformazione realizzata dal cifrario è conosciuta
- nei cifrari asimmetrici la trasformazione è conosciuta ma è troppo difficile da calcolare se non si conosce l’informazione segreta (trapdoor) utilizzata per generare le chiavi e/o per decifrare richiedono più risorse computazionali sia per cifrare che decifrare e per generare chiavi ed è per ciò che i cifrari asimmetrici non sostituiscono quelli convenzionali ma generalmente si affiancano ad esse per particolari applicazioni perchè i cifrari asimmetrici rappresentano una importante novità, con notevoli conseguenze applicative?
- perché diventa possibile cifrare un messaggio senza condividere un segreto con il destinatario → maggiore facilità nella distribuzione delle chiavi
- perchè solo chi detiene la chiave di cifratura è in grado di produrre un dato messaggio cifrato → possibilità di effettuare operazioni non disconoscibili (non repudiation) cifrari asimmetrici = cifrari a chiave pubblica questa forma di autenticazione non garantisce però l’effettiva provenienza del messaggio dal mittente dichiarato una tecnica più complessa ma basata sugli stessi principi porta invece a una forma di autenticazione sicura e non disconoscibile (firma elettronica)
- mittente e ricevente non condividono chiavi
- per cifrare e decifrare uso chiavi diverse
- cifratura e decifratura sono relativamente inefficienti
- è difficile o praticamente impossibile decifrare senza conoscere la chiave esistono cifrari asimmetrici sicuri e utilizzabili in pratica?
- Si ritiene che vari cifrari a chiave pubblica presentati nella letteratura siano sicuri anche rispetto ad attacchi molto sofisticati. Il cifrario più utilizzato e conosciuto è RSA.
- I cifrari asimmetrici conosciuti sono tutti abbastanza lenti e devono essere combinati con cifrari simmetrici e con funzioni di hash combinazione di cifrari simmetrici e asimmetrici: per inviare un messaggio cifrato si prepara un digital envelope che consiste nel messaggio cifrato con chiave simmetrica K, e nella chiave K stessa cifra mediante un cifrario asimmetrico
SCAMBIO DI CHIAVI DIFFIE-HELLMAN chiave pubblica non è un vero e proprio cifrario usato per scambio di chiavi simmetriche è basato su operazioni in aritmetica modulare, definizione → dato M, a mod M (oppure a%M) denota il resto della divisione di a per M (quindi a<M a mod M = a) quindi: se a mod M = r, allora (∃k) Mk + er = a con r < M ex. → 17 mod 5 = 2, e (∃k) 5*k+2 = 17, con k=
conviene portare all’interno di un prodotto l’operazione modulo proprietà → (ab) mod M = (a mod M)(b mod M) mod M dimostrazione → siano a mod M = x e b mod M = y, con x,y < M allora (∃k,j) Mk + x = a & Mj + y = b pertanto (ab) mod M = [(Mk + x)(Mj + y)] mod M = = [(a mod M)(b mod M)] mod M
esponente modulare e logaritmo discreto
Pa = 𝛼Sa^ mod q
Trovare Pa a partire da 𝛼, q, Sa.
Trovare Sa a partire da 𝛼, q, Pa.
per realizzare DH occorre:
algoritmo efficiente per calcolare ab^ mod q →
s = a for i = 1 to b - s = (a*s) mod q returns (s mod q)
calcolo ricorsivo →
b = 0 ab^ mod q = 1 b > 0 ab^ mod q = [a(ab-1)] mod q = [a(ab-1^ mod q)] mod q b = 0 ab^ mod q = 1 b pari ab^ mod q = (ab/2)^2 mod q = [(ab/2^ mod q)]^2 mod q b dispari ab^ mod q = [a(ab-1)] mod q = [a(ab-1^ mod q)] mod q int expmod (int a, int b, int q) { // restituisce un valore minore di q if (b = = 0) return 1; // a^0 mod q = 0 if (b%2 = = 0) return sq(expmod(a,b/2,q))%q; // b pari else return (aexpmod(a,b-1,q))%q; // b dispari } // (ab) mod q = (a mod q) (b mod q) mod q versione sbagliata int expmod (int a, int b, int q) { // restituisce un valore minore di q if (b = = 0) return 1; // a^0 mod q = 0 if (b%2 = = 0) return (expmod(a,b/2,q) expmod(a,b/2,q))%q; // b pari else return (a*expmod(a,b-1,q))%q; // b dispari } // (ab) mod q = (a mod q) (b mod q) mod q
calcolo iterativo →
b written as the bit vector bk…b 2 b 1 b 0 → b = 𝑖=
𝑛 − ∑ 𝑏𝑖 * 2 𝑖
ab^ mod q = 𝑖=
𝑛 − ∑ 𝑏𝑖 * 2 𝑖
mod q = 𝑖=
𝑛− ∏ (𝑎
𝑏𝑖*2𝑖
( )) 𝑚𝑜𝑑 𝑞^ =^
𝑖=
𝑛− ∏ [(𝑎
𝑏𝑖*2𝑖
( ) 𝑚𝑜𝑑 𝑞 ]) 𝑚𝑜𝑑 𝑞^ =^
𝑖=
𝑛− ∏ [(𝑎 2 𝑖 )
𝑏𝑖
( 𝑚𝑜𝑑 𝑞]) 𝑚𝑜𝑑 𝑞
Iteriamo su i da 0 a n−1,
mantenendo una variabile a2i = 𝑎^2 , e
𝑖 𝑚𝑜𝑑 𝑞 𝑖𝑛𝑖𝑧𝑖𝑎𝑙𝑖𝑧𝑧𝑎𝑡𝑎 𝑎𝑑 𝑎^2
0 = 𝑎
accumulando il prodotto (mod q) in un'altra variabile (res), inizializzata a 1.
res = 1; a2i = a; // a2i = a = a^(2^0 )% q for (i=0; i<k+1; i++) {// a2i = a^(2^i )% q if (bi = = 1) { res = (resa2i)%q; // res = product up to i} a2i = (a2ia2i)%q; // a2i 〖=a〗^(2^i )∗a^(2^i ) = a^(2^(i+1) )% q }
algoritmo efficiente per generare q primo →
generazione di grandi numeri primi, metodo diretto →
- genera M di k bit a caso
- for (i=2; i*i<=M; i++) if (M%i = = 0) goto 1 // M non primo
- return M // M primo
e’ facile che un numero casuale M sia primo? Esistono infiniti numeri primi (Euclide) Dimostrazione : Supponiamo che p sia l’ultimo numero primo. Sia q = 235…p il prodotto dei numeri primi fino a p. Se q+1 è primo, p non era l’ultimo. Se q+1 non è primo, è divisibile per r>p con r primo (in quanto non è divisibile per alcun primo fino a p). Di nuovo r>p, quindi p non è l’ultimo numero primo. Teorema dei numeri primi: Sia π(x) il numero di primi minori dell’intero x. Allora π(x) ~ x/ln(x) ovvero limx→∞ π(x)/[x/ln(x)] = 1. esempio: Abbiamo in media un numero primo ogni 10^100 /3.9*10^97 , ovvero ogni 1000/3.9 = 256 tentativi: Come si riduce questo numero evitando i multipli di 3 e 5? Idea: M3 = M oppure M-1 oppure M-2, multiplo di 3 M5 = M oppure M-1 oppure … M-4, multiplo di 5 Saltare M3, M3+3, M3+6 … (senza contare quelli pari) Saltare M5, M5+5, M5+10, … (senza i multipli di 2 e di 3)
- genera M di k bit a caso
- for (i=2; i*i<=M; i++) if (M%i = = 0) goto 1 // M non primo
- return M // M primo
- R incluso in S: non ci sono ripetizioni in S, infatti, per la proprietà III, poiché a è relativamente primo con M: se axi mod M = axj mod M allora xi = xj. Corollario (Piccolo teorema di Fermat): se M primo e a < M, aM-1 mod M = 1 proprietà 3 se M,a relativamente primi, allora ax ≡ ay (mod M) → x ≡ y (mod M) In altre parole, posso dividere per a e semplificare.
algoritmo efficiente per generare una radice primitiva 𝛼 di q → definizione → 𝛼 è una radice primitiva di q se per ogni b < q esiste i tale che b = 𝛼i mod qq se a relativamente primo con q non è una radice primitiva di q, allora ai mod q = 1 per i<q-1. tuttavia, aq-1 mod q = 1 (Fermat), quindi q-1 = k*i (i divisore di q-1). •Algoritmo (scegliere q t.c. sia facile fattorizzare q-1): •generare 𝛼 < q a caso, tale che a sia relativamente primo con q •fattorizzare q-1 (f1f2...fj = q-1) •se esiste f tale che a((q-1)/f)mod q = 1 allora torna al passo 1, altrimenti restituisci 𝛼
problemi di DH
- Protegge rispetto a lettura non autorizzata dei dati trasmessi su rete, non protegge rispetto ad attacchi di tipo attivo attacco → man in the middle soluzione → utilizzare canale autenticato per lo scambio di Pa, pb
- Permette solo di scambiare chiavi, non permette di cifrare direttamente messaggi arbitrari, quindi non può essere usato direttamente per autenticare/firmare