Для класса мне был предоставлен пароль, который запускался через хэш хд5. Мне говорят, что это максимум 6 символов, в верхнем регистре и только цифры. Я должен написать алгоритм грубой силы, чтобы открыть исходный пароль. Я смог получить свои собственные значения хэша, запустить его через свою программу и декодировать его, но это не удается на том, что дал нам мой учитель. Я получил мой md5 с веб-сайта и проверил его результаты против других, поэтому я знаю, что это не проблема. Есть ли какая-то ошибка в моем коде, например, я не охватываю все возможные комбинации, или, скорее всего, ошибка в хэш-значении, предоставленная мне?Почему мой грубой взлом MD5 не работает?
#include <stdlib.h>
#include <string>
#include <iostream>
#include "md5.h"//File was sourced from http://www.zedwood.com/article/cpp-md5-function
using namespace std;
const int numPossibleChar = 36;
const string givenHash = "ad2ad129385e4b2ba3b477378bc1d9b6";
long count=0;//make sure I go through all combinations
const char * charOptions[numPossibleChar]={"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K",
"L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V",
"W", "X", "Y", "Z", "1", "2", "3", "4", "5", "6", "7",
"8", "9", "0"};
int main()
{
for(int i =0; i<numPossibleChar; i++)
{
string guess1 = charOptions[i];
string guessHash = md5(guess1);
if(md5(guess1)==givenHash)
{
cout <<"match, password is: "<< guess1<<endl;
return 0;
}
cout<<guess1<<endl;
count++;
for (int j=0; j<numPossibleChar; j++)
{
string guess2=guess1+charOptions[j];
if(md5(guess2)==givenHash)
{
cout <<"match, password is: "<< guess2<<endl;
return 0;
}
count++;
for(int k=0; k<numPossibleChar; k++)
{
string guess3=guess2+charOptions[k];
if(md5(guess3)== givenHash)
{
cout <<"match, password is: "<< guess3<<endl;
return 0;
}
count++;
for(int l=0; l<numPossibleChar; l++)
{
string guess4=guess3+charOptions[l];
if(md5(guess4)== givenHash)
{
cout <<"match, password is: "<< guess4<<endl;
return 0;
}
count++;
for(int m=0; m<numPossibleChar; m++)
{
string guess5=guess4+charOptions[m];
if(md5(guess4)==givenHash)
{
cout <<"match, password is: "<< guess5<<endl;
return 0;
}
count++;
for(int n=0; n<numPossibleChar; n++)
{
string guess6=guess5+charOptions[n];
if(md5(guess6)==givenHash)
{
cout <<"match, password is: "<< guess6<<endl;
return 0;
}
count++;
}
}
}
}
}
}
cout << "Count "<<count<<endl;
return 0;
}
И нет, на самом деле у меня нет окончательного значения. Я intially имеет его как int вместо длинного, поэтому после запуска 9 часов он переполнен. Я хотел проверить с вами, ребята, прежде чем снова запустить его и получить новый номер.
Является ли хэш в исходном коде тем, который вам дал? Если нет, то что вам дали? –
Вам нужно сделать так много распределений строк? Вы можете собрать строки-кандидаты в буфере символов в MD5 и сравнить результат как байты без преобразования в шестую строку для сравнения. (Я не знаю, является ли это значительным по времени вычисления MD5, но кажется излишним.) – Rup
Я бы проверил, что основной алгоритм работает первым, прежде чем добавлять часть «md5» (md5 - довольно медленная операция во всей схеме вещей). И используйте короткий пароль, например. 3 буквы и убедитесь, что вы можете найти совпадение. Например, «X9Z». Для каждого добавочного персонажа, который вы добавляете, это займет 36 раз дольше, поэтому пара дополнительных символов будет длиться от нескольких минут до нескольких часов, что затрудняет решение проблемы. –