Come fa un file zip a rilevare una password corretta?

4

Durante l'estrazione di file da un archivio zip crittografato, all'utente viene chiesto di fornire una password per leggere il file originale.

Come viene rilevato un ZIP crittografato quando l'utente ha fornito la password corretta?

Ovviamente non si connette con alcuni servizi di back-end e non contiene la vera password da confrontare. Quindi, come controlla esattamente? C'è qualche hash della password originale inclusa nell'archivio? È facile trovare questo hash?

    
posta CodyBugstein 11.12.2018 - 16:00
fonte

2 risposte

9

Il campo CRC (Cyclic Redundancy Check) viene utilizzato per determinare se il file viene decrittografato correttamente. Citato dalla specifica del formato ZIP originale:

After the header is decrypted, the last 1 or 2 bytes in Buffer SHOULD be the high-order word/byte of the CRC for the file being decrypted, stored in Intel low-byte/high-byte order. Versions of PKZIP prior to 2.0 used a 2 byte CRC check; a 1 byte CRC check is used on versions after 2.0. This can be used to test if the password supplied is correct or not.

Aggiornamento: come si può vedere dal % codice sorgente% di Info-ZIP Info-ZIP , il valore CRC viene utilizzato per verificare se la password è corretta:

link

#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 */
    
risposta data 12.12.2018 - 00:20
fonte
1

How does an encrypted ZIP detect when the user has given the correct password?

Obviously it does not connect with some backend service, and it doesn't contain the actual password to compare against. So how exactly does it check?

Risposta breve: la maggior parte dei programmi di estrazione zip probabilmente non controlla la password. Cercano semplicemente di decrittografare i dati e possibilmente controllano se sembrano dati reali. La risposta di Selcuk indica che alcuni programmi useranno probabilmente un CRC incluso nel file per ottenere un certo livello di confidenza che i dati sono decodificati correttamente, ma dal "dovrebbe" e "può essere usato" nel testo sembra che questo sia opzionale (anche se incoraggiato ) per le applicazioni che utilizzano il formato zip.

Inoltre, questo può consentire il recupero (parziale) dei dati in caso di danneggiamento dei file, in quanto un'applicazione potrebbe semplicemente ignorare il controllo CRC ed estrarre ciò che può dallo zip crittografato, basandosi sull'utente per trovare i file non validi (che potrebbero essere indistinguibile da una password errata a seconda di come viene scritta la parte restante della specifica).

    
risposta data 14.12.2018 - 17:12
fonte

Leggi altre domande sui tag