Un frame WEP 802.11 è composto da molti campi: header, dati (in inglese data), ICV, ecc. Ora prendere in considerazione solo il campo data e ICV, supponendo che l'IV sia costante.
L'algoritmo ICV è un'implementazione del CRC32. Viene calcolato in modo incrementale per ogni byte di dati del frame. Di seguito gli step in C:
crc = crc_tbl[(crc ^ data[i]) & 0xFF] ^ ( crc >> 8 );
L'ICV viene memorizzato in little-endian ed il frame viene xorato con un keystream RC4. Da ora in poi, l'operazione di XOR sarà rappresentata con il simbolo `+'.
Frame 1:
_____ DATA ___ ____ICV ___ D0 D1 D2 D3 D4 I3 I2 I1 I0 + + + + + + + + + K0 K1 K2 K3 K4 K5 K6 K7 K8 = = = = = = = = = R0 R1 R2 R3 R4 R5 R6 R7 R8
Dove D è il plaintext (i byte di dati), l è l'ICV, K è il keystream e R è il risultato. Aggiungendo un byte di dati (D5) si ottiene un secondo frame, il Frame 2:
_____ DATA ______ ____ICV ___ D0 D1 D2 D3 D4 D5 J3 J2 J1 J0 + + + + + + + + + + K0 K1 K2 K3 K4 K5 K6 K7 K8 K9 = = = = = = = = = = S0 S1 S2 S3 S4 S5 S6 S7 S8 S9
Dove J è l'ICV e S è il risultato.
E' possibile risalire al Frame 1 dal Frame 2 ipotizzando il valore della somma I3+D5, che sarà indicato con X (uno dei 256 cambiamenti). X=I3+D5
Il valore di X sarà indovinato provando e sbagliando. L'access point scarterà i frame invalidi, processo che in qualche modo aiuta ad indovinare il valore di X.
In questo modo viene trovato un frame valido più piccolo di 1 byte rispetto all'originale, e di conseguenza viene indovinato un byte del keystream. Questo processo può essere utilizzato per ottenere l'intero keystream.
Per una descrizione più dettagliata vedere: