WPA2-PSK es el estándar de seguridad WiFi más extendido en redes domésticas y pequeñas empresas. A diferencia de WEP o WPA-TKIP, emplea AES en modo CCM (CCMP) para cifrar cada paquete, lo que lo hace considerablemente más robusto. Sin embargo, entender cómo funciona internamente es clave tanto para defenderlo como para comprender por qué los ataques de diccionario siguen siendo una amenaza real cuando la contraseña es débil.
Preparación inicial — Derivación de la PMK
La contraseña WPA2 (passphrase) nunca se usa directamente para cifrar tráfico. Primero se transforma en una clave de 256 bits llamada PMK (Pairwise Master Key) mediante una función de derivación lenta e iterativa:
PMK = PBKDF2-HMAC-SHA1(passphrase, SSID, 4096 iteraciones, 256 bits)
Passphrase
Contraseña WPA2 definida por el usuario (8–63 caracteres ASCII).
SSID como salt
El nombre de la red actúa como salt, haciendo que la misma contraseña genere PMKs distintas en redes diferentes.
4096 iteraciones
Número fijo por estándar. Dificulta enormemente los ataques de fuerza bruta offline.
Salida: 256 bits
32 bytes que conforman la PMK. Permanece estática mientras no cambie la contraseña.
4-Way Handshake — Negociación de claves
El 4-Way Handshake es el proceso que permite al AP y al cliente derivar claves de sesión únicas y verificar mutuamente que ambos conocen la PMK, sin transmitirla nunca por el aire. Se transporta mediante el protocolo EAPOL (EAP over LAN).
Mensaje 1 — AP → Cliente
El punto de acceso envía el ANonce (un número aleatorio de 32 bytes) y su dirección MAC. Con esta información el cliente ya puede calcular la PTK sin necesidad de más intercambios.
Mensaje 2 — Cliente → AP
El cliente genera su propio SNonce y calcula la PTK combinando:
PTK = PRF(PMK, ANonce, SNonce, MAC_AP, MAC_Cliente)
El cliente devuelve el SNonce junto a un MIC (Message Integrity Code) calculado con la KCK, que permite al AP verificar que el cliente conoce la PMK correcta. Capturar M1 y M2 es suficiente para realizar un ataque de diccionario offline.
Mensaje 3 — AP → Cliente
El AP calcula la misma PTK por su parte, genera la GTK (Group Temporal Key) para cifrar tráfico broadcast/multicast, y la envía cifrada con la KEK junto a otro MIC.
Mensaje 4 — Cliente → AP
El cliente verifica el MIC, confirma la recepción, instala PTK y GTK. A partir de este momento comienza el cifrado de datos con CCMP.
AP → Cliente: ANonce + MAC del AP
Cliente → AP: SNonce + MIC (KCK). El cliente ya tiene la PTK calculada.
AP → Cliente: GTK cifrada con KEK + MIC. El AP confirma la PTK.
Cliente → AP: Confirmación de instalación. Comienza el tráfico cifrado.
EAPOL — El protocolo del handshake
EAPOL (Extensible Authentication Protocol over LAN) es el protocolo que transporta todos los mensajes del 4-Way Handshake. Cada uno de los cuatro mensajes es una trama EAPOL-Key.
Transporta nonces
ANonce y SNonce viajan en las tramas EAPOL-Key sin cifrar.
Transporta MICs
El MIC calculado con la KCK permite verificar la autenticidad de cada mensaje.
Transporta la GTK
La GTK va cifrada con la KEK dentro del mensaje M3.
Relevancia en auditorías
Capturar M1+M2 permite ataques offline. En WPA2, un PMKID permite atacar sin handshake completo.
Claves derivadas de la PTK
La PTK ocupa 64 bytes y se divide en tres sub-claves con funciones distintas:
| Sub-clave | Tamaño | Función |
|---|---|---|
| KCK — Key Confirmation Key | 16 bytes | Calcula el MIC de las tramas EAPOL para verificar integridad |
| KEK — Key Encryption Key | 16 bytes | Cifra la GTK antes de enviarla al cliente (mensaje M3) |
| TK — Temporal Key | 16 bytes | Cifra el tráfico de datos unicast con AES-CCMP |
Clave de grupo — GTK
La GTK (Group Temporal Key) es la clave que protege el tráfico dirigido a todos los clientes de la red (broadcast y multicast). A diferencia de la PTK, que es única por pareja AP-cliente, la GTK es compartida por todos los dispositivos conectados.
- La genera el AP a partir de una GMK (Group Master Key) interna.
- Se distribuye a cada cliente cifrada con su KEK individual durante el mensaje M3.
- Se renueva periódicamente o cuando un cliente abandona la red.
- Protege tramas como ARPs broadcast o paquetes DHCP.
Generación de clave por paquete — CCMP
WPA2 usa AES en modo CCM (Counter with CBC-MAC), llamado CCMP. A diferencia de WEP o TKIP, no reutiliza nunca el mismo keystream para dos paquetes distintos. Para cada paquete unicast se genera un contexto único mediante un Packet Number (PN) de 48 bits:
Se incrementa el PN (Packet Number) de 48 bits. Nunca se repite.
Se construye un nonce combinando: MAC del emisor + PN + campos del estándar 802.11i.
AES-CCM usa la TK (o GTK) + nonce en modo CTR para generar el keystream único del paquete.
Clave efectiva = TK/GTK + nonce (MAC emisor + PN)
Construcción y cifrado del paquete CCMP
Qué se protege
- Payload (datos): se cifran completamente.
- Cabeceras 802.11 relevantes (AAD): no se cifran, pero sí se autentican mediante el MIC.
Cálculo del MIC de integridad
MIC = CBC-MAC_AES(TK, AAD + datos)
Cifrado del bloque de datos + MIC
ciphertext = (datos + MIC) XOR keystream_AES_CTR(TK, nonce)
Estructura del paquete final
[ Cabecera 802.11 (en claro, autenticada por MIC) ]
[ Encabezado CCMP: PN (48 bits) | Key ID | Flags — en claro ]
[ Payload cifrado: datos + MIC ← cifrado con AES-CTR ]
Recepción y verificación
Al recibir el paquete, el receptor realiza los siguientes pasos para verificar tanto la confidencialidad como la integridad:
Lee el PN del encabezado CCMP y verifica que es mayor que el último PN recibido. Si es igual o menor, descarta el paquete (protección anti-replay).
Reconstruye el nonce usando MAC del emisor y el PN recibido.
Genera el mismo keystream AES-CTR con la TK compartida y el nonce.
Descifra el payload: datos + MIC = ciphertext XOR keystream
Recalcula el MIC sobre las cabeceras autenticadas (AAD) y los datos descifrados.
Compara el MIC calculado con el MIC recibido (descifrado). Si coinciden, el paquete es válido y se entrega a las capas superiores.
✅ MIC coincide
Paquete aceptado. Confidencialidad, integridad y autenticidad verificadas.
❌ MIC no coincide
Paquete descartado silenciosamente. Indica modificación o replay.
❌ PN repetido
Paquete descartado. Protección contra ataques de repetición.