2010-03-17 19 views
9

Um einen gültigen paarweisen Hauptschlüssel für ein WPA2-Netzwerk zu generieren, verwendet ein Router den PBKDF2-HMAC-SHA1-Algorithmus. Ich verstehe, dass die sha1-Funktion 4096 mal durchgeführt wird, um den PMK abzuleiten, jedoch habe ich zwei Fragen über den Prozess.PBKDF2-HMAC-SHA1

Entschuldigen Sie den Pseudocode.

1) Wie wird die Eingabe für die erste Instanz der SHA1-Funktion formatiert? SHA1 ("Netzwerkname" + "Netzwerkname_Länge" + "Netzwerk_Kennwort")

Ist es in dieser Reihenfolge formatiert, ist es der Hexadezimalwert des Netzwerknamens, Länge und Passwort oder gerade ASCII?

Dann von dem, was ich erhalte die 160-Bit-Digest erhalten direkt in eine weitere Runde Hashing ohne zusätzliche Salzen zugeführt. So: SHA1 ("160bit Digest aus der letzten Runde des Hashings") Rise and repeat.

2) Sobald dies erfolgt 4096 Mal 256 Bits der Ausgabe wird als der paarweise Hauptschlüssel verwendet. Was ich nicht verstehe, ist, dass, wenn SHA1 eine 160-Bit-Ausgabe erzeugt, wie gelangt der Algorithmus zu den 256 Bits, die für einen Schlüssel benötigt werden?

Danke für die Hilfe.

Antwort

8

ja Das ist richtig, geht der Algorithmus einen binären Schlüssel für ein WPA-Netzwerk zu erzeugen, ist:

key = PBKDF2 (Passwort, SSID, 4096, 256)

PBKDF2 in http://www.ietf.org/rfc/rfc2898.txt

beschrieben Es verwendet den HMAC-Algorithmus, um einen Digest der Eingabe zu erstellen. HMAC kann jede Hash-Funktion verwenden, hier ruft die Spezifikation wie erwähnt SHA1 auf. Der Hash auf einem Zwischenzustand innerhalb des HMAC-Algorithmus durchgeführt wird:

H(K XOR opad, H(K XOR ipad, text)) 

(H = die gewählte Hashfunktion, K das Passwort ist, wäre Text SSID sein)

Dieser HMAC Prozess wird wiederholt 4096 Mal durch PBKDF2.

HMAC-Algorithmus: http://www.ietf.org/rfc/rfc2104

Es gibt eine Quelle Beispiel hier einen Schlüssel abzuleiten:

https://www.codeblog.org/viewsrc/openssl-engine-0.9.6a/crypto/evp/p5_crpt2.c

int PKCS5_PBKDF2_HMAC_SHA1(const char *pass, int passlen, 
    80:       unsigned char *salt, int saltlen, int iter, 
    81:       int keylen, unsigned char *out) 

Salz ist die SSID, Pass das Passwort ist.