diff --git a/crack.c b/crack.c index cd81cacbe8b5991f368d8b48eea7fb8d976dbac3..fe2dfb3055d3428d18163d758d0e6c8c410e2338 100644 --- a/crack.c +++ b/crack.c @@ -6,58 +6,153 @@ #include "sha256.h" // constants +#define BUFFERSIZE 256 + #define PWD4_FILENAME "pwd4sha256" #define PWD6_FILENAME "pwd6sha256" +#define PWD4_NUMBERS 10 #define PWD_NUMBERS 30 -#define BUFFERSIZE 256 + +#define ASCII_FROM 32 +#define ASCII_TO 126 +#define ASCII_NUM_FROM 48 +#define ASCII_NUM_TO 57 +#define ASCII_UPPERCASE_FROM 65 +#define ASCII_UPPERCASE_TO 90 +#define ASCII_LOWERCASE_FROM 97 +#define ASCII_LOWERCASE_TO 122 // methods reference -void check_guess(BYTE guess[], BYTE pwd[PWD_NUMBERS][SHA256_BLOCK_SIZE]); +void check_guess(BYTE guess[], + BYTE pwd[PWD_NUMBERS][SHA256_BLOCK_SIZE], int checked[]); +void check_n_guess(BYTE guess[], BYTE pwd[][SHA256_BLOCK_SIZE], int n, + int checked[]); +void int_array_init(int array[], int n); int main(int argc, char** argv) { - if (argc == 1) { - // record 30 passwords - FILE* pwdfp; - unsigned char buffer[SHA256_BLOCK_SIZE]; + // store 30 passwords to guess + FILE* fp; + BYTE buffer[SHA256_BLOCK_SIZE]; + // create array to store hashes password + BYTE pwd[PWD_NUMBERS][SHA256_BLOCK_SIZE]; int status; + + fp = fopen(PWD4_FILENAME, "rb"); - pwdfp = fopen(PWD4_FILENAME, "rb"); + int i; + for (i = 0; i < PWD4_NUMBERS; i++) { + // read 32 bytes to buffer + status = fread(buffer, SHA256_BLOCK_SIZE, 1, fp); - // read 32 bytes to buffer - status = fread(buffer, SHA256_BLOCK_SIZE, 1, pwdfp); + if (status < 0) { + fprintf(stderr, "ERROR, reading binary file failed\n"); + exit(0); + } - if (status < 0) { - fprintf(stderr, "ERROR reading binary file\n"); - exit(0); + strcpy((char*)&pwd[i], (char*)&buffer); } + fclose(fp); - printf("%u\n", buffer); + fp = fopen(PWD6_FILENAME, "rb"); - fclose(pwdfp); + for (; i < PWD_NUMBERS; i++) { + // read 32 bytes to buffer + status = fread(buffer, SHA256_BLOCK_SIZE, 1, fp); - } else if (argc == 2) { + if (status < 0) { + fprintf(stderr, "ERROR, reading binary file failed\n"); + exit(0); + } + strcpy((char*)&pwd[i], (char*)&buffer); + } + fclose(fp); + + // create guess and check it + // crazy test + BYTE guess[5] = {"aaaa"}; + // guess[4] = '\0'; + int checked[10]; + int_array_init(checked, 10); + + + check_n_guess(guess, pwd, 10, checked); + + // int first, second, third, fourth; + // for (first = ASCII_FROM; first <= ASCII_TO; first++) { + // guess[0] = first; + // for (second = ASCII_FROM; second <= ASCII_TO; second++) { + // guess[1] = second; + // for (third = ASCII_FROM; third <= ASCII_TO; third++) { + // guess[2] = third; + // for (fourth = ASCII_FROM; fourth <= ASCII_TO; fourth++) { + // guess[3] = fourth; + // check_n_guess(guess, pwd, 10, checked); + // } + // } + // } + // } + } else if (argc == 2) { + // This part for good guess } else if (argc == 3) { - FILE* guessfp; - FILE* pwdfp; - char buffer[BUFFERSIZE]; + FILE* fp; + BYTE buffer[BUFFERSIZE]; + + // read password file and store hashes passwords + fp = fopen(argv[2], "rb"); + int status; + + // get the number of input passwords + int pwdcount = 0, pwdsize = 0; + + fseek(fp, 0, SEEK_END); + pwdsize = ftell(fp); + pwdcount = pwdsize / SHA256_BLOCK_SIZE; + + if (pwdsize % SHA256_BLOCK_SIZE) { + fprintf(stderr, "ERROR, undefined password input file size\n"); + exit(0); + } + + // create array to store hashes passwords + BYTE pwd[pwdcount][SHA256_BLOCK_SIZE]; + + int i; + for (i = 0; i < pwdcount; i++) { + // read 32 bytes to buffer + status = fread(buffer, SHA256_BLOCK_SIZE, 1, fp); - guessfp = fopen(argv[1], "r"); - pwdfp = fopen(argv[2], "rb"); + if (status < 0) { + fprintf(stderr, "ERROR, reading binary file failed\n"); + exit(0); + } + + strcpy((char*)&pwd[i], (char*)&buffer); + } + fclose(fp); + + // read guess from file and check guess + fp = fopen(argv[1], "r"); + + // create flag arrays to avoid repeat check + int checked[pwdcount]; + int_array_init(checked, pwdcount); - while (fgets(buffer, sizeof(buffer), guessfp) != NULL) { - printf("%s", buffer); + while (fgets((char*)&buffer, BUFFERSIZE, fp) != NULL) { + // get rid of \n for buffer + buffer[strlen((char*)&buffer) - 1] = '\0'; + check_n_guess(buffer, pwd, pwdcount, checked); } - fclose(guessfp); - fclose(pwdfp); + fclose(fp); } return 0; } -void check_guess(BYTE guess[], BYTE pwd[PWD_NUMBERS][SHA256_BLOCK_SIZE]) { +void check_guess(BYTE guess[], BYTE pwd[PWD_NUMBERS][SHA256_BLOCK_SIZE], + int checked[]) { SHA256_CTX ctx; BYTE buf[SHA256_BLOCK_SIZE]; size_t guess_len = strlen((char*)&guess); @@ -68,14 +163,16 @@ void check_guess(BYTE guess[], BYTE pwd[PWD_NUMBERS][SHA256_BLOCK_SIZE]) { sha256_final(&ctx, buf); if (guess_len == 4) { - for (i = 0; i < 10; i++) { - if (!memcmp(pwd[i], buf, SHA256_BLOCK_SIZE)) { + for (i = 0; i < PWD4_NUMBERS; i++) { + if (!checked[i] && !memcmp(pwd[i], buf, SHA256_BLOCK_SIZE)) { + checked[i] = 1; printf("%s %d\n", guess, i + 1); } } } else if (guess_len == 6) { - for (i = 10; i < 30; i++) { - if (!memcmp(pwd[i], buf, SHA256_BLOCK_SIZE)) { + for (i = PWD4_NUMBERS; i < PWD_NUMBERS; i++) { + if (!checked[i] && !memcmp(pwd[i], buf, SHA256_BLOCK_SIZE)) { + checked[i] = 1; printf("%s %d\n", guess, i + 1); } } @@ -83,4 +180,29 @@ void check_guess(BYTE guess[], BYTE pwd[PWD_NUMBERS][SHA256_BLOCK_SIZE]) { fprintf(stderr, "ERROR, undefine guess length\n"); exit(0); } +} + +void check_n_guess(BYTE guess[], BYTE pwd[][SHA256_BLOCK_SIZE], int n, + int checked[]) { + SHA256_CTX ctx; + BYTE buf[SHA256_BLOCK_SIZE]; + size_t guess_len = strlen((char*)&guess); + int i; + + sha256_init(&ctx); + sha256_update(&ctx, guess, guess_len); + sha256_final(&ctx, buf); + + + for (i = 0; i < n; i++) { + printf("%d %s %s\n", checked[i], buf, pwd[i]); + if (!checked[i] && !memcmp(pwd[i], buf, SHA256_BLOCK_SIZE)) { + checked[i] = 1; + printf("%s %d\n", guess, i + 1); + } + } +} + +void int_array_init(int array[], int n) { + for (int i = 0; i < n; i++) array[i] = 0; } \ No newline at end of file