El campo de verificación de redundancia cíclica (CRC) se utiliza para determinar si el archivo se descifra o no correctamente. Citado de la especificación del formato ZIP original :
Después de descifrar el encabezado, los últimos 1 o 2 bytes en el Buffer DEBERÍAN ser la palabra / byte de orden superior del CRC para el archivo que se está descifrando, almacenado en el orden Intel de bytes bajos y bytes altos. Las versiones de PKZIP anteriores a 2.0 utilizaban una comprobación de CRC de 2 bytes; se utiliza una comprobación de CRC de 1 byte en las versiones posteriores a 2.0. Esto se puede usar para probar si la contraseña proporcionada es correcta o no.
Actualización: como se puede ver en unzip
código fuente de Info-ZIP , el valor CRC se usa para verificar si la contraseña es correcta:
enlace
#ifdef ZIP10 /* check two bytes */
c = hh[RAND_HEAD_LEN-2], b = hh[RAND_HEAD_LEN-1];
Trace((stdout,
" (c | (b<<8)) = %04x (crc >> 16) = %04x lrec.time = %04x\n",
(ush)(c | (b<<8)), (ush)(GLOBAL(lrec.crc32) >> 16),
((ush)GLOBAL(lrec.last_mod_dos_datetime) & 0xffff))));
if ((ush)(c | (b<<8)) != (GLOBAL(pInfo->ExtLocHdr) ?
((ush)GLOBAL(lrec.last_mod_dos_datetime) & 0xffff) :
(ush)(GLOBAL(lrec.crc32) >> 16)))
return -1; /* bad */
#else
b = hh[RAND_HEAD_LEN-1];
Trace((stdout, " b = %02x (crc >> 24) = %02x (lrec.time >> 8) = %02x\n",
b, (ush)(GLOBAL(lrec.crc32) >> 24),
((ush)GLOBAL(lrec.last_mod_dos_datetime) >> 8) & 0xff));
if (b != (GLOBAL(pInfo->ExtLocHdr) ?
((ush)GLOBAL(lrec.last_mod_dos_datetime) >> 8) & 0xff :
(ush)(GLOBAL(lrec.crc32) >> 24)))
return -1; /* bad */
#endif
/* password OK: decrypt current buffer contents before leaving */
for (n = (long)GLOBAL(incnt) > GLOBAL(csize) ?
(int)GLOBAL(csize) : GLOBAL(incnt),
p = GLOBAL(inptr); n--; p++)
zdecode(*p);
return 0; /* OK */