【发布时间】:2013-08-04 22:00:16
【问题描述】:
上次我很好奇使用暴力破解破解我的密码需要多长时间。我想检查一下。
那么,我应该如何实现算法来查找给定范围内所有可能的组合键(例如 15 个字母)?我找到了排列算法,但它们都为给定的单词交换字母,这不是我要找的。p>
【问题讨论】:
标签: brute-force
上次我很好奇使用暴力破解破解我的密码需要多长时间。我想检查一下。
那么,我应该如何实现算法来查找给定范围内所有可能的组合键(例如 15 个字母)?我找到了排列算法,但它们都为给定的单词交换字母,这不是我要找的。p>
【问题讨论】:
标签: brute-force
假设密码可以由 89 个可能的字符(a-z、A-z、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 项目数学组合来生成这些密码。
【讨论】: