(:title Scambio di chiavi Diffie-Hellman:)
:: Scambio di chiavi Diffie-Hellman ::
Torna alla pagina di crittografia
Che cos'è
Alice e Bob vogliono comunicarsi un segreto, in questo caso un numero segreto. Ma il canale su cui parlano non è sicuro. Come faranno i nostri eroi?
Come funziona
Devo calcolare due parametri iniziali
p = un numero primo
g = un numero generatore di Zp*
e questi due numeri sono diffusi pubblicamente.
Alice e Bob NON SANNO all'inizio quale chiave si scambieranno: entrambi la scopriranno alla fine!
Ad ogni modo, ecco quello che succede:
- Alice calcola un x a caso, ed invia a Bob il valore gx mod p
- Bob calcola un y a caso, ed invia ad Alice il valore gy mod p
Il segreto è dato da gxy mod p
- Alice riceve gy e conosce x: è quindi in grado di fare (gy)x mod p
- Bob riceve gx e conosce y: è quindi in grado di fare (gx)y mod p
Ricordo che gxy è uguale a gyx.
Perché è sicuro
È sicuro perché un attaccante che vede transitare il valore gx o gy non è in grado di ricavare, da esso, la x o la y.
O meglio, sarebbe in grado, ma il problema è calcolare il logaritmo discreto:
gx = a mod p
Conosco x, a e p: so calcolare qual'è quel numero x tale che, se elevo g alla x, ottengo a mod p?
Ci vuole molto ma molto tempo di calcolo, ecco perché è un problema difficile!
Che cos'è il generatore?
Il generatore, o radice primitiva, di Zp*, è quel numero appartenente all'insieme Zp*, il quale, elevato a potenza per ciascuno degli elementi di Zp*, mi dà a sua volta tutti gli elementi di Zp*, in un qualche ordine.
Per capirci subito, prendiamo il campo Z11 e il numero 2, che evidentemente appartiene a Z11.
21 = 2 mod 11
22 = 4 mod 11
23 = 8 mod 11
24 = 16 = 5 mod 11
25 = 32 = 10 mod 11
26 = 64 = 9 mod 11
27 = 128 = 7 mod 11
28 = 256 = 3 mod 11
29 = 512 = 6 mod 11
210 = 1024 = 1 mod 11
Vedete quindi che, in un qualsiasi ordine, le potenze di 2 mod 11 generano tutti i valori di Z11. Capito che cos'è il generatore?
Come faccio a calcolare il generatore di un certo Zp?
L'idea banale è: prendo tutti i possibili g, e faccio tutte le potenze finché non ne trovo uno che soddisfa la proprietà citata qui sopra.
Il problema ovviamente nasce quando p è molto ampio, e calcolare tutte le potenze di un numero diventa una cosa mostruosa.
Allora, uso il seguente sistema:
- Trovo la fattorizzazione di p-1: sarà una cosa del tipo p1e1p2e2...pnen, in cui i vari pi sono i fattori di p-1, e i vari ei sono i relativi esponenti.
- Scelgo un numero g a caso, minore di p
- Vedo se questo numero g rispetta il seguente sistema:
g(p-1) / p1 != 1 mod p
g(p-1) / p2 != 1 mod p
...
g(p-1) / pn != 1 mod p
Se per tutte le congruenze, g(p-1) / pn != 1, allora quel g è generatore di Zp
Facciamo un esempio, con p = 11 e g = 3.
Se p = 11, allora p-1 = 10, che si fattorizza come 10 = 2 * 5'.
Il sistema diventa:
3(10) / 2 != 1 mod 11
3(10) / 5 != 1 mod 11
È vero che 3(10) / 2 != 1 mod p ? 35 mod 11 = 1 quindi NO!
Ciò vuol dire che 3 non è''' un generatore di Z11.
Prendiamo invece g = 2:
2(10) / 2 != 1 mod 11
2(10) / 5 != 1 mod 11
2'^5^ = 10 mod 11
2'^2'^ = 4 mod 11
Questo vuol dire che il sistema è rispettato, e 2 è generatore di Z11.
Attacco meet in the middle
... da completare ...
Generalizzazione per 3 persone
... da completare
Torna alla pagina di crittografia