密码破解程序代码的优化;

时间:2014-03-20 04:40:19

标签: c++ arrays optimization passwords

对于一个类项目,我决定使用asci表中的所有可打印字符(减号除外)创建一个密码生成器,然后程序将尝试破解它。 密码字符存储在一个数组中,破解它的尝试存储在另一个数组中。尝试只是随机字符,然后与整个密码数组进行比较。如果两个数组中的所有字符都匹配,则程序终止...如果不是,则循环继续。我的程序的问题是,匹配数组需要太长时间,因为尝试只是随机数。您能否通过开发一种检查密码的战略方法来帮助我优化代码?甚至psuedocode也有帮助。谢谢。

......只是一个加载栏。

#include<iostream>
#include<cstring>
#include<ctime>
#include<cstdlib>
using namespace std;

int main()
{
int a[1000], length, random, b[1000], c[1000], tries = 0; 
bool cracked = false;

cout << "Enter a password length: ";
cin >> length;

srand(time(NULL));
for (int i =0; i<length; i++){
    do {
        random = (rand()%94)+33;
    }while(random==45);
    a[i] = random;
    cout << char(a[i]);
}cout << endl;

do{
    for(int i =0; i<length; i++){
        do{
            random = (rand()%94)+33;
        }while(random==45);
        b[i] = random;
    }
    for(int k=0; k<length; k++){
        if(b[k]==a[k])
            c[k]=0;
        else
            c[k]=1;
        cracked=false;
        if(c[length-1]==0)
            cracked = true;
        else if(c[length-1]==1){
            k=0;
            cracked = false;
            tries++;
            cout << "... ";
        }
    }
}while(cracked==false);

for(int i=0; i<length; i++)
    cout << char (b[i]);
cout << "\nNumber of tries: " << tries << endl;

return 0;
}

2 个答案:

答案 0 :(得分:1)

您的代码只是随机猜测,并且您不会阻止它进行重复猜测。

您是否尝试过顺序蛮力?它的长度为5分钟,需要半分钟,比你的方法略好。

#include<iostream>
#include<cstring>
#include<ctime>
#include<cstdlib>
using namespace std;

int main()
{
int a[1000];
int length;
int random;
int b[1000] = { 33 };
unsigned long long tries = 0;
bool cracked = false;

cout << "Enter a password length: ";
cin >> length;

srand(time(NULL));
for (int i =0; i<length; i++){
    do {
        random = (rand()%94)+33;
    }while(random==45);
    a[i] = random;
    cout << char(a[i]);
}cout << endl;

do{
    b[0]++;
    for(int i =0; i<length; i++){
        if (b[i] >= 94 + 33){
            b[i] -= 94;
            b[i+1]++;
        }else break;
    }
    cracked=true;
    for(int k=0; k<length; k++)
        if(b[k]!=a[k]){
            cracked=false;
            break;
        }
    if( (tries & 0x7ffffff) == 0 )
        cout << "\r       \r   ";
    else if( (tries & 0x1ffffff) == 0 )
        cout << ".";
    tries++;
}while(cracked==false);

cout << "\r       \n";
for(int i=0; i<length; i++)
    cout << char (b[i]);
cout << "\nNumber of tries: " << tries << endl;

return 0;
}

P.S。在Windows平台上,将文本打印到控制台非常慢。

答案 1 :(得分:0)

除非您知道密码中可用于设计算法的任何模式(即限制搜索空间),否则您将使用蒙特卡罗模拟方法。也就是说,生成所有可能的输出。与您已经在做的不同之处在于,您从不重复值,您有一个系统的方法来解决问题,您将覆盖所有搜索空间(您的版本将在运行一段时间后出现此问题)加上您不要# 39; t需要任何额外的内存来存储已经生成的值。

由于这是一种蛮力,你唯一希望优化的是组织代码 - 让它在多个线程上运行,利用你的架构和管道等等。