static void rc4_bench(void) { uint8_t *enckey; uint8_t match[32] = {0xDE, 0xAD, 0xBE, 0xAD, 0xDE, 0xAD, 0xBE, 0xAD, 0xDE, 0xAD, 0xBE, 0xAD, 0xDE, 0xAD, 0xBE, 0xAD, 0xDE, 0xAD, 0xBE, 0xAD, 0xDE, 0xAD, 0xBE, 0xAD, 0xDE, 0xAD, 0xBE, 0xAD, 0xDE, 0xAD, 0xBE, 0xAD}; uint8_t cipher[32] = {0xBE, 0xAD, 0xDE, 0xAD, 0xBE, 0xAD, 0xDE, 0xAD, 0xBE, 0xAD, 0xDE, 0xAD, 0xBE, 0xAD, 0xDE, 0xAD, 0xBE, 0xAD, 0xDE, 0xAD, 0xBE, 0xAD, 0xDE, 0xAD, 0xBE, 0xAD, 0xDE, 0xAD, 0xBE, 0xAD, 0xDE, 0xAD}; unsigned int nrprocessed = 0; clock_t startTime, endTime; enckey = calloc(16, sizeof(uint8_t)); alarm(BENCHINTERVAL); startTime = clock(); while(!finished) { rc4Match40b(enckey, cipher, match); enckey[0]++; nrprocessed++; } endTime = clock(); print_and_clean("RC4 (40, static):", nrprocessed, &startTime, &endTime); setrc4DecryptMethod(40); nrprocessed = 0; alarm(BENCHINTERVAL); startTime = clock(); while(!finished) { rc4Decrypt(enckey, cipher, 3, match); enckey[0]++; nrprocessed++; } endTime = clock(); print_and_clean("RC4 (40, no check):", nrprocessed, &startTime, &endTime); setrc4DecryptMethod(128); nrprocessed = 0; alarm(BENCHINTERVAL); startTime = clock(); while(!finished) { rc4Decrypt(enckey, cipher, 3, match); enckey[0]++; nrprocessed++; } endTime = clock(); print_and_clean("RC4 (128, no check):", nrprocessed, &startTime, &endTime); free(enckey); }
/** initPDFCrack is doing all the initialisations before you are able to call runCrack(). Make sure that you run cleanPDFCrack before you call this after the first time. */ bool initPDFCrack(struct custom_salt *cs) { uint8_t buf[128]; unsigned int upwlen; EncData *e = &cs->e; const uint8_t * upw = cs->userpassword; bool user = cs->e.work_with_user; cs->ekwlen = initEncKeyWorkSpace(e->revision, e->encryptMetaData, e->permissions, e->o_string, e->fileID, e->fileIDLen, cs); cs->workWithUser = user; setrc4DecryptMethod((unsigned int) e->length); if (upw) { upwlen = strlen((const char *) upw); if (upwlen > 32) upwlen = 32; memcpy(cs->password_user, upw, upwlen); memcpy(cs->password_user + upwlen, pad, 32 - upwlen); memcpy(cs->encKeyWorkSpace, cs->password_user, 32); cs->knownPassword = true; } if (cs->e.revision == 2) { if (cs->knownPassword) { if (!isUserPasswordRev2(cs)) return false; memcpy(cs->encKeyWorkSpace, pad, 32); } else { memcpy(cs->password_user, pad, 32); cs->knownPassword = isUserPasswordRev2(cs); } } else if (e->revision >= 3) { memcpy(buf, pad, 32); memcpy(buf + 32, e->fileID, e->fileIDLen); md5(buf, 32 + e->fileIDLen, cs->rev3TestKey); if (cs->knownPassword) { if (!isUserPasswordRev3(cs, cs->encKeyWorkSpace)) return false; memcpy(cs->encKeyWorkSpace, pad, 32); } else { memcpy(cs->password_user, pad, 32); cs->knownPassword = isUserPasswordRev3(cs, cs->encKeyWorkSpace); } } return true; }
void loadPDFCrack(struct custom_salt *cs) { setrc4DecryptMethod((unsigned int) cs->e.length); }