对于一个类项目,我决定使用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;
}
答案 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需要任何额外的内存来存储已经生成的值。
由于这是一种蛮力,你唯一希望优化的是组织代码 - 让它在多个线程上运行,利用你的架构和管道等等。