2014-11-01 90 views
1

,我現在有將列出所有可能的組合蠻力黑客概念在Python 3

from itertools import product 

password = "hr" 

chars = 'abcdefghijklmnopqrstuvwxyz' #characters to look for, can have letters added 

for length in range(1, 3): #only do lengths of 1 + 2 - namely from aa - zz not onto aaa 
    to_attempt = product(chars, repeat=length) 
    for attempt in to_attempt: 
     print(''.join(attempt)) 

我需要做的就是把每嘗試嘗試,它與變量「密碼」比較的代碼,如果它匹配突圍for循環其他進行,任何想法?

回答

1

有一兩件事你可以做些什麼來解決,這將是移動你的整個有效範圍內的代碼塊長成一個函數:

def brute_force(chars, password): 
    for length in range(1, 3): #only do lengths of 1 + 2 - namely from aa - zz not onto aaa 
     to_attempt = product(chars, repeat=length) 
     for attempt in to_attempt: 
      if ''.join(attempt) == password: 
       print("Found the password!") 
       return 

您遇到的問題是,你只能打出來的單迴路。沒有內置的解決方案來說「打破這個循環,它的父母,沒有別的。」我發現如果你無法使用break或繼續將控制流向所需的方向移動,只需將其分解爲一個函數並使用return即可。

這實際上並不是一個問題,但是現在使用的字符將只能強制使用全字母,全小寫的字符串,所以它會經過每一個字符串單次嘗試並且如果密碼是「Hr」則失敗。

+0

你的第5行不正確,它應該讀取'if''.join(attempt)== password:'按照原始代碼。 – phantom 2014-11-01 20:44:10

+0

@phantom你能稍微解釋一下嗎?對於任何字符串,==''.join(a)。你爲什麼要這樣做,而不是嘗試==密碼? – furkle 2014-11-01 20:46:17

+0

因爲變量'attempt'不是兩個字符的密碼,所以它是單個字符。 – phantom 2014-11-01 20:52:27