如果您已经可以访问密码的哈希版本,那么
MD5从一开始就是有问题的。话虽如此,当涉及到破解哈希值时,您可能最好使用
彩虹表,
字典攻击和
社交工程而不是您的暴力方法。既然您要求一个生成所有值的算法,也许以下内容会有所裨益(C#):
using System;
using System.Text;
namespace PossibiltyIterator
', ';', ':', '\'', '"',
',', '.', '<', '>', '?', '`', '~'
};
const int MaxLength = 8;
static void BuildWord(int currentLength, int desiredLength, char[] word)
else
}
}
static void Main(String[] args)
values", totalValues);
Console.WriteLine("Press any key to continue...");
Console.ReadKey(true /* intercept */);
for (int desiredLength = 1; desiredLength <= MaxLength; ++desiredLength)
}
}
}
说实话,这可以进一步优化。因为它首先构建所有长度为1的“单词”,然后在构建长度为2的“单词”时再次执行该操作。更明智的做法是先构建长度为MaxLength的“单词”,然后截去一个字母以构建长度为MaxLength-1的“单词”。
以下是优化版本...请注意,它不会按照最初请求的顺序返回单词。
using System;
using System.Text;
namespace PossibiltyIterator
', ';', ':', '\'', '"',
',', '.', '<', '>', '?', '`', '~'
};
const int MaxLength = 8;
static void BuildWord(int currentLength, int desiredLength, char[] word)
word[currentLength] = '\0';
}
Console.WriteLine(word);
}
static void Main(String[] args)
values", totalValues);
Console.WriteLine("Press any key to continue...");
Console.ReadKey(true /* intercept */);
BuildWord(0 /* currentLength */, MaxLength, new char[MaxLength]);
}
}
}