CrackMe® Practices for Newbies
PROJECT 5: zipfile.exe

More to add
Tuesday, 09-Feb-99 19:04:22
    195.102.197.11 writes:

    Hi, Just a few more notes for everyone.

    Decryption
    ----------

    PKZIP encrypts the compressed data stream. Encrypted files must be decrypted before they can be extracted.

    Each encrypted file has an extra 12 bytes stored at the start of the data area defining the encryption header for that file. The encryption header is originally set to random values, and then itself encrypted, using three, 32-bit keys. The key values are initialized using the supplied encryption password. After each byte is encrypted, the keys are then updated using pseudo-random number generation techniques in combination with the same CRC-32 algorithm.

    The following is the basic steps required to decrypt a file:

    1) Initialize the three 32-bit keys with the password.
    2) Read and decrypt the 12-byte encryption header, further initializing the encryption keys.
    3) Read and decrypt the compressed data stream using the encryption keys.


    Step 1 - Initializing the encryption keys
    -----------------------------------------

    Key(0) <- 305419896
    Key(1) <- 591751049
    Key(2) <- 878082192

    loop for i <- 0 to length(password)-1
    update_keys(password(i))
    end loop


    Where update_keys() is defined as:


    update_keys(char):
    Key(0) <- crc32(key(0),char)
    Key(1) <- Key(1) + (Key(0) & 000000ffH)
    Key(1) <- Key(1) * 134775813 + 1
    Key(2) <- crc32(key(2),key(1) >> 24)
    end update_keys


    Where crc32(old_crc,char) is a routine that given a CRC value and a character, returns an updated CRC value after applying the CRC-32
    algorithm.


    Step 2 - Decrypting the encryption header
    -----------------------------------------

    The purpose of this step is to further initialize the encryption keys, based on random data, to render a plaintext attack on the data (almost) ineffective.


    Read the 12-byte encryption header into Buffer, in locations Buffer(0) thru Buffer(11).

    loop for i <- 0 to 11
    C <- buffer(i) ^ decrypt_byte()
    update_keys(C)
    buffer(i) <- C
    end loop


    Where decrypt_byte() is defined as:


    unsigned char decrypt_byte()
    local unsigned short temp
    temp <- Key(2) | 2
    decrypt_byte <- (temp * (temp ^ 1)) >> 8
    end decrypt_byte


    After the header is decrypted, the last 1 or 2 bytes in Buffer should be the high-order ord/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.


    Step 3 - Decrypting the compressed data stream
    ----------------------------------------------

    The compressed data stream can be decrypted as follows:


    loop until done
    read a charcter into C
    Temp <- C ^ decrypt_byte()
    update_keys(temp)
    output Temp
    end loop


    Hope this helps explain why it`s not possible to gain the original password.

    By the way,.... this is ALL the code you need to build your brute force
    proggy.

    L8R Mushy!


    mushy


Message thread:

The Mushy thread (mushy) (09-Feb-99 16:31:15)

Back to main board