Il tuo ciclo è sbagliato in due aspetti.
- Anche la lunghezza del DK è importante
- La password viene riutilizzata
In base alla pagina wiki (oppure puoi andare agli RFC se desideri):
DK = PBKDF2(PRF, Password, Salt, c, dkLen)
where:
- PRF is a pseudorandom function of two parameters with output length hLen (e.g. a keyed HMAC)
...
Each hLen-bit block Ti of derived key DK, is computed as follows:
DK = T1 || T2 || ... || Tdklen/hlen
Ti = F(Password, Salt, c, i)
F(Password, Salt, c, i) = U1 ^ U2 ^ ... ^ Uc
where:
U1 = PRF(Password, Salt || INT_32_BE(i))
U2 = PRF(Password, U1)
...
Uc = PRF(Password, Uc-1)
WPA2 utilizza un DK a 256 bit ( DK = PBKDF2(HMAC−SHA1, passphrase, ssid, 4096, 256)
), quindi il processo richiede due blocchi ( Ti
) per raggiungere questo poiché SHA1 è lungo solo 160 bit. Inoltre, l'iterazione descritta qui utilizza la password originale per ogni iterazione, ovvero Ui = PRF(Password, Ui-1)
, oppure si riutilizza la password modificata su ogni iterazione nel proprio loop.
Per una versione semplificata per WPA2 vorrei scrivere:
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
}