5.2. PBKDF2
5.2. PBKDF2
PBKDF2 wendet eine Pseudozufallsfunktion (siehe Anhang B.1 für ein Beispiel) an, um Schlüssel abzuleiten. Die Länge des abgeleiteten Schlüssels ist im Wesentlichen unbegrenzt. (Der maximale effektive Suchraum für den abgeleiteten Schlüssel kann jedoch durch die Struktur der zugrunde liegenden Pseudozufallsfunktion begrenzt sein. Siehe Anhang B.1 für weitere Diskussion.) PBKDF2 wird für neue Anwendungen empfohlen.
PBKDF2 (P, S, c, dkLen)
Options (Optionen): PRF - underlying pseudorandom function (zugrunde liegende Pseudozufallsfunktion) (hLen bezeichnet die Länge in Oktetten der Ausgabe der Pseudozufallsfunktion)
Input (Eingabe):
P- password (Passwort), eine OktettzeichenketteS- salt, eine Oktettzeichenkettec- iteration count (Iterationszähler), eine positive ganze ZahldkLen- intended length in octets of the derived key (beabsichtigte Länge in Oktetten des abgeleiteten Schlüssels), eine positive ganze Zahl, höchstens (2^32 - 1) * hLen
Output (Ausgabe): DK - derived key (abgeleiteter Schlüssel), eine dkLen-Oktett-Zeichenkette
Steps (Schritte):
-
Wenn dkLen > (2^32 - 1) * hLen, geben Sie "derived key too long" (abgeleiteter Schlüssel zu lang) aus und stoppen Sie.
-
Sei l die Anzahl der hLen-Oktett-Blöcke im abgeleiteten Schlüssel, aufgerundet, und sei r die Anzahl der Oktette im letzten Block:
l = CEIL (dkLen / hLen)
r = dkLen - (l - 1) * hLen
Hier ist CEIL (x) die "Aufrundungsfunktion", d.h. die kleinste ganze Zahl, die größer als oder gleich x ist.
- Wenden Sie für jeden Block des abgeleiteten Schlüssels die unten definierte Funktion F auf das Passwort P, das Salt S, den Iterationszähler c und den Blockindex an, um den Block zu berechnen:
T_1 = F (P, S, c, 1) ,
T_2 = F (P, S, c, 2) ,
...
T_l = F (P, S, c, l) ,
wobei die Funktion F als die Exklusiv-Oder-Summe der ersten c Iterationen der zugrunde liegenden Pseudozufallsfunktion PRF definiert ist, angewendet auf das Passwort P und die Verkettung des Salts S und des Blockindex i:
F (P, S, c, i) = U_1 \xor U_2 \xor ... \xor U_c
wobei
U_1 = PRF (P, S || INT (i)) ,
U_2 = PRF (P, U_1) ,
...
U_c = PRF (P, U_{c-1}) .
Hier ist INT (i) eine Vier-Oktett-Kodierung der ganzen Zahl i, wobei das signifikanteste Oktett zuerst kommt.
- Verketten Sie die Blöcke und extrahieren Sie die ersten dkLen Oktette, um einen abgeleiteten Schlüssel DK zu erzeugen:
DK = T_1 || T_2 || ... || T_l<0..r-1>
- Geben Sie den abgeleiteten Schlüssel DK aus.
Hinweis: Die Konstruktion der Funktion F folgt einem "Gürtel-und-Hosenträger"-Ansatz. Die Iterationen U_i werden rekursiv berechnet, um einem Gegner einen Grad an Parallelität zu entziehen; sie werden per Exklusiv-Oder zusammengefügt, um Bedenken hinsichtlich der Degeneration der Rekursion in eine kleine Menge von Werten zu reduzieren.