/*
 * crack.c
 * a dictionary attack 
 * by jeff hamblin@cs.wisc.edu
 *
 * usage: a.out [dictionary file] [enc_pw file]
 *  where dictionary file is something like /usr/dict/words and
 *  enc_pw file is a file consisting crypt entry from /etc/passwd
 *
 * 
 */

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv) 
{
	FILE *pw_file, *dict_file;
	char *dict_filename, *pw_filename;
	char encrypted[80], salt[3], word[80];
	char *guess;
	unsigned long count = 0;

	if (argc != 3) 
	{
		printf("usage: %s [dictionary file] [enc_pw file]\n", argv[0]);
		exit(-1);
	}

	dict_filename = argv[1];
	dict_file = fopen(dict_filename, "r");
	if (dict_file == NULL) {
		printf("run: error opening file %s\n", dict_filename);
		exit(-1);
	}

	pw_filename = argv[2];
	pw_file = fopen(pw_filename, "r");
	if (pw_file == NULL) {
		printf("run: error opening file %s\n", pw_filename);
		exit(-1);
	}

	fgets(encrypted, 80, pw_file);
	strncpy(salt, encrypted, 3);
	salt[2] = '\0';

	while (1)
	{
		fgets(word, 80, dict_file);
		word[strlen(word) - 1] = '\0';

		if (feof(dict_file) == 1)
		{
			printf("* * *\nunable to crack.\n");
			exit(-1);
		}

		guess = (char *)crypt(word, salt);	
		printf("%ul. Trying %s with salt %s -> %s\n", count, word,
			salt, guess);
		count++;
		if (strcmp(guess, encrypted) == 0) {
			printf("* * *\n");
			printf("* * *\n");
			printf("%s decrypts to %s\n", encrypted, word);
			printf("* * *\n");
			printf("* * *\n");
			exit(1);
		}
	}
}
