I have implemented a program in C to crack passwords by generating all possible combinations of words ([A-Z][a-z]) up to the length of 5. While the program works, I would like to receive comments on the efficiency of the algorithm and other design decisions that would improve the code. The exercise is part of the course CS50 by Harvard.
I timed the program using unix's time and the time the program took to print all the combinations was
**real** 14m39.433s;
**user** 0m10.040s;
**sys** 0m36.356s.
CS50.h
is a library developed for the course as training wheels for students. String
(char*
) and Bool
are types defined in this library.
#define _XOPEN_SOURCE
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <cs50.h>
int main(int argc, char *argv[])
{
if(argc != 2)
{
printf("Usage: ./crack hash\n");
return 1;
}
string alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
char password[6] = "\0\0\0\0\0\0";
string hash = argv[1];
char salt[3];
memcpy(salt, hash, 2);
salt[2] = '\0';
bool flag = false;
int alphabet_len = 52;
for(int i = 0; i < alphabet_len; i++)
{
password[0] = alphabet[i];
password[1] = password[2] = password[3] = password[4] = '\0';
if(!strcmp(hash, crypt(password, salt)))
{
flag = true;
break;
}
for(int j = 0; j < alphabet_len; j++)
{
password[1] = alphabet[j];
password[2] = password[3] = password[4] = '\0';
if(!strcmp(hash, crypt(password, salt)))
{
flag = true;
break;
}
for(int k = 0; k < alphabet_len; k++)
{
password[2] = alphabet[k];
password[3] = password[4] = '\0';
if(!strcmp(hash, crypt(password, salt)))
{
flag = true;
break;
}
for(int l = 0; l < alphabet_len; l++)
{
password[3] = alphabet[l];
password[4] = '\0';
if(!strcmp(hash, crypt(password, salt)))
{
flag = true;
break;
}
for(int m = 0; m < alphabet_len; m++)
{
password[4] = alphabet[m];
if(!strcmp(hash, crypt(password, salt)))
{
flag = true;
break;
}
}
if(flag)
break;
}
if(flag)
break;
}
if(flag)
break;
}
if(flag)
break;
}
if(flag)
printf("Password: %s\n", password);
else
printf("Password not found\n");
}
crypt()
. \$\endgroup\$CS50.h
is a library ...Bool
are types defined in this library." Why mentionBool
is it is not used in code? Or is that a typo and you meantbool
? \$\endgroup\$char password[6] = "\0\0\0\0\0\0";
This is actually 7 characters long due to the"..."
literal automatically being terminated with a NUL character \$\endgroup\$