¿Cómo detecta un archivo zip la contraseña correcta?

4

Al extraer archivos de un archivo zip encriptado, se le pide al usuario que proporcione una contraseña para leer el archivo original.

¿Cómo detecta un ZIP cifrado cuando el usuario ha dado la contraseña correcta?

Obviamente, no se conecta con algún servicio backend y no contiene la contraseña real con la que comparar. Entonces, ¿cómo se comprueba exactamente? ¿Hay algún hash de la contraseña original incluida en el archivo? ¿Es fácil encontrar este hash?

    
pregunta CodyBugstein 11.12.2018 - 16:00
fuente

2 respuestas

8

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 */
    
respondido por el Selcuk 12.12.2018 - 00:20
fuente
0
  

¿Cómo detecta un ZIP cifrado cuando el usuario ha dado la información correcta?   contraseña?

     

Obviamente no se conecta con algún servicio backend, y   no contiene la contraseña real para comparar con. Entonces, ¿cómo exactamente   ¿comprueba?

Respuesta corta: la mayoría de los programas de extracción zip no comprueban la contraseña. Simplemente intentan descifrar los datos y, posiblemente, verificar si se parecen a datos reales. La respuesta de Selcuk indica que algunos programas probablemente usarán un CRC incluido en el archivo para obtener un cierto nivel de confianza de que los datos se descifran correctamente, pero de "debería" y "se puede usar" en el texto, suena como si fuera opcional (aunque se recomienda) ) para aplicaciones que utilizan el formato zip.

Por cierto, esto también puede permitir la recuperación (parcial) de datos en caso de corrupción de archivos, ya que una aplicación podría simplemente ignorar la verificación CRC y extraer lo que pueda del archivo zip cifrado, confiando en que el usuario encuentre los archivos defectuosos (que podrían ser indistinguible de una contraseña incorrecta dependiendo de cómo se escriba el resto de la especificación).

    
respondido por el Ben 14.12.2018 - 17:12
fuente

Lea otras preguntas en las etiquetas