Я студент первого курса, изучающий компьютерную инженерию, у нас есть задание создать алгоритм грубой силы, который взломал бы пароль, предоставленный пользователем, я решил пройти лишнюю милю и использовать параллельное программирование, теперь это кодбез параллельного программирования:
EDIT:OLD CODE WAS HERE
Это работает, однако я пытался реализовать OpenMP разными способами, либо я заканчиваю с очень испорченным состоянием гонки, которое я не могу решить, или это просто не будет работать, яЯ только прошу подсказки, я понимаю, что это зависит от меня, чтобы выполнить задачу.
РЕДАКТИРОВАТЬ: Это новый код
#include <omp.h>
#include <iostream>
#include <ctime>
#include <string>
#include <stdio.h>
using namespace std;
void crackPassword(string pass);
long long int attempt;
clock_t start_t, end_t;
string test2[3];
string alphabet;
static int digit[7], alphabetSet = 1;
string test;
int main() {
string password;
std::cout << "Enter the password to crack : ";
cin >> password;
crackPassword(password);
std::cout << "The number of attempts : " << attempt << endl;
return 0;
}
void alphabets(int alphabetSet) {
switch (alphabetSet) {
case 1: alphabet = "-0123456789";
break;
case 2: alphabet = "-abcdefghijklmnopqrstuvwxyz";
break;
case 3: alphabet = "-ABCDEFGHIJKLMNOPQRSTUVWXYZ";
break;
case 4: alphabet = "-0123456789abcdefghijklmnopqrstuvwxyz";
break;
case 5: alphabet = "-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
break;
case 6: alphabet = "-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
break;
case 7: alphabet = "-0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
break;
}
}
void cases7( int alphabetSet, string pass, int passwordLength) {
while (alphabetSet < 8) {
alphabets(alphabetSet);
for (digit[6] = 0; digit[6] < alphabet.length() ; digit[6]++)
for (digit[5] = 0; digit[5] < alphabet.length() ; digit[5]++)
for (digit[4] = 0; digit[4] < alphabet.length() ; digit[4]++)
for (digit[3] = 0; digit[3] < alphabet.length(); digit[3]++)
for (digit[2] = 0; digit[2] < alphabet.length() ; digit[2]++)
for (digit[1] = 0; digit[1] < alphabet.length() ; digit[1]++)
for (digit[0] = 1; digit[0] < alphabet.length(); digit[0]++) {
attempt++;
if (attempt % 2500000 == 0) std::cout << ".";
test = alphabet[digit[0]];
for (int i = 1; i < passwordLength; i++)
if (alphabet[digit[i]] != '-')test += alphabet[digit[i]];
if (pass.compare(test) == 0) {
end_t = clock(); std::cout << endl << endl << endl << ">\n>> CRACKED THE PASSWORD! >>\n>" << endl << endl << "The password : " << pass;
std::cout << "The time duration passed : " << (double)(end_t - start_t) / 1000 << " seconds" << endl << endl;
system("pause");
}
}
alphabetSet++;
}
}
void cases6(int alphabetSet, string pass, int passwordLength) {
while (alphabetSet < 8) {
alphabets(alphabetSet);
for (digit[5] = 0; digit[5] < alphabet.length() ; digit[5]++)
for (digit[4] = 0; digit[4] < alphabet.length(); digit[4]++)
for (digit[3] = 0; digit[3] < alphabet.length() ; digit[3]++)
for (digit[2] = 0; digit[2] < alphabet.length(); digit[2]++)
for (digit[1] = 0; digit[1] < alphabet.length() ; digit[1]++)
for (digit[0] = 1; digit[0] < alphabet.length(); digit[0]++) {
attempt++;
if (attempt % 2500000 == 0) std::cout << ".";
test = alphabet[digit[0]];
for (int i = 1; i < passwordLength; i++)
if (alphabet[digit[i]] != '-')test += alphabet[digit[i]];
if (pass.compare(test) == 0) {
end_t = clock(); std::cout << endl << endl << endl << ">\n>> CRACKED THE PASSWORD! >>\n>" << endl << endl << "The password : " << pass;
std::cout << "The time duration passed : " << (double)(end_t - start_t) / 1000 << " seconds" << endl << endl;
system("pause");
}
}
alphabetSet++;
}
}
void cases5(int alphabetSet, string pass, int passwordLength) {
while (alphabetSet < 8) {
alphabets(alphabetSet);
for (digit[4] = 0; digit[4] < alphabet.length(); digit[4]++)
for (digit[3] = 0; digit[3] < alphabet.length(); digit[3]++)
for (digit[2] = 0; digit[2] < alphabet.length(); digit[2]++)
for (digit[1] = 0; digit[1] < alphabet.length(); digit[1]++)
for (digit[0] = 1; digit[0] < alphabet.length(); digit[0]++) {
attempt++;
if (attempt % 2500000 == 0) std::cout << ".";
test = alphabet[digit[0]];
for (int i = 1; i < passwordLength; i++)
if (alphabet[digit[i]] != '-')test += alphabet[digit[i]];
if (pass.compare(test) == 0) {
end_t = clock(); std::cout << endl << endl << endl << ">\n>> CRACKED THE PASSWORD! >>\n>" << endl << endl << "The password : " << pass;
std::cout << "The time duration passed : " << (double)(end_t - start_t) / 1000 << " seconds" << endl << endl;
system("pause");
}
}
alphabetSet++;
}
}
void cases4(int alphabetSet, string pass, int passwordLength) {
while (alphabetSet < 8) {
alphabets(alphabetSet);
for (digit[3] = 0; digit[3] < alphabet.length(); digit[3]++)
for (digit[2] = 0; digit[2] < alphabet.length(); digit[2]++)
for (digit[1] = 0; digit[1] < alphabet.length(); digit[1]++)
for (digit[0] = 1; digit[0] < alphabet.length(); digit[0]++) {
attempt++;
if (attempt % 2500000 == 0) std::cout << ".";
test = alphabet[digit[0]];
for (int i = 1; i < passwordLength; i++)
if (alphabet[digit[i]] != '-')test += alphabet[digit[i]];
if (pass.compare(test) == 0) {
end_t = clock(); std::cout << endl << endl << endl << ">\n>> CRACKED THE PASSWORD! >>\n>" << endl << endl << "The password : " << pass;
std::cout << "The time duration passed : " << (double)(end_t - start_t) / 1000 << " seconds" << endl << endl;
system("pause");
}
}
alphabetSet++;
}
}
void cases3(int alphabetSet, string pass, int passwordLength) {
while (alphabetSet < 8) {
alphabets(alphabetSet);
for (digit[2] = 0; digit[2] < alphabet.length(); digit[2]++)
for (digit[1] = 0; digit[1] < alphabet.length(); digit[1]++)
for (digit[0] = 1; digit[0] < alphabet.length(); digit[0]++) {
attempt++;
if (attempt % 2500000 == 0) std::cout << ".";
test = alphabet[digit[0]];
for (int i = 1; i < passwordLength; i++)
if (alphabet[digit[i]] != '-')test += alphabet[digit[i]];
if (pass.compare(test) == 0) {
end_t = clock(); std::cout << endl << endl << endl << ">\n>> CRACKED THE PASSWORD! >>\n>" << endl << endl << "The password : " << pass;
std::cout << "The time duration passed : " << (double)(end_t - start_t) / 1000 << " seconds" << endl << endl;
system("pause");
}
}
alphabetSet++;
}
}
void cases2(int alphabetSet, string pass,int passwordLength) {
while (alphabetSet < 6) {
alphabets(alphabetSet);
for (digit[1] = 0; digit[1] < alphabet.length(); digit[1]++)
for (digit[0] = 1; digit[0] < alphabet.length(); digit[0]++) {
attempt++;
if (attempt % 2500000 == 0) std::cout << ".";
test = alphabet[digit[0]];
for (int i = 1; i < passwordLength; i++)
if (alphabet[digit[i]] != '-')test += alphabet[digit[i]];
if (pass.compare(test) == 0) {
end_t = clock(); std::cout << endl << endl << endl << ">\n>> CRACKED THE PASSWORD! >>\n>" << endl << endl << "The password : " << pass;
std::cout << "The time duration passed : " << (double)(end_t - start_t) / 1000 << " seconds" << endl << endl;
system("pause");
}
}
alphabetSet++;
}
}
void cases1(int alphabetSet, string pass, int passwordLength) {
while (alphabetSet < 4) {
alphabets(alphabetSet);
for (digit[1] = 0; digit[1] < alphabet.length(); digit[1]++)
for (digit[0] = 1; digit[0] < alphabet.length(); digit[0]++) {
attempt++;
if (attempt % 2500000 == 0) std::cout << ".";
test = alphabet[digit[0]];
for (int i = 1; i < passwordLength; i++)
if (alphabet[digit[i]] != '-')test += alphabet[digit[i]];
if (pass.compare(test) == 0) {
end_t = clock(); std::cout << endl << endl << endl << ">\n>> CRACKED THE PASSWORD! >>\n>" << endl << endl << "The password : " << pass;
std::cout << "The time duration passed : " << (double)(end_t - start_t) / 1000 << " seconds" << endl << endl;
system("pause");
}
}
alphabetSet++;
}
}
void crackPassword(string pass) {
start_t = clock();
while (1) {
#pragma omp parallel num_threads(7)
#pragma omp parallel
{
#pragma omp single
{
#pragma omp task
cases1(alphabetSet, pass, 1);
#pragma omp task
cases2(alphabetSet, pass, 2);
#pragma omp task
cases3(alphabetSet, pass, 3);
#pragma omp task
cases4(alphabetSet, pass, 4);
#pragma omp task
cases7(alphabetSet, pass, 7);
#pragma omp task
cases5(alphabetSet, pass, 5);
#pragma omp task
cases6(alphabetSet, pass, 6);
}
}
}
}
Я использую сейчас компилятор g ++, так какVisual Cipip не поддерживает OpenMP 3.0, теперь, когда я компилирую и делаю это такочень короткий проход, такой как 1, я вижу то, что кажется бесконечным циклом или просто потоками, делающими что-то, также стоит упомянуть, что я использую windows, а не linux.