2010-09-29 74 views
3

一位朋友給了我一個挑戰:他使用PHP的crypt函數(CRYPT_STD_DES)(來自PHP4)加密了一個字符串。我知道用來加密的鹽,並且因爲crypt是單向算法,所以我必須使用暴力方法,並且我知道密碼只包含小寫字母。PHP的crypt問題

現在,我有機器16核心(2x至強),和大量的RAM。什麼是實現這個攻擊力最有效的方式(我想我將不得不使用PHP,這是不太正常的,但如果您有任何的想法...)

[編輯]

,我忘提及,加密representaction是13chars長度,並且字符串小於8個字母,就像一個簡單的密碼加密:)

+0

在你開始谷歌的字符串之前,它已被解密之前:) – 2010-09-29 00:24:14

+1

這是'巧克力'。但嚴重的是,如果它被鹽醃了,我不認爲它會被用來搜索結果。 – 2010-09-29 00:30:20

回答

2

這是在Ubuntu 10.04上的代碼C(與gcc -O2 -lcrypt編譯)
的快速嘗試。1

#define _XOPEN_SOURCE 
    #include <unistd.h> 
    #include <stdio.h> 
    #include <stdlib.h> 

    void inc(char *p) 
    { 
    int i; 
    for (i=0 ; i<8 && p[i]=='z' ; i++); 
    if (i >= 8) exit(printf("Not found :-(\n")); 
    if (!p[i]) p[i]='a'; 
    else p[i]++; 
    while (--i >= 0) p[i]='a'; 
    } 

    int main() 
    { 
    char *salt = "XY"; 
    char *buzz = "XYaAbBcCZ0123"; 

    char pass[] = { 'a',0,0,0,0,0,0,0,0 }; 

    while(1) 
     if (! strcmp(crypt(pass, salt), buzz)) 
     exit(printf("Found %s :-)\n", pass)); 
     else 
     inc(pass); 
    } 

該代碼應在時下 PC一天或兩天(2.10^11的組合)中運行,您可以在幾臺機器上運行它,一個從「一」到「gzzzzzzz」做,另一從「haaaaaaa」到「nzzzzzzz」等等。

+0

我已經添加了一些快速線程的使用,爲了消耗16個可用的核心,它已經完成了3小時的技巧,thx :) – canni 2010-09-29 09:56:56

+0

那麼,密碼是什麼! – 2010-09-29 14:27:36

+0

密碼是:allegro :)(波蘭語ebay等價物的名稱) – canni 2010-09-29 20:36:15

2

從PHP手冊:

隱窩()將RET使用標準的Unix 基於DES的算法或替代的 算法可以在系統上獲得該算法。

某些操作系統比一種類型的散列支持更多 。事實上,有時基於標準DES的 算法被基於MD5的 算法取代。散列類型由salt參數觸發 。在5.3之前, PHP將在安裝時根據系統的crypt()來確定可用的 算法(基於 )。如果 提供無鹽,PHP將根據MD5

的可用性換句話說自動生成 任一個標準的兩個字符(DES) 鹽,或12字符(MD5), ,所述crypt()函數只是從C庫調用操作系統的crypt()函數。這意味着兩件事。

首先,加密的類型是標準化的。你不需要使用PHP來運行蠻力,你只需要知道使用的算法。像Cane和Abel或Jack the Ripper這樣的許多程序都可以通過強力,字典或彩虹表攻擊破解幾種算法。

其次,加密類型基於加密的操作系統。這意味着你可能需要嘗試幾種不同的加密方法,除非有明確的線索(加密的字符串的模式可能會提示你)。

我絕對不會建議嘗試使用PHP來強制它,因爲解釋語言的運行速度比編譯後的語言慢得多。

1

最有效的(儘管可能是最不挑剔的)方式可能是找到已經實現它的人(例如使用John the Ripper)。