Escribes una contraseña en un gestor de archivos comprimidos y, un instante después, se abre un archivo. Entre esos dos momentos hay una corta cadena de pasos que decide cuán fuerte es la protección y cómo un programa distingue una contraseña correcta de una incorrecta. Esa cadena es cómo funciona la protección con contraseña de ZIP, y seguirla desde la contraseña que escribes hasta el archivo desbloqueado muestra exactamente de dónde sale su fortaleza.
Una contraseña ZIP nunca cifra nada directamente. La herramienta la convierte en material de clave, ya sea sembrando las tres claves internas de ZipCrypto o ejecutando PBKDF2 para WinZip AES. Esa clave cifra los bytes comprimidos de cada archivo. Unos pequeños valores almacenados, un byte de comprobación o un valor de verificación, permiten descartar contraseñas incorrectas a bajo coste antes de que un paso de confirmación acepte la correcta.
De la contraseña a la clave
Ambos esquemas parten de la misma entrada, los bytes de tu contraseña (UTF-8 en las herramientas modernas). Lo que ocurre después con esos bytes es donde se separan.
ZipCrypto: tres claves, sin estiramiento
ZipCrypto, el esquema tradicional de PKWARE, guarda todo su estado en tres claves de 32 bits. Empiezan en constantes fijas y cada byte de la contraseña las actualiza por turno: la primera clave pasa por una actualización de tabla CRC-32 con el byte de la contraseña, la segunda absorbe el byte bajo de la primera y se multiplica por una constante, y la tercera pasa por una actualización CRC-32 con el byte alto de la segunda. Esa es toda la derivación de clave.
No hay sal ni estiramiento. Dos archivos protegidos con la misma contraseña parten de un estado de claves idéntico, y probar una candidata cuesta solo un puñado de operaciones aritméticas. Las debilidades de texto plano conocido que se derivan de este diseño se explican en la explicación de ZipCrypto.
WinZip AES: PBKDF2 con una sal por entrada
WinZip AES trata la contraseña como la entrada de una función deliberadamente lenta. La herramienta lee primero un byte de robustez del campo extra de la entrada: 1 significa AES-128, 2 significa AES-192 y 3 significa AES-256. Ese byte fija la longitud de la clave en 16, 24 o 32 bytes y la de la sal en 8, 12 o 16 bytes.
Después ejecuta PBKDF2-HMAC-SHA1 durante 1000 iteraciones sobre la contraseña y una sal aleatoria almacenada junto a esa entrada. La salida se divide en tres partes: la clave de cifrado AES, una clave de autenticación distinta de la misma longitud y un valor de verificación de contraseña de 2 bytes. Como cada entrada lleva su propia sal, la misma contraseña produce claves diferentes en entradas diferentes, así que las tablas precalculadas no sirven. Las 1000 iteraciones se repiten por cada bloque de 20 bytes de material de clave, así que un solo intento cuesta, a propósito, entre dos mil cálculos HMAC-SHA1 (AES-128) y cuatro mil (AES-256), con tres mil en AES-192. La página sobre WinZip AES cubre el cifrado en modo CTR y las variantes AE-1 y AE-2.
Cómo sabe una herramienta que la contraseña es correcta
Descifrar y descomprimir un archivo completo por cada candidata sería un desperdicio, así que ambos formatos guardan un valor pequeño que un lector puede comprobar primero. Esa comprobación es un filtro, no una prueba. La candidata que sobrevive pasa después por una prueba de confirmación completa. Basta con una entrada; ZipRecover prefiere la entrada cifrada más pequeña que sea lo bastante grande para confirmar una contraseña de forma decisiva (entre las entradas de hasta 256 MB comprimidos), lo que abarata cada confirmación. Si todas las entradas que puede probar son archivos ZipCrypto de menos de 4 bytes, el resultado indica que la contraseña solo superó una comprobación rápida. Si la única entrada que puede probar usa un método de compresión distinto de Store o Deflate, la herramienta solo puede comparar la longitud descifrada, que la contraseña correcta normalmente tampoco supera, así que la búsqueda suele terminar sin resultado. Si todas las entradas cifradas superan los 256 MB comprimidos, la herramienta muestra un error en lugar de buscar.
| Esquema | Primera comprobación rápida | Confirmación |
|---|---|---|
| ZipCrypto | Descifrar la cabecera de cifrado de 12 bytes y comparar su último byte con un byte de comprobación conocido (el byte alto del CRC-32 almacenado, o el de la hora de modificación cuando se usa un descriptor de datos): un filtro de aproximadamente 1 entre 256 | Descifrar el resto de la entrada, descomprimirla y comparar el CRC-32 y el tamaño del resultado con los valores del directorio central |
| WinZip AES | Comparar el valor de verificación de 2 bytes producido por PBKDF2 con el almacenado justo después de la sal: un filtro de aproximadamente 1 entre 65.536 | Recalcular HMAC-SHA1 sobre el texto cifrado con la clave de autenticación y comparar los primeros 10 bytes con el código de autenticación almacenado |
Los dos filtros no son iguales. Aproximadamente 1 contraseña incorrecta de cada 256 supera el byte de comprobación de ZipCrypto, y el paso de descifrado y CRC tiene que atraparla; ese paso es una suma de comprobación y no una prueba criptográfica, aunque una contraseña incorrecta que además se descomprima limpiamente con el tamaño y el CRC-32 correctos es extremadamente improbable en archivos reales. En AES, aproximadamente 1 contraseña incorrecta de cada 65.536 sobrevive al valor de verificación, y el paso HMAC-SHA1 que viene detrás es criptográficamente definitivo: una contraseña AES confirmada nunca es un falso positivo.
Fíjate en dónde recae el coste. En ZipCrypto ambas etapas son baratas. En AES la parte cara, PBKDF2, se ejecuta antes del filtro, así que el filtro solo ahorra el HMAC, y el esquema puede permitirse que cada intento sea lento.
Qué significa esto para una contraseña olvidada
Ningún paso de esta cadena puede saltarse. A un archivo no se le puede preguntar su contraseña; una herramienta solo puede proponer candidatas y pasar cada una por los pasos anteriores. La recuperación depende, por tanto, de lo grande que sea el espacio que hay que buscar y de lo rápido que se pueda probar cada candidata.
Un cálculo ilustrativo muestra la escala. Toma una contraseña de 12 caracteres con mayúsculas, minúsculas y dígitos: 62^12, unos 3,2 × 10^21 candidatas. A la tasa de un solo núcleo para AES-256 que el sitio midió con su script de prueba, unos 640 intentos por segundo, agotar ese espacio lleva 3,2 × 10^21 ÷ 640, unos 5 × 10^18 segundos, es decir, aproximadamente 1,6 × 10^11 años (160.000 millones de años). Incluso a la tasa de ZipCrypto medida del mismo modo, unos 240.000 intentos por segundo, el mismo espacio requiere del orden de 4 × 10^8 años. Ambas cifras están modeladas a partir de esas tasas medidas, no medidas en ningún archivo concreto, y añadir núcleos solo las divide de forma lineal.
Ahora reduce el espacio con lo que recuerdas. Si sabes que la contraseña tenía seis letras minúsculas, eso es 26^6, unos 309 millones de candidatas, que los mismos 640 por segundo cubren en aproximadamente 5,6 días en un núcleo, o unas 17 horas repartidas en ocho hilos de trabajo (de nuevo, ilustrativo). Un prefijo conocido, una longitud recordada o una lista de palabras personal recortan la búsqueda mucho más que un hardware más rápido. La guía sobre cuánto tarda la recuperación de una contraseña ZIP desarrolla estas tasas con más detalle.
Todo lo anterior se refiere al contenido de cada entrada. Los nombres, tamaños y fechas del directorio central siguen siendo legibles en un ZIP cifrado estándar; la guía sobre qué protege un archivo ZIP cifrado cubre esa visión del contenedor y cómo reconocer el esquema en uso.
Si el archivo es tuyo y la contraseña se ha perdido, anota primero lo que recuerdes de su forma y después ejecuta una recuperación privada de tu contraseña ZIP en el navegador. La herramienta lee el byte de robustez, prefiere la entrada cifrada más pequeña que sea lo bastante grande para confirmar una contraseña de forma decisiva (entre las entradas de hasta 256 MB comprimidos) y aplica exactamente la cadena de filtro y confirmación descrita aquí, solo en tu dispositivo.
Fuentes
- PKWARE, APPNOTE.TXT, especificación del formato de archivo .ZIP: estructura del contenedor, el bit de cifrado y el cifrado tradicional de PKWARE (la planificación de claves de ZipCrypto y la cabecera de 12 bytes).
- WinZip, AES Encryption Information: especificación de cifrado AE-1 y AE-2: el campo extra 0x9901, el byte de robustez, los tamaños de sal y clave, PBKDF2 con 1000 iteraciones, el valor de verificación de 2 bytes y el código de autenticación HMAC-SHA1 de 10 bytes.
- IETF, RFC 8018, PKCS #5: especificación de criptografía basada en contraseña, versión 2.1: la definición de PBKDF2.