讓我們來看看。有10^n個可能的n位十進制數字。因此,有26^8個可能的8字符密碼只使用字母a-z。這可以達到208,827,064,576。
您可以用一個簡單的64位計數器跟蹤數字,然後將該數字轉換爲基數爲26的表示。喜歡的東西:
long max = 208827064576;
longlong counter = 0;
while (counter < max)
{
char password[9];
GetPassword(counter, password);
// do whatever you want with the password
++counter;
}
void GetPassword(longlong count, char* pass)
{
int i;
int rem;
if (count == 0)
{
pass[0] = 'a';
pass[1] = '\0';
return;
}
i = 0;
do
{
int rem = count % 26;
pass[i] = 'a' + rem;
++i;
count /= 26;
} while (count > 0)
}
您可以輕鬆地通過使用counter
變量的互鎖增量使這個提供給多個線程。或者您可以拆分搜索空間,以便一個線程從0開始,一個線程從26^7開始(這將是baaaaaaa)等。
2000億是一個相當大的數字。 10億秒可以接近32年。即使你可以每秒檢查幾千個這樣的數據(不太可能),但是你需要一段時間才能進行詳盡的搜索。
我們如何驗證這是一個學校作業? – enginefree
如果你真的只是通過「zzzz ... z」進行「aaaa ... a」,那麼你可以把它看作是一個基數爲26的數字,並在循環中「遞增」它。如果允許字符串小於最大長度,則以「a」開頭(考慮頂部位置爲空),並允許在'z + 1'溢出時翻轉到空位置。 – lurker
@enginefree:如果它不是一個學校作業,[John the Ripper](http://www.openwall.com/john/)中已經存在一個更高級的實現。 – duskwuff