上次我很好奇使用蛮力攻击破解我的密码需要多长时间。我想检查一下。
那么,我应该如何实现算法来查找给定范围内的所有可能的键组合(例如 15 个字母)?我找到了排列算法,但它们都为给定的单词交换字母,这不是我要找的。
上次我很好奇使用蛮力攻击破解我的密码需要多长时间。我想检查一下。
那么,我应该如何实现算法来查找给定范围内的所有可能的键组合(例如 15 个字母)?我找到了排列算法,但它们都为给定的单词交换字母,这不是我要找的。
假设密码可以由 89 个可能的字符(az、Az、0-9、空格和 Windows 键盘上的所有不同符号键)的组合组成,则有 82 个 15 个字符的 15 次方不同组合(82 * 82 * 82 ...)。换句话说,很多。
如果您只想使用字母,并且区分大小写,则将有 52 ** 15 种可能的 15 个字母组合。如果您还想考虑使用较短字符串的可能性,您可以编写类似(伪代码)的内容:
long combos = 0
for i = 6 TO 20 -- legal password lengths
combos = combos + POW(52, i)
print "there are " + combos.ToString()
+ " possible passwords between 6 and 20 characters"
要在 C# 中实际枚举和打印排列,您可以执行以下操作:
void AddNextCharAndPrintIfDone(string pwd, int maxLen)
{
for (char c = 'a'; c < 'Z'; c++)
{
pwd = pwd + c;
if (pwd.Length >= maxLen)
System.Console.WriteLine(pwd);
else AddNextCharAndPrintIfDone(pwd, maxLen)
}
}
Main()
{
for (int i=6; i < 20; i++)
AddNextCharAndPrintIfDone("", i);
}
并不是为了效率而编写的,但是如果您有足够的内存和时间,您将获得所有可能的排列。
您可以下载 php pear 项目数学组合来生成这些密码。