I don't want to save all possible strings, just the ones that are matching the hash.
To avoid further misunderstanding, I will copy my current code here, and maybe you could tell me what's wrong because just when I thought it would work, it doesn't really. It runs, it's trying out everything, but something is bugged...
Code:
Program Md5BruteForce;
Uses Md5;
Var
hash,test,tri:string;
Num,Max,j:integer;
Results: array[1..100] of string;
Function NextChar(c:char):char; //This is for changing the characters in the string
Begin
if c='z' then NextChar:='0'
else
if c='9' then NextChar:='a'
else
NextChar:=Succ(c);
End;
Procedure ChangeChar(MaxLength,spot:integer; Var Str:string); //The main procedure
Var
counter:integer;
i:integer;
Begin
counter:=0;
if Str[spot]='9' then
begin
if length(Str)<=MaxLength then
begin
for i:=1 to length(Str) do
begin
if Str[i]='9' then counter:=counter+1; //Count the 9s in the string
end;
if counter=length(Str) then
begin
for i:=1 to length(Str) do Str[i]:='a';
Str:=Str+'a'; //If every character is a 9, then change all of them back to 'a', and add a plus 'a' to the string
end
else
begin
Str[spot]:='a';
ChangeChar(MaxLength, spot-1,Str); //The procedure calls itself, until a non-9 character is found
end;
end;
end
else
Str[spot]:=NextChar(Str[spot]); //If a non-9 character is found then it is simply switched to the next character
End;
Begin
for j:=1 to 100 do Results[j]:='' //Clearing the array, just to make sure...
Writeln('Please Give me the hash');
Readln(hash);
Writeln('Please give me the estimated maximum length of the original text(characters)');
Readln(Max);
test:='a';
Num:=1;
Repeat
tri:=MD5Print(Md5String(test));
if tri=hash then
begin
Results[Num]:=test;
Num:=Num+1; //Storing the matches in an array
end;
Write('Now trying: ',test);
Write(' ');
Writeln('Hash: ',tri); //A bit redundant, but it helped me debug the recursion, and it looks cool so I kept it.
ChangeChar(Max,length(test),test); //Go to the next variation
Until length(test)>Max; //Loop ends if the maximum character length is exceeded
if Num>1 then //Checking if there is more than 0 results
begin
for j:=1 to Num do
begin
Writeln('Result #',j,': ',Results[Num]); //Writing out all the results
end;
end
else
Writeln('Sorry, your hash could not be recovered'); //If the search fails...
Readln;
End.
I was testing with the string 'c7' at maximum length 2 and 3. (hash is: 4d3a21d8c684c09c19b93be911827fd5)
The problem is that eventhough it tries every possible permutation now, for some reason it can't list the results. The output is exactly this(except for the long blocks of tries)
'Result #1:
Result #2:'
And that's it. Empty strings. Arrrrgh it's driving me soooo mad, I'm pretty much done with the hard part, and some stupid error is stopping me.
Bookmarks