【问题标题】:Optimization for password cracker code;密码破解代码优化;
【发布时间】:2016-06-12 12:37:30
【问题描述】:

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

... 只是一个加载栏。

#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;
}

【问题讨论】:

  • 您了解微积分、Big-Oh 表示法、基准测试或任何其他类型的优化吗?此外,如果您随机化密码,是否会花费更少的时间,然后有条不紊地破解它(即随机猜测意味着您可能会重复随机次数的猜测随机次数)?我的意思是......当你随机猜测时,熵(如果你知道那是什么)太大了。

标签: c++ arrays optimization passwords


【解决方案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;
}

附言在windows平台上,打印文本到控制台很慢。

【讨论】:

    【解决方案2】:

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

    由于这是蛮力,优化任何东西的唯一希望就是并行化代码 - 让它在多个线程上运行,利用架构的管道等等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-15
      相关资源
      最近更新 更多