diff --git a/2015_day_4/Makefile b/2015_day_4/Makefile index 3b238af..bf0f9d9 100644 --- a/2015_day_4/Makefile +++ b/2015_day_4/Makefile @@ -1,5 +1,7 @@ compile: - gcc day4.c -Werror=switch -o day4 -lcrypto + gcc day4.c -Werror=switch -o day4 -lcrypto -march=native -Ofast -flto run: - ./day4 \ No newline at end of file + ./day4 +run2: + ./day4 2 \ No newline at end of file diff --git a/2015_day_4/day4.c b/2015_day_4/day4.c index 2a092c0..4370a7e 100644 --- a/2015_day_4/day4.c +++ b/2015_day_4/day4.c @@ -1,33 +1,104 @@ #include #include #include +#include +#include -int main(){ +int main(int argc, char* argv[]){ printf("\nWEST"); const char *input_string = "yzbqklnj"; unsigned char output_digest[MD5_DIGEST_LENGTH]; unsigned long long int iteration_number = 0; - + unsigned long long int suffix = 0; + unsigned long long int count; + unsigned char output_digest_hex[MD5_DIGEST_LENGTH * 2 + 1]; + bool initialisation = false; //creating empty md5 context MD5_CTX context; - zeroes = {0,0,0,0,0} - //comparing first 5 digits of output - while (memcmp(charx, zeros, 5) !=0){ - if(!MD5_Init(&context)){ - fprintf(stderr,"Error MD5init failed"); - return 1; - } - //suffix generation - if(iteration_number !=0){ - suffix = iteration_number +1; - } - suffix = - + const char *zeroes = "000000"; + if(argc == 1){ + //comparing first 5 digits of output + while (strncmp(output_digest_hex, zeroes, 5) !=0){ + printf("%s\n",output_digest_hex); + printf("loop %llu\n", iteration_number); + if(initialisation == false && iteration_number == 0){ + MD5((const unsigned char*)input_string,strlen(input_string),output_digest); + iteration_number++; + for(int i = 0; i< MD5_DIGEST_LENGTH; i++){ + sprintf(&output_digest_hex[i * 2], "%02x", output_digest[i]); + } + output_digest_hex[32] = '\0'; + initialisation = true; + }else if(iteration_number >= 1){ + suffix = iteration_number; + count = snprintf(NULL, 0, "%llu", suffix); + char *suffix_string = malloc(count +1); + sprintf(suffix_string,"%llu",suffix); + + char *loop_input_string = calloc(1,8 + count + 1); + strcat(loop_input_string,input_string); + strcat(loop_input_string,suffix_string); + + MD5((const unsigned char*)loop_input_string,strlen(loop_input_string),output_digest); + iteration_number++; + for(int i = 0; i< MD5_DIGEST_LENGTH; i++){ + sprintf(&output_digest_hex[i * 2], "%02x", output_digest[i]); + } + output_digest_hex[32] = '\0'; + printf("\n%s\n",loop_input_string); + free(suffix_string); + free(loop_input_string); + } else { + //ERROR! + return 1; + } + + + }} else { + while (strncmp(output_digest_hex, zeroes, 6) !=0){//Part 2 is to find the suffix which gives 6 leading zeroes on the output + printf("%s\n",output_digest_hex); + printf("loop %llu\n", iteration_number); + if(initialisation == false && iteration_number == 0){ + MD5((const unsigned char*)input_string,strlen(input_string),output_digest); + iteration_number++; + for(int i = 0; i< MD5_DIGEST_LENGTH; i++){ + sprintf(&output_digest_hex[i * 2], "%02x", output_digest[i]); + } + output_digest_hex[32] = '\0'; + initialisation = true; + }else if(iteration_number >= 1){ + suffix = iteration_number; + count = snprintf(NULL, 0, "%llu", suffix); + char *suffix_string = malloc(count +1); + sprintf(suffix_string,"%llu",suffix); + + char *loop_input_string = calloc(1,8 + count + 1); + strcat(loop_input_string,input_string); + strcat(loop_input_string,suffix_string); + + MD5((const unsigned char*)loop_input_string,strlen(loop_input_string),output_digest); + iteration_number++; + for(int i = 0; i< MD5_DIGEST_LENGTH; i++){ + sprintf(&output_digest_hex[i * 2], "%02x", output_digest[i]); + } + output_digest_hex[32] = '\0'; + printf("\n%s\n",loop_input_string); + free(suffix_string); + free(loop_input_string); + } else { + //ERROR! + return 1; + } + + + } + } + printf("%s%llu\n", input_string,iteration_number -1); + printf("%s\n", output_digest_hex); - } } -//input = yzbqklnj \ No newline at end of file +//input = yzbqklnj