Проблема с моим алгоритмом грубой силы на языке C ++

Я столкнулся с вопросом, где я должен создать программу, которая имеет функцию, которая генерирует случайный пароль с использованием таблицы ASCII (генерирование случайных чисел с использованием srand от 0 до 256 с последующим типизацией их в символы.), Еще одна функция для отображения созданного пароль. Затем еще одна функция для взлома сгенерированного пароля методом грубой силы. Функция, которая генерирует пароль, работает нормально, но у меня проблема с функцией, которая взламывает пароль.

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

void Generate_Pass(char pass[5])
{
int seed = time(NULL);
srand(seed);
for(int i = 0; i < 5; i++){
pass[i] = rand()%256;
}
}

void Display_Pass(char pass[5])
{
for(int i = 0; i < 5; i++){
cout << pass[i] << " ";
}
}

void Cracked(char cracked[5], char pass[5])
{
do
{
for(int a = 0; a < 5; a++){
int b = rand()%256;
cracked[a] = char(b);
}
}while(cracked[0] != pass[0]);
do
{
for(int a = 0; a < 5; a++){
int b = rand()%256;
cracked[a] = char(b);
}
}while(cracked[1] != pass[1]);
do
{
for(int a = 0; a < 5; a++){
int b = rand()%256;
cracked[a] = char(b);
}
}while(cracked[2] != pass[2]);
do
{
for(int a = 0; a < 5; a++){
int b = rand()%256;
cracked[a] = char(b);
}
}while(cracked[3] != pass[3]);
do
{
for(int a = 0; a < 5; a++){
int b = rand()%256;
cracked[a] = char(b);
}
}while(cracked[4] != pass[4]);
}

void Display_Cracked(char cracked[5])
{
for(int i = 0; i < 5; i++){
cout <<  cracked[i] << " ";
}
}

int main()
{
char pass[5];
Generate_Pass(pass);
cout << "The Password is: ";
Display_Pass(pass);
cout << "\n";
char cracked[5];
Cracked(cracked, pass);
cout << "The cracked password is: ";
Display_Cracked(cracked);
}

Это код, над которым я работал, но всякий раз, когда я запускаю функцию грубой силы, она не работает так, как это должно быть.

-4

Решение

Прежде всего, в вашем Cracked метод, вы зацикливаетесь на всех пяти индексах, условно только на один индекс. Вы делаете это пять раз. В среднем требуется 256 попыток для сопоставления правильного символа. Это приводит к генерации и присваиванию около 5 * 5 * 256 = 6400 целых чисел, что требует больше работы, чем вам нужно.

Проблема с вашим кодом заключается в том, что вы назначаете все пять индексов в каждом do while петля. Тогда любой правильный символ, который вы нашли в предыдущем цикле, будет перезаписан случайными данными в следующем цикле, так что только последний символ будет правильным. Ниже доработана реализация, которая исправляет эти проблемы.

void Cracked(char cracked[5], char pass[5]) {
for (int a = 0; a < 5; a++) {
do {
int b = rand() % 256;
cracked[a] = char(b);
} while(cracked[a] != pass[a]);
}
}

Так как for Цикл теперь находится снаружи, он будет пробовать случайные вещи, пока не выяснит персонажа, а затем перейдет к следующему персонажу, не касаясь других персонажей.

Вы также заметите, что использование цикла for приводит к гораздо меньшему количеству кода, который был в основном таким же. Как правило, если вы обнаружите, что копируете код, это означает, что вы должны использовать цикл, функцию или другую конструкцию, чтобы избежать лишнего кода или чтобы компилятор сгенерировал его для вас. Это делает ваш код намного проще в обслуживании. Например, если вы хотите заменить rand функция, используемая в каждом do while цикл, вам придется заменить его только один раз, а не пять раз.

Кроме того, в этом случае, вероятно, было бы лучше попробовать все возможные значения отдельно, а не случайные значения (например, с for петля). Я дам вам понять эту часть.

2

Другие решения

Грубая сила Решение это то, что:

Систематически перечисляя всех возможных кандидатов на решение и проверяя, удовлетворяет ли каждый кандидат постановке задачи

Это означает, что вам нужно сгенерировать все возможные комбинации заданной длины. (Вы никогда не можете гарантировать, что сделали это, используя rand.) Как упоминается @Slava Вы не должны использовать магические числа, поэтому мы назовем эту длину:

#define LENGTH 5

Оттуда вы можете просто сделать простой вложенный while-loop:

string Cracked(const char* pass) {
string result('\0', LENGTH);

while(!equal(cbegin(result), cend(result), pass)) {
if(result.back() < numeric_limits<unsigned char>::max()) {
++result.back();
} else {
for(auto it = rbegin(result); it != rend(result); *it++ = '\0') {
if(*it < numeric_limits<unsigned char>::max()) {
++(*it);
break;
}
}
}
}
return result;
}
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector