RSA (Rivest-Shamir-Adleman) (1977)
La crittografia a chiave asimmetrica, nota anche come crittografia a chiave pubblica, si differenzia da quella simmetrica per due aspetti fondamentali: - Vengono utilizzate due chiavi di cifratura dis
La crittografia a chiave asimmetrica, nota anche come crittografia a chiave pubblica, si differenzia da quella simmetrica per due aspetti fondamentali:
- Vengono utilizzate due chiavi di cifratura distinte.
- Gli algoritmi si basano su complessi calcoli matematici piuttosto che sulla semplice sostituzione di bit/caratteri.
Concetto Fondamentale
In questi metodi, l'algoritmo utilizza due chiavi, solitamente denominate A e B, generate in modo tale che:
- Cifrando con la chiave A, la decodifica può avvenire solo con la chiave B.
- Cifrando con la chiave B, la decodifica può avvenire solo con la chiave A.
- Conoscendo una delle due chiavi non è possibile risalire all'altra.
Ruoli delle Chiavi
Nell'utilizzo pratico, alle due chiavi viene associato un ruolo specifico:
- Chiave Pubblica: Non deve essere tenuta segreta e può essere liberamente condivisa con altri.
- Chiave Privata: Deve essere mantenuta segreta e riservata. Non deve essere condivisa con nessuno.
Scenari di Utilizzo
L'assegnazione dei ruoli di chiave pubblica/privata permette di utilizzare gli algoritmi a chiave asimmetrica in tre scenari principali:
1. Cifratura (Riservatezza): La cifratura di un messaggio con la chiave pubblica del destinatario permette solamente a lui di decifrarlo con la sua corrispondente chiave privata. Non tutti i metodi a chiave simmetrica ammettono questo scenario (es. l'OTP). 2. Firma Digitale (Autenticazione): La cifratura con la propria chiave privata permette a chiunque di accedere al messaggio con la certezza che: - Non sia stato modificato dopo la codifica (integrità). - Si certifica l'identità di chi ha eseguito la cifratura (non ripudio/autenticazione del mittente). 3. Scambio delle Chiavi: Due soggetti possono scambiarsi in modo sicuro chiavi di cifratura simmetriche su un canale di comunicazione non sicuro, utilizzando le rispettive chiavi asimmetriche.
Sicurezza degli Algoritmi a Chiave Pubblica
Le chiavi asimmetriche non possono essere scelte in modo casuale, ma devono essere calcolate in modo specifico. Il calcolo della chiave, così come le operazioni di cifratura e decifratura, deve essere computazionalmente semplice.
La sicurezza di un algoritmo a chiave pubblica è legata a 4 fattori cruciali:
1. Impossibilità di calcolare una chiave conoscendo l'altra. 2. Impossibilità di decifrare un messaggio senza conoscere la chiave necessaria. 3. Impossibilità di decifrare un messaggio usando la stessa chiave che lo ha cifrato. 4. Segretezza della chiave privata.
RSA (Rivest-Shamir-Adleman) (1977)
RSA è un algoritmo crittografico sviluppato nel 1977 da Ron Rivest, Adi Shamir e Len Adleman, da cui prende il nome.
- Utilizza chiavi di qualsiasi lunghezza. Attualmente, si raccomanda l'uso di una chiave di almeno 2048 bit.
- Si basa su concetti matematici legati principalmente alla teoria dei numeri primi.
Concetti Matematici Fondamentali
Numeri Coprimi
Due numeri si dicono coprimi se non hanno alcun divisore in comune, escludendo il numero 1.
- Esempio: 8 e 9 sono coprimi (i divisori di 8 sono 1, 2, 4, 8; i divisori di 9 sono 1, 3, 9).
Funzione di Eulero (ϕ)
La funzione di Eulero, calcolata per un numero intero n, è definita come il numero di interi positivi minori di n che sono coprimi con n (compreso il numero 1).
- Esempio: ϕ(10)=4 (gli interi coprimi con 10 e minori di 10 sono 1, 3, 7, 9).
#### Corollari della Funzione di Eulero:
- Se n è un numero primo, allora ϕ(n)=n−1.
- Se p e q sono due numeri primi, allora ϕ(p⋅q)=ϕ(p)⋅ϕ(q)=(p−1)⋅(q−1).
Generazione delle Chiavi RSA
L'algoritmo per calcolare la chiave pubblica e privata per RSA segue questi passi:
1. Scegliere due numeri primi (p, q), circa della stessa lunghezza. Il loro prodotto (n=p⋅q) deve avere una lunghezza pari alla lunghezza desiderata per la chiave (es. 2048 bit). 2. Calcolare il prodotto dei due numeri primi: n=p⋅q. 3. Calcolare la funzione di Eulero di n: m=ϕ(n)=(p−1)⋅(q−1). 4. Scegliere un numero e che sia coprimo con m. Tipicamente si usa e=65537. 5. Calcolare il numero d tale che (d⋅e)(modm)=1. Questo significa che d è l'inverso moltiplicativo di e modulo m. 6. La chiave pubblica è formata dalla coppia (e,n). 7. La chiave privata è formata dalla coppia (d,n).
Esempio Semplificato di Generazione Chiavi RSA:
- Scegliere p=17, q=11.
- n=p⋅q=17⋅11=187.
- m=(p−1)⋅(q−1)=(17−1)⋅(11−1)=16⋅10=160.
- Scegliere e=7 (è coprimo con 160).
- Calcolare d tale che (d⋅7)(mod160)=1. In questo caso, d=23 (infatti 23⋅7=161, e 161(mod160)=1).
- Chiave Pubblica: (e,n)=(7,187).
- Chiave Privata: (d,n)=(23,187).
Operazioni di Cifratura e Decifratura RSA
Dato un messaggio m da cifrare, con chiave pubblica (e,n) e chiave privata (d,n):
- Codifica (con chiave pubblica): c=me(modn)
- Decodifica (con chiave privata): m=cd(modn)
- Codifica (con chiave privata): c=md(modn) (per firma digitale)
- Decodifica (con chiave pubblica): m=ce(modn) (per verifica firma)
Esempio Semplificato di Cifratura/Decifratura RSA:
Con chiave pubblica (7,187), chiave privata (23,187) e messaggio m=88:
- Codifica: c=887(mod187)=11.
- Decodifica: m=1123(mod187)=88.
Sicurezza di RSA
La sicurezza di RSA si basa sulla difficoltà computazionale di fattorizzare numeri molto grandi nel prodotto di due primi. Ci sono cinque approcci principali per attaccare RSA:
1. Forza Bruta: Provare tutti i possibili valori di d (l'unica incognita). Aumentando la dimensione della chiave, il rischio si mitiga, ma diminuiscono anche le prestazioni. 2. Attacchi Matematici: Volti a calcolare i valori di p e q che hanno generato n (ovvero fattorizzare n). 3. Timing Attack: Basato sull'analisi dei tempi di esecuzione delle operazioni di decodifica. Al variare di d, i tempi di esecuzione possono variare, fornendo indizi. 4. Chosen Ciphertext Attack: L'attaccante in possesso di un ciphertext da decifrare (c=me(modn)), crea un nuovo ciphertext x1=(c⋅2e)(modn). Inviando x1 per la decodifica, riceve y1=x1d(modn). Sfruttando le proprietà modulari, y1=(2⋅m)e⋅d(modn)=(2⋅m)(modn), da cui è possibile dedurre m. 5. Probable Message Attack: L'attaccante in possesso di un ciphertext (c=me(modn)) è a conoscenza che il plaintext contiene una chiave di un algoritmo crittografico a chiave simmetrica (es. una chiave DES). L'attaccante può precalcolare tutte le possibili chiavi (es. 256 per DES) e cifrarle con la chiave pubblica della vittima. Confrontando i ciphertext generati con quello intercettato, è possibile risalire alla chiave reale.
ECC (Elliptic Curve Cryptography)
La crittografia a curva ellittica (ECC) è un metodo crittografico a chiave pubblica in crescente utilizzo, anche grazie alla spinta del mondo delle criptovalute.
- Rispetto a RSA, ECC utilizza chiavi di dimensioni inferiori garantendo lo stesso livello di sicurezza.
- Le prestazioni sono superiori, rendendola adatta a situazioni in cui la velocità di codifica/decodifica è importante.
- Le prestazioni sono meno legate alla dimensione della chiave rispetto a RSA.
- ECC con chiave a 256 bit offre una protezione analoga a RSA a 3072 bit.
- Sebbene ECC esista da tempo (circa dal 1985), l'interesse è aumentato solo in anni recenti, e di conseguenza, le attività di crittoanalisi sono inferiori rispetto a RSA.
Analogie e Differenze con RSA
Analogie:
- Entrambe si basano su calcoli matematici.
- La generazione delle chiavi avviene tramite un problema "difficile", rendendo di fatto impossibile risalire alla chiave privata conoscendo quella pubblica.
Differenze:
- RSA utilizza il problema della fattorizzazione di numeri interi molto grandi.
- ECC utilizza il problema del logaritmo discreto calcolato su funzioni a curva ellittica in campo finito.
- ECC non può essere utilizzata direttamente per la cifratura di messaggi generici (come RSA), ma è impiegata principalmente per firme digitali e scambio di chiavi.
Curve Ellittiche in Campo Finito
Una curva ellittica in campo finito è definita dall'insieme dei punti (x,y) che soddisfano l'equazione: y2=(x3+ax+b)(modp) Dove a, b, e p sono parametri specifici della curva.
Proprietà delle Curve Ellittiche:
- Sono simmetriche rispetto all'asse x.
- Una retta non verticale che unisce due punti della curva interseca sempre la curva in un altro punto.
L'Operatore "Dot" in ECC:
Dati due punti A e B sulla curva, e la retta che li unisce, possiamo definire l'operatore "dot" che identifica la proiezione del terzo punto di intersezione.
- Esempio: A⋅B=C.
- È possibile iterare l'operazione un numero qualsiasi di volte: A⋅C=D.
Generazione delle Chiavi ECC
La crittografia a curva ellittica sfrutta il fatto che, dato un punto iniziale e un punto finale su una curva, sia computazionalmente complesso risalire al numero di operazioni "dot" eseguite.
I parametri per la generazione della chiave sono:
- a,b,p: Parametri che definiscono l'equazione della curva ellittica y2=(x3+ax+b)(modp).
- G: Un punto iniziale predefinito sulla curva (detto punto generatore).
- n: Un numero intero casuale che rappresenta il numero di iterazioni "dot". Questo numero è la chiave privata.
- Gf: Il punto finale ottenuto dopo n iterazioni dell'operatore dot a partire da G (cioè Gf=nG). Questo punto è la chiave pubblica.
Solo il parametro n (la chiave privata) deve essere mantenuto segreto.
Curve Ellittiche di Frequente Utilizzo
- Curve25519 (usata in TLS 1.3):
- Secp256k1 (usata in Bitcoin):