2010-05-23 89 views
6

這個問題可能相對簡單,但我給了兩個文本文件。一個文本文件包含通過python中的crypt.crypt加密的所有加密密碼。另一個列表包含超過400k +的正常字典單詞。什麼是寫密碼破解算法的有效方法(python)

該賦值是給定3個不同的函數,它們將字符串從正常情況轉換爲所有不同的大小寫排列,將字母轉換爲數字(如果看起來相似,例如G→6,B→8),並反轉一個字符串。問題是,給定密碼文件中的10-20個加密密碼,在python中運行速度最快的解決方案在單詞文件中的字典單詞上運行這些函數的最有效方法是什麼?這是所有這些字,當以任何方式轉換時,將加密到密碼文件中的密碼。

這裏是用來檢查是否一個給定的字符串,當加密的,是相同的傳入的加密口令的函數:

def check_pass(plaintext,encrypted): 
crypted_pass = crypt.crypt(plaintext,encrypted) 
if crypted_pass == encrypted: 
    return True 
else: 
    return False 

預先感謝。

+3

'return crypted_pa​​ss == encrypted' – SilentGhost 2010-05-23 20:56:01

+5

'返回加密== crypt.crypt(明文,加密)' – 2010-05-23 20:58:03

回答

3

不知道底層散列算法的細節和算法的可能弱點,所有你可以做的就是運行一個強力攻擊,試圖在你的密碼列表中的單詞的所有可能的轉換。

加速這種暴力攻擊的唯一方法是獲得更強大的硬件,並分裂任務並同時運行裂解器。

+0

作爲一個輕微的空間優化,可能會成功地嘗試單詞未改變,然後再開始改變它們。人們傾向於使用真實的語言,並且使用包括數字等排列組合的可能性要小得多。當然,如果這是作業,YMMV。 ;) – 2010-05-23 21:06:55

+0

是啊@JosephMastey,但是這看起來像作業,在這種情況下,你的假設不會成立 – inspectorG4dget 2010-05-23 21:33:40

+0

@ inspectorG4dget當然可以,但假設這位教授提出了一個合理現實的數據集,只是爲了讓我對我感覺更好擁有CS學位。 – 2010-05-23 22:15:16

2

在我的筆記本電腦速度慢,crypt.crypt大約需要20微秒:

$ python -mtimeit -s'import crypt' 'crypt.crypt("foobar", "zappa")' 
10000 loops, best of 3: 21.8 usec per loop 

左右,強力方法(真的是唯一明智的)是「有點兒」是可行的。通過應用你的轉換函數,你將得到(估計估計)每個詞典單詞約100個轉化詞(主要來自大寫字母變化),所以,大約4000萬個轉化詞從你的整個詞典中轉化而來。在每個20微秒的時間內,這將花費大約800秒,稱爲15分鐘,努力嘗試破解其中一個密碼實際上並不符合任何變體;預計時間約一半,破解密碼確實對應。

所以,如果你有10個密碼破解,而且它們都符合轉換後的字典單詞,你應該在一兩個小時內完成。這可以嗎?因爲沒有其他可以做的事情了,除非在你能掌握的儘可能多的節點和核心上分配這個不尋常的並行問題(哦,並且首先使用一臺更快的機器 - 這可能會給你買到一兩倍或左右)。

沒有可以添加的深層次優化技巧,所以一般邏輯將是三重嵌套循環:一個級別循環遍歷加密密碼,一個遍歷字典中的單詞,一個遍歷變體每個字典的單詞。關於如何嵌套的東西沒有太大的區別(爲了簡單起見,除了變體上的循環必須出現在單詞的循環內)。我建議封裝「給我這個詞的所有變種」作爲一個生成器(爲了簡單起見,不是爲了速度),否則將函數調用次數最小化(例如,沒有理由使用該函數,因爲內聯代碼同樣清晰,並且將在顯微鏡下更快)。

相關問題