#define _XOPEN_SOURCE
//#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <crypt.h>
// brute force crack a DES encrypted password
// algorithm will attempt combinations up to 4 chars long, using only alphabetic chars
// set highest int to convert to string
const unsigned long long ALPHA_52_MAX = 7311616;
// set characters to be used for cracking attempts
char ALPHA_52[52] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
char itoa52(long long int_52_modulo);
int Thingie(char* pdKey, unsigned int udKeySize, unsigned int * pudResultLen);
int main(int argc, char *argv[])
{
if (argc != 2)
{
// reject invalid parameters
printf("Usage: ./crack hash\n"); return 1;
}
char salt[2] = {argv[1][0], argv[1][1]};
// iterate over all combinations of 4 alphabetic characters
for (long long alpha_52_int = 0; alpha_52_int < ALPHA_52_MAX; alpha_52_int++)
{
char pdKey[4] = {0, 0, 0, 0};
unsigned int udResultLen = 0;
if (0 == Thingie(
pdKey,
sizeof(pdKey) / sizeof(pdKey[0]),
&udResultLen))
{
return 1;
}
if (!strcmp(crypt
(pdKey
, salt
), argv
[1])) {
return 0;
}
}
return 0;
}
int Thingie(char* pdKey, unsigned int udKeySize, unsigned int * pudResultLen)
{
int digit_int_array[4] = {0, 0, 0, 0};
int digit_position = udKeySize - 1, digit_count = 1;
long long working_int = ALPHA_52_MAX;
if (0 == pudResultLen || 0 == pdKey || udKeySize > 4)
{
// need valid input!
return 0;
}
// always calculate the right most value
digit_int_array[digit_position] = working_int % 52;
while (working_int/52)
{
// working_int is divisible by 52, another digit is required to display characters
++digit_count;
--digit_position;
working_int /= 52;
// value is assigned to correct position
digit_int_array[digit_position] = working_int % 52;
}
*pudResultLen = digit_count; // set the resulting relevent length of the key
// reset digit position
digit_position = 3;
while (digit_count > 0)
{
--digit_count;
char current_char = itoa52(digit_int_array[digit_position]);
// converted char is assigned to the correct position in the key
pdKey[digit_count] = current_char;
--digit_position;
}
return 1;
}
char itoa52(long long int_52_modulo)
{
return (ALPHA_52[int_52_modulo]);
}
I2RlZmluZSBfWE9QRU5fU09VUkNFCi8vI2luY2x1ZGUgPGNzNTAuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8Y3J5cHQuaD4KCi8vIGJydXRlIGZvcmNlIGNyYWNrIGEgREVTIGVuY3J5cHRlZCBwYXNzd29yZAovLyBhbGdvcml0aG0gd2lsbCBhdHRlbXB0IGNvbWJpbmF0aW9ucyB1cCB0byA0IGNoYXJzIGxvbmcsIHVzaW5nIG9ubHkgYWxwaGFiZXRpYyBjaGFycwoKLy8gc2V0IGhpZ2hlc3QgaW50IHRvIGNvbnZlcnQgdG8gc3RyaW5nCmNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBBTFBIQV81Ml9NQVggPSA3MzExNjE2OwovLyBzZXQgY2hhcmFjdGVycyB0byBiZSB1c2VkIGZvciBjcmFja2luZyBhdHRlbXB0cwpjaGFyIEFMUEhBXzUyWzUyXSA9ICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IjsKCmNoYXIgaXRvYTUyKGxvbmcgbG9uZyBpbnRfNTJfbW9kdWxvKTsKaW50IFRoaW5naWUoY2hhciogcGRLZXksIHVuc2lnbmVkIGludCB1ZEtleVNpemUsIHVuc2lnbmVkIGludCAqIHB1ZFJlc3VsdExlbik7CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQp7CiAgICBpZiAoYXJnYyAhPSAyKQogICAgewogICAgICAgIC8vIHJlamVjdCBpbnZhbGlkIHBhcmFtZXRlcnMKICAgICAgICBwcmludGYoIlVzYWdlOiAuL2NyYWNrIGhhc2hcbiIpOwogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIGNoYXIgc2FsdFsyXSA9IHthcmd2WzFdWzBdLCBhcmd2WzFdWzFdfTsKCiAgICAvLyBpdGVyYXRlIG92ZXIgYWxsIGNvbWJpbmF0aW9ucyBvZiA0IGFscGhhYmV0aWMgY2hhcmFjdGVycwogICAgZm9yIChsb25nIGxvbmcgYWxwaGFfNTJfaW50ID0gMDsgYWxwaGFfNTJfaW50IDwgQUxQSEFfNTJfTUFYOyBhbHBoYV81Ml9pbnQrKykKICAgIHsKICAgICAgICBjaGFyIHBkS2V5WzRdID0gezAsIDAsIDAsIDB9OwogICAgICAgIHVuc2lnbmVkIGludCB1ZFJlc3VsdExlbiA9IDA7IAogICAgICAKICAgICAgICBpZiAoMCA9PSBUaGluZ2llKAogICAgICAgICAgICBwZEtleSwgCiAgICAgICAgICAgIHNpemVvZihwZEtleSkgLyBzaXplb2YocGRLZXlbMF0pLCAKICAgICAgICAgICAgJnVkUmVzdWx0TGVuKSkKICAgICAgICB7CiAgICAgICAgICAgIHByaW50ZigiZXJyb3JcbiIpOwogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CgogICAgICAgIGlmICghc3RyY21wKGNyeXB0KHBkS2V5LCBzYWx0KSwgYXJndlsxXSkpCiAgICAgICAgewogICAgICAgICAgICBwcmludGYoIiVzXG4iLCBwZEtleSk7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0gICAgCiAgICB9CgogICAgcmV0dXJuIDA7Cn0KCmludCBUaGluZ2llKGNoYXIqIHBkS2V5LCB1bnNpZ25lZCBpbnQgdWRLZXlTaXplLCB1bnNpZ25lZCBpbnQgKiBwdWRSZXN1bHRMZW4pCnsgCiAgICBpbnQgZGlnaXRfaW50X2FycmF5WzRdID0gezAsIDAsIDAsIDB9OwogICAgaW50IGRpZ2l0X3Bvc2l0aW9uID0gdWRLZXlTaXplIC0gMSwgZGlnaXRfY291bnQgPSAxOwogICAgbG9uZyBsb25nIHdvcmtpbmdfaW50ID0gQUxQSEFfNTJfTUFYOwogIAogICAgaWYgKDAgPT0gcHVkUmVzdWx0TGVuIHx8IDAgPT0gcGRLZXkgfHwgdWRLZXlTaXplID4gNCkKICAgIHsKICAgICAgICAvLyBuZWVkIHZhbGlkIGlucHV0IQogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIC8vIGFsd2F5cyBjYWxjdWxhdGUgdGhlIHJpZ2h0IG1vc3QgdmFsdWUKICAgIGRpZ2l0X2ludF9hcnJheVtkaWdpdF9wb3NpdGlvbl0gPSB3b3JraW5nX2ludCAlIDUyOwogICAgd2hpbGUgKHdvcmtpbmdfaW50LzUyKQogICAgewogICAgICAgIC8vIHdvcmtpbmdfaW50IGlzIGRpdmlzaWJsZSBieSA1MiwgYW5vdGhlciBkaWdpdCBpcyByZXF1aXJlZCB0byBkaXNwbGF5IGNoYXJhY3RlcnMKICAgICAgICArK2RpZ2l0X2NvdW50OwogICAgICAgIC0tZGlnaXRfcG9zaXRpb247CiAgICAgICAgd29ya2luZ19pbnQgLz0gNTI7CiAgICAgICAgLy8gdmFsdWUgaXMgYXNzaWduZWQgdG8gY29ycmVjdCBwb3NpdGlvbgogICAgICAgIGRpZ2l0X2ludF9hcnJheVtkaWdpdF9wb3NpdGlvbl0gPSB3b3JraW5nX2ludCAlIDUyOwogICAgfQogICAgKnB1ZFJlc3VsdExlbiA9IGRpZ2l0X2NvdW50OyAvLyBzZXQgdGhlIHJlc3VsdGluZyByZWxldmVudCBsZW5ndGggb2YgdGhlIGtleQogICAgLy8gcmVzZXQgZGlnaXQgcG9zaXRpb24KICAgIGRpZ2l0X3Bvc2l0aW9uID0gMzsKICAgIHdoaWxlIChkaWdpdF9jb3VudCA+IDApCiAgICB7CiAgICAgICAgLS1kaWdpdF9jb3VudDsKICAgICAgICBjaGFyIGN1cnJlbnRfY2hhciA9IGl0b2E1MihkaWdpdF9pbnRfYXJyYXlbZGlnaXRfcG9zaXRpb25dKTsKICAgICAgICAvLyBjb252ZXJ0ZWQgY2hhciBpcyBhc3NpZ25lZCB0byB0aGUgY29ycmVjdCBwb3NpdGlvbiBpbiB0aGUga2V5CiAgICAgICAgcGRLZXlbZGlnaXRfY291bnRdID0gY3VycmVudF9jaGFyOwogICAgICAgIC0tZGlnaXRfcG9zaXRpb247CiAgICB9IAogICAgCiAgICByZXR1cm4gMTsKfQoKY2hhciBpdG9hNTIobG9uZyBsb25nIGludF81Ml9tb2R1bG8pCnsKICAgIHJldHVybiAoQUxQSEFfNTJbaW50XzUyX21vZHVsb10pOwp9