2013-09-26 385 views
1

我的程序應該是一個暴力破解密碼(學校作業)。 輸入參數如下..檢查每一個「單詞」從aaa..a到zzz..z

./crack threads keysize target 

程序需要檢查長度密鑰長度的密碼,而且還需要檢查較短的。 我不確定如何去寫東西,這將只是改變一個字母的時間,然後繼續這樣做.. (密鑰最大打算8)

例..

密鑰長度= 5,所以一個循環(我認爲)需要修改一些等於「aaaaa」到「aaaab」到「aaaac」的內容,將每個結果與salt(前兩個字符目標 )直到找到匹配。

我正在使用crypt_r,因爲下一步是添加多線程。

不確定是否真的需要解釋這個問題。很高興澄清。

+0

我們如何驗證這是一個學校作業? – enginefree

+1

如果你真的只是通過「zzzz ... z」進行「aaaa ... a」,那麼你可以把它看作是一個基數爲26的數字,並在循環中「遞增」它。如果允許字符串小於最大長度,則以「a」開頭(考慮頂部位置爲空),並允許在'z + 1'溢出時翻轉到空位置。 – lurker

+3

@enginefree:如果它不是一個學校作業,[John the Ripper](http://www.openwall.com/john/)中已經存在一個更高級的實現。 – duskwuff

回答

1

這在所有密碼代碼週期比給出lengh和只包含從az字母不再:

#include <stdio.h> 
int main(void) { 
    char password[9] = {0}; 
    int keysize = 5; 
    for (;;) { 
     // get next password value 
     // we do it by adding 1 in 26-al system 
     int level = 0; // current level, starts at 0 
     while (level < keysize) { 
      if (password[level] == 0) { 
       password[level] = 'a'; 
       break; 
      } 
      if (password[level] >= 'a' && password[level] < 'z') { 
       password[level]++; 
       break; 
      } 
      if (password[level] == 'z') { 
       password[level] = 'a'; 
       level++; 
      } 
     } 
     if (level >= keysize) 
      break; // we have checked all passwords! 
     // check if password matches: 
     //printf("Checking password: '%s'\n", password); 
     if (check_password(password)) { 
      printf("Hooray! Password found: %s\n", password); 
      break; 
     } 
    } 
    return 0; 
} 

如果限制aphabet到abc和密鑰長度= 4時,檢查組以下口令:

ABC AA BA CA AB BB CB交流BC立方厘米AAA BAA CAA ABA BBA CBA ACA BCA CCA AAB BAB駕駛室ABB BBB CBB ACB BCB CCB AAC BAC CAC ABC BBC CBC ACC BCC CCC AAAA BAAA CAAA ABA a bbaa cbaa acaa bcaa ccaa aaba baba caba abba bbba cbba acba bcba ccba aaca baca caca abca bbca cbca acca bcca ccca aaab baab caab abab babab cabab acab bcab ccab aabb babb cabb abbb bbbb cbbb acbb bcbb ccbb aacb bacb cacb abcb bbcb cbcb accb bccb CCCB AAAC BAAC CAAC ABAC BBAC CBAC ACAC bcac CCAC AABC BABC CABC ABBC BBBC牛熊ACBC BCBC CCBC AACC BACC CACC ABCC BBCC CBCC ACCC BCCC CCCC

參見在IdeOne DEMO這個例子。

+0

謝謝。看起來非常好。我會試着看看它是如何工作的。如果你不介意我問。'for(;;)'是做什麼的?在 – m96

+0

之前沒有看到'for(;;)'和'while(true)'是一樣的 - 無限循環 – mvp

+0

在給出的兩件事情中,你的似乎是最好的。我現在只能在實際上讓我的程序確認哪一個密碼是正確的。如果您認爲您可能會提供幫助,我會爲此提出另一個問題。 http://stackoverflow.com/questions/19071145/using-strcmp-and-crypt-to-find-a-password-from-an-already-hashed-password – m96

2

讓我們來看看。有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年。即使你可以每秒檢查幾千個這樣的數據(不太可能),但是你需要一段時間才能進行詳盡的搜索。

+0

謝謝,吉姆。我認爲這個任務的真正目的是學習如何實現多線程。我們應該允許程序使用多達8個線程。有人建議我們或者削減每個線程的可能選擇範圍以搜索或使用「共享當前密碼嘗試」並使用鎖來通過它們。 – m96

+0

你的'do {}'必須是一個有意義的循環,但它不是,因此它不起作用。 – mvp

+0

嘗試實現這個代碼後(我不得不爲'do {}'添加一段時間的條件,我得到了一個seg錯誤,雖然我可能把它放在我的程序中是錯誤的,但我還包括一行來打印出' pass'等於並且遇到一個連續的a,直到出現分段錯誤 – m96

相關問題