2012-03-19 43 views
3

我用C++編寫了一個多線程程序,用蠻力算法破解7個字符長的密碼(僅限小寫字母)。多線程蠻力破解密碼算法

我的算法大多是7個嵌套for-loops從a到z並測試每種可能的組合。

現在,我將我的工作是這樣的:
如果我有3個工作線程,
線程1:axxxxxx到ixxxxxx
主題2:jxxxxxx到rxxxxxx
主題3:sxxxxxx到zxxxxxx

所以3個線程會繼續循環直到找到匹配。

主線程將等待第一個線程返回。

我的問題是:這是在我的線程之間劃分工作的最好方法嗎?你有什麼想法可以提高我的效率嗎?

另外,即使它不是我詢問的主要部分,你能想到比7 for循環迭代更好的方法嗎?

(請注意,此計劃是一所學校的項目,而不是爲了真正破解密碼)

+0

*你能想到比7 for-loop迭代更好的方法嗎?*遞歸。 – AusCBloke 2012-03-19 03:44:39

+0

一個確保更高效的方法是在GPU中進行。看看[oclHashcat-plus](http://hashcat.net/oclhashcat-plus/)。 – jweyrich 2012-03-19 03:55:51

+0

@jweyrich:如果你想破解一個散列,那麼這是一個很好的解決方案,但是如果你必須實際嘗試登錄,那麼這個方法不是非常有用。 – 2012-03-19 04:07:41

回答

6

如果所有密鑰的可能性相同,並且每個密鑰的評估密鑰成本相同,並且每個線程都可以預期分配給一個CPU而沒有太多中斷(例如,您的進程是唯一的CPU密集的運行),均勻分配鍵空間將會非常有效。

如果其中一些假設是無效的,一個更靈活的方式來構造程序將有一個線程(生產者線程)將關鍵範圍分發到一個或多個消費者線程進行處理。一旦一個給定的線程完成了它的大部分工作,它就會回到生產者並請求一個新的密鑰範圍來分析。

生產者/消費者模式有一些開銷,但它更靈活。

+0

謝謝,雖然假設是有效的,我會繼續與生產者線程。你讓我意識到,這樣做的目的並不是真正減少完成的測試(我一開始就瞄準)的數量,而是儘可能快地完成測試(如果線程的中斷時間較少,它會去在更多的測試上)。 – 2012-03-19 04:19:46

1

我會在英特爾TBB看看

我會用在outerloop一個parallel_for結構,並有原子變量來表示被發現。

這非常適合使用lambda表達式。

tbb::blocked_range<char> rng('a', 'z'); 
tbb::parallel_for(rng, [&](tbb::blocked_range<char> rng){ 
    for(char a=rng.begin(); a!=rng.end(); ++a) 
    { 
     //a is your top level character 
    } 
}); 

利用TBB的優點是,在另一個答覆中提到的是,如果一個線程完成另一TBB有一個工作竊取機制建立它允許快速線程採取工作過慢的線程之前。

0

您應該使用生產者消費者模式。 擁有一個(線程安全)隊列來產生密碼候選和消費者線程 這應該更靈活。

爲了生成密碼,您的方法沒有任何問題,但是可能會使用更長的密碼。

您可以使用遞歸方案來生成它。 或帶有一個循環的迭代方案,ascii表上的a-z字符是連續的,因此您可以使用基本26轉換來生成候選。