Tu bucle está mal en dos aspectos.
- La longitud del DK también es importante
- La contraseña se reutiliza
De acuerdo con la wiki (o puede ir a la RFC si lo desea):
DK = PBKDF2(PRF, Password, Salt, c, dkLen)
donde:
- PRF es una función pseudoaleatoria de dos parámetros con longitud de salida hLen (por ejemplo, un HMAC con clave)
...
Cada bloque hLen-bit Ti de la clave derivada DK, se calcula de la siguiente manera:
DK = T1 || T2 || ... || Tdklen/hlen
Ti = F(Password, Salt, c, i)
F(Password, Salt, c, i) = U1 ^ U2 ^ ... ^ Uc
donde:
U1 = PRF(Password, Salt || INT_32_BE(i))
U2 = PRF(Password, U1)
...
Uc = PRF(Password, Uc-1)
WPA2 usa un DK de 256 bits ( DK = PBKDF2(HMAC−SHA1, passphrase, ssid, 4096, 256)
), por lo que el proceso necesita dos bloques ( Ti
) para alcanzar esto, ya que SHA1 solo tiene una longitud de 160 bits. Además, la iteración descrita aquí usa la contraseña original para cada iteración, es decir, Ui = PRF(Password, Ui-1)
, o está reutilizando la contraseña modificada en cada iteración en su propio bucle.
Para una versión simplificada para WPA2 escribiría:
DK = B1 || trunc(B2)
B1 = F(Password, SSID || INT(1))
B2 = F(Password, SSID || INT(2))
where F(P, S) is the function
for(0, 4096) {
U = HMAC-SHA1(P, S)
S = U
}