#include #include #include #include #include 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; 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