c - ब्रूट फोर्स पासवर्ड क्रैकिंग एल्गोरिदम




algorithm loops (2)

मैं सी में ब्रूट बल पासवर्ड क्रैकर लिखने की कोशिश कर रहा हूं जो कि लंबाई 1 के सभी संभव अल्फ़ान्यूमेरिकल स्ट्रिंग का परीक्षण करता है, फिर लंबाई 2 के सभी संभव स्ट्रिंग, आदि किसी दिए गए स्ट्रिंग आकार तक। मेरे पास एक काम है लेकिन भारी समाधान है:

void forceCrack(char* hash, int passLength, int maxPassLength) 
{
int i, j, k, l, m, n, o, p, q, r;
char string1[maxPassLength + 1];
char alphanum[63] = 
    "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    "abcdefghijklmnopqrstuvwxyz"
    "0123456789";

for (i = 0; i <= sizeof(string1); i++) {
    string1[i] = '\0';
}
if (passLength < maxPassLength) // 1 Length 
for (i = 0; i < strlen(alphanum); i++) {    // For every alphanumerical value
    string1[0] = alphanum[i];
    checkPass(hash, string1);       // Checks the string
}
passLength++;
printf("Finished passwords of length %d\n", passLength);
if (passLength < maxPassLength) // 2 Length
for (i = 0; i < strlen(alphanum); i++) {
    string1[0] = alphanum[i];
    for (j = 0; j < strlen(alphanum); j++) {
        string1[1] = alphanum[j];
        checkPass(hash, string1);
    }
}
passLength++;
printf("Finished passwords of length %d\n", passLength);
if (passLength < maxPassLength) // 3 Length
for (i = 0; i < strlen(alphanum); i++) {
    string1[0] = alphanum[i];
    for (j = 0; j < strlen(alphanum); j++) {
        string1[1] = alphanum[j];
        for (k = 0; k < strlen(alphanum); k++) {
            string1[2] = alphanum[k];
            checkPass(hash, string1);
        }
    }
}
passLength++;
printf("Finished passwords of length %d\n", passLength);
    ...

दुर्भाग्य से इस पद्धति को प्रत्येक वृद्धि हुई स्ट्रिंग आकार के लिए छोरों का एक सेट जोड़ने की आवश्यकता होती है जो बेहद भारी होती है, साथ ही केवल पूर्व-कोडित लंबाई तक स्ट्रिंग आकार के लिए काम करती है।

मैं एक ऐसे समाधान की तलाश कर रहा हूँ जो लूप या रिकर्सन का उपयोग करता है और किसी भी लम्बाई स्ट्रिंग के लिए काम करेगा। किसी भी तरीके से मैंने सोचा था कि अब तक छोरों के साथ समाप्त होता है, यह अधिकतम 4 लम्बाई स्ट्रिंग के लिए चेक करता है, 1, 01, 001, 0001, 0002, ... इसके बजाय प्रत्येक लंबाई 1 स्ट्रिंग की बजाय, फिर आगे बढ़ता है हर लंबाई 2 स्ट्रिंग क्या कोई मुझे समाधान के साथ मदद कर सकता है?


मान लीजिए आपके पास एक फंक्शन है char * checkPasswordsOfLength(int) जो एक विशिष्ट लंबाई के सभी पासवर्ड की जांच करता है और पासवर्ड लौटाता है अगर यह अन्यथा पाया जाता है या नल।
तो बस:

int i = 0;
char * password = NULL;
while (!password) {
  password = checkPasswordsOfLength(++i);
}

मुझे आशा है कि यह वही है जो आप का मतलब था हालांकि मुझे यकीन नहीं है कि मैं आपको समझता हूं :)


यह एक पहले सभी एकल अंकों में जाता है, फिर सभी दोहरे अंक, फिर ट्रिपल, और इसी तरह।

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

static const char alphabet[] =
        "abcdefghijklmnopqrstuvwxyz"
        "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        "0123456789";

static const int alphabet_size = sizeof(alphabet) - 1;

void brute_impl(char * str, int index, int max_depth)
{
    int i;
    for (i = 0; i < alphabet_size; ++i)
    {
        str[index] = alphabet[i];

        if (index == max_depth - 1)
        {
            printf("%s\n", str); // put check() here instead
        }
        else
        {
            brute_impl(str, index + 1, max_depth);
        }
    }
}

void brute_sequential(int max_len)
{
    char * buf = malloc(max_len + 1);
    int i;

    for (i = 1; i <= max_len; ++i)
    {
        memset(buf, 0, max_len + 1);
        brute_impl(buf, 0, i);
    }

    free(buf);
}

int main(void)
{
    brute_sequential(3);
    return 0;
}






brute-force