Passa al contenuto principale

6. Diffie-Hellman

6. Diffie-Hellman

6.1. Curve25519

La funzione X25519 può essere utilizzata in un protocollo Elliptic Curve Diffie-Hellman (ECDH) come segue:

Alice genera 32 byte casuali in a[0] fino a a[31] e trasmette K_A = X25519(a, 9) a Bob, dove 9 è la coordinata u del punto base ed è codificata come un byte di valore 9, seguito da 31 byte zero.

Bob analogamente genera 32 byte casuali in b[0] fino a b[31], calcola K_B = X25519(b, 9) e lo trasmette ad Alice.

Usando i valori generati e l'ingresso ricevuto, Alice calcola X25519(a, K_B) e Bob calcola X25519(b, K_A).

Entrambi condividono ora K = X25519(a, X25519(b, 9)) = X25519(b, X25519(a, 9)) come segreto condiviso. Ciascuna delle due parti PUÒ verificare, senza far trapelare informazioni aggiuntive sul valore di K, se K è il valore tutto-zero e interrompere in tal caso (vedere sotto). Alice e Bob possono quindi usare una funzione di derivazione delle chiavi che includa K, K_A e K_B per derivare una chiave simmetrica.

Il controllo sul valore tutto-zero deriva dal fatto che la funzione X25519 produce tale valore se opera su un ingresso corrispondente a un punto di ordine piccolo, dove l'ordine divide il cofattore della curva (vedere la Sezione 7). Il controllo può essere effettuato mettendo in OR tutti i byte e verificando se il risultato è zero, poiché ciò elimina i canali laterali usuali nelle implementazioni software.

Vettore di test:

Chiave privata di Alice, a:

77076d0a7318a57d3c16c17251b26645df4c2f87ebc0992ab177fba51db92c2a

Chiave pubblica di Alice, X25519(a, 9):

8520f0098930a754748b7ddcb43ef75a0dbf3a0d26381af4eba4a98eaa9b4e6a

Chiave privata di Bob, b:

5dab087e624a8a4b79e17f8b83800ee66f3bb1292618b6fd1c2f8b27ff88e0eb

Chiave pubblica di Bob, X25519(b, 9):

de9edb7d7b7dc1b4d35b61c2ece435373f8343c85b78674dadfc7e146f882b4f

Il loro segreto condiviso, K:

4a5d9d5ba4ce2de1728e3bf480350f25e07e21c947d19e3376f09b3c1e161742

6.2. Curve448

La funzione X448 può essere utilizzata in un protocollo ECDH in modo molto simile alla funzione X25519.

Se si usa X448, le sole differenze sono che Alice e Bob generano 56 byte casuali (non 32) e calcolano K_A = X448(a, 5) o K_B = X448(b, 5), dove 5 è la coordinata u del punto base ed è codificata come un byte di valore 5, seguito da 55 byte zero.

Come per X25519, ciascuna delle due parti PUÒ verificare, senza far trapelare informazioni aggiuntive sul valore di K, se il K condiviso risultante è il valore tutto-zero e interrompere in tal caso.

Vettore di test:

Chiave privata di Alice, a:

9a8f4925d1519f5775cf46b04b5800d4ee9ee8bae8bc5565d498c28dd9c9baf574a9419744897391006382a6f127ab1d9ac2d8c0a598726b

Chiave pubblica di Alice, X448(a, 5):

9b08f7cc31b7e3e67d22d5aea121074a273bd2b83de09c63faa73d2c22c5d9bbc836647241d953d40c5b12da88120d53177f80e532c41fa0

Chiave privata di Bob, b:

1c306a7ac2a0e2e0990b294470cba339e6453772b075811d8fad0d1d6927c120bb5ee8972b0d3e21374c9c921b09d1b0366f10b65173992d

Chiave pubblica di Bob, X448(b, 5):

3eb7a829b0cd20f5bcfc0b599b6feccf6da4627107bdb0d4f345b43027d8b972fc3e34fb4232a13ca706dcb57aec3dae07bdc1c67bf33609

Il loro segreto condiviso, K:

07fff4181ac6cc95ec1c16a94a0f74d12da232ce40a77552281d282bb60c0b56fd2464c335543936521c24403085d59a449a5037514a879d