Passa al contenuto principale

7.2. Output from Key Exchange (Output dallo scambio di chiavi)

7.2. Output from Key Exchange (Output dallo scambio di chiavi)

Lo scambio di chiavi produce due valori: un segreto condiviso K, e un hash di scambio H. Le chiavi di crittografia e autenticazione sono derivate da questi. L'hash di scambio H dal primo scambio di chiavi è inoltre utilizzato come identificatore di sessione, che è un identificatore univoco per questa connessione. È utilizzato dai metodi di autenticazione come parte dei dati che vengono firmati come prova del possesso di una chiave privata. Una volta calcolato, l'identificatore di sessione non viene modificato, anche se le chiavi vengono successivamente riscambiate.

Ciascun metodo di scambio chiavi specifica una funzione hash che viene utilizzata nello scambio di chiavi. Lo stesso algoritmo hash DEVE essere utilizzato nella derivazione delle chiavi. Qui lo chiameremo HASH.

Le chiavi di crittografia DEVONO essere calcolate come HASH, di un valore noto e K, come segue:

  • IV iniziale client verso server: HASH(K || H || "A" || session_id)
  • IV iniziale server verso client: HASH(K || H || "B" || session_id)
  • Chiave di crittografia client verso server: HASH(K || H || "C" || session_id)
  • Chiave di crittografia server verso client: HASH(K || H || "D" || session_id)
  • Chiave di integrità client verso server: HASH(K || H || "E" || session_id)
  • Chiave di integrità server verso client: HASH(K || H || "F" || session_id)

I dati della chiave DEVONO essere presi dall'inizio dell'output dell'hash. Tanti byte quanti necessari vengono presi dall'inizio del valore hash. Se la lunghezza della chiave necessaria è più lunga dell'output dell'HASH, la chiave viene estesa calcolando HASH della concatenazione di K e H e dell'intera chiave finora, e aggiungendo i byte risultanti (tanti quanti HASH genera) alla chiave. Questo processo viene ripetuto fino a quando è disponibile materiale chiave sufficiente; la chiave viene presa dall'inizio di questo valore. In altre parole:

K1 = HASH(K || H || X || session_id)   (X è ad esempio "A")
K2 = HASH(K || H || K1)
K3 = HASH(K || H || K1 || K2)
...
key = K1 || K2 || K3 || ...

Questo processo perderà entropia se la quantità di entropia in K è maggiore della dimensione dello stato interno di HASH.