Files
Advent_of_code_2015/2015_day_4/day4.c
2025-12-15 23:09:56 +00:00

105 lines
4.0 KiB
C

#include <openssl/md5.h>
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <stdlib.h>
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