Aller au contenu principal

7.2. Output from Key Exchange (Sortie de l'échange de clés)

7.2. Output from Key Exchange (Sortie de l'échange de clés)

L'échange de clés produit deux valeurs: un secret partagé K, et un hachage d'échange H. Les clés de chiffrement et d'authentification sont dérivées de celles-ci. Le hachage d'échange H du premier échange de clés est en outre utilisé comme identifiant de session, qui est un identifiant unique pour cette connexion. Il est utilisé par les méthodes d'authentification comme une partie des données qui sont signées comme preuve de possession d'une clé privée. Une fois calculé, l'identifiant de session n'est pas modifié, même si les clés sont ultérieurement réchangées.

Chaque méthode d'échange de clés spécifie une fonction de hachage qui est utilisée dans l'échange de clés. Le même algorithme de hachage DOIT être utilisé dans la dérivation de clés. Ici, nous l'appellerons HASH.

Les clés de chiffrement DOIVENT être calculées comme HASH, d'une valeur connue et K, comme suit:

  • IV initial client vers serveur: HASH(K || H || "A" || session_id)
  • IV initial serveur vers client: HASH(K || H || "B" || session_id)
  • Clé de chiffrement client vers serveur: HASH(K || H || "C" || session_id)
  • Clé de chiffrement serveur vers client: HASH(K || H || "D" || session_id)
  • Clé d'intégrité client vers serveur: HASH(K || H || "E" || session_id)
  • Clé d'intégrité serveur vers client: HASH(K || H || "F" || session_id)

Les données de clé DOIVENT être prises du début de la sortie du hachage. Autant d'octets que nécessaire sont pris du début de la valeur de hachage. Si la longueur de clé nécessaire est supérieure à la sortie du HASH, la clé est étendue en calculant le HASH de la concaténation de K et H et de la clé entière jusqu'à présent, et en ajoutant les octets résultants (autant que HASH génère) à la clé. Ce processus est répété jusqu'à ce que suffisamment de matériel de clé soit disponible; la clé est prise du début de cette valeur. En d'autres termes:

K1 = HASH(K || H || X || session_id)   (X est par exemple "A")
K2 = HASH(K || H || K1)
K3 = HASH(K || H || K1 || K2)
...
key = K1 || K2 || K3 || ...

Ce processus perdra de l'entropie si la quantité d'entropie dans K est plus grande que la taille d'état interne de HASH.