7.2. Output from Key Exchange (Ausgabe des Schlüsselaustauschs)
7.2. Output from Key Exchange (Ausgabe des Schlüsselaustauschs)
Der Schlüsselaustausch erzeugt zwei Werte: ein gemeinsames Geheimnis K und einen Austausch-Hash H. Verschlüsselungs- und Authentifizierungsschlüssel werden daraus abgeleitet. Der Austausch-Hash H vom ersten Schlüsselaustausch wird zusätzlich als Sitzungsidentifikator verwendet, der ein eindeutiger Identifikator für diese Verbindung ist. Er wird von Authentifizierungsmethoden als Teil der Daten verwendet, die als Nachweis des Besitzes eines privaten Schlüssels signiert werden. Einmal berechnet, wird der Sitzungsidentifikator nicht geändert, selbst wenn Schlüssel später erneut ausgetauscht werden.
Jede Schlüsselaustauschmethode spezifiziert eine Hash-Funktion, die beim Schlüsselaustausch verwendet wird. Derselbe Hash-Algorithmus MUSS bei der Schlüsselableitung verwendet werden. Hier nennen wir ihn HASH.
Verschlüsselungsschlüssel MÜSSEN als HASH eines bekannten Werts und K wie folgt berechnet werden:
- Initialer IV Client zu Server: HASH(K || H || "A" || session_id)
- Initialer IV Server zu Client: HASH(K || H || "B" || session_id)
- Verschlüsselungsschlüssel Client zu Server: HASH(K || H || "C" || session_id)
- Verschlüsselungsschlüssel Server zu Client: HASH(K || H || "D" || session_id)
- Integritätsschlüssel Client zu Server: HASH(K || H || "E" || session_id)
- Integritätsschlüssel Server zu Client: HASH(K || H || "F" || session_id)
Schlüsseldaten MÜSSEN vom Anfang der Hash-Ausgabe genommen werden. So viele Bytes wie benötigt werden vom Anfang des Hash-Werts genommen. Wenn die benötigte Schlüssellänge länger ist als die Ausgabe des HASH, wird der Schlüssel erweitert, indem HASH der Verkettung von K und H und des gesamten bisherigen Schlüssels berechnet wird, und die resultierenden Bytes (so viele wie HASH erzeugt) an den Schlüssel angehängt werden. Dieser Prozess wird wiederholt, bis genügend Schlüsselmaterial verfügbar ist; der Schlüssel wird vom Anfang dieses Werts genommen. Mit anderen Worten:
K1 = HASH(K || H || X || session_id) (X ist z.B. "A")
K2 = HASH(K || H || K1)
K3 = HASH(K || H || K1 || K2)
...
key = K1 || K2 || K3 || ...
Dieser Prozess verliert Entropie, wenn die Menge an Entropie in K größer ist als die interne Zustandsgröße von HASH.