2010-03-17 25 views
9

Pour générer une clé maîtresse par paire valide pour un réseau WPA2, un routeur utilise l'algorithme PBKDF2-HMAC-SHA1. Je comprends que la fonction sha1 est effectuée 4096 fois pour dériver la PMK, mais j'ai deux questions sur le processus.PBKDF2-HMAC-SHA1

Excusez le pseudo-code.

1) Comment est formatée l'entrée de la première instance de la fonction SHA1? SHA1 (« network_name » + « network_name_length » + « network_password »)

est-il formaté dans cet ordre, est-il la valeur hexadécimale du nom du réseau, la longueur et le mot de passe ou ASCII droite? Ensuite, d'après ce que je comprends, le digest 160 bits reçu est directement introduit dans un autre cycle de hachage sans salage supplémentaire. Comme ceci: SHA1 ("160bit digest du dernier round de hachage") Relevez et répétez.

2) Une fois que cela se produit 4096 fois, 256 bits de la sortie sont utilisés comme clé principale par paire. Ce que je ne comprends pas, c'est que si SHA1 produit une sortie à 160 bits, comment l'algorithme arrive-t-il aux 256 bits requis pour une clé?

Merci pour l'aide.

Répondre

8

oui C'est vrai, l'algorithme pour générer une clé binaire pour un réseau WPA est:

key = PBKDF2 (phrase de passe, ssid, 4096, 256)

PBKDF2 est décrite dans http://www.ietf.org/rfc/rfc2898.txt

Il utilise l'algorithme HMAC pour créer un condensé de l'entrée. HMAC peut utiliser n'importe quelle fonction de hachage, ici la spécification appelle SHA1 comme vous l'avez mentionné. Le hachage est effectué sur un état intermédiaire à l'intérieur de l'algorithme HMAC:

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

(H = la fonction de hachage choisi, K est le mot de passe, le texte serait ssid)

Ce processus HMAC est répété 4096 fois par PBKDF2.

algorithme HMAC: http://www.ietf.org/rfc/rfc2104

Il y a un exemple source ici de dériver une clé:

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) 

sel est le SSID, passe est le mot de passe.