2012-10-04 105 views
1

我正在寫一個Python類的簡單字典攻擊。我們提供了一個包含用戶名和散列密碼以及字典文件的影子文件。我們需要在每個詞典單詞前面添加1-255的鹽,然後獲取每個詞的MD5哈希以與影子文件進行比較。我非常接近,但我的問題是我相信的編碼。我的教師說,在散列之前,salt +密碼在C中存儲爲一個unsigned char數組。我如何在Python中轉換爲這個?我已經嘗試過幾種編碼,包括ISO-8859-1,但似乎沒有任何工作。如有必要,我可以提供我的代碼。如何將python字符串更改爲unsigned char數組?

這裏是我的代碼:

import hashlib 

print("Generating Hashes...") 
hash_table = {} 

def crack(Hash=None): 
    if Hash in hash_table: 
     print "MATCH\n",hash_table[Hash] 
    else: 
     print "NO MATCH" 


with open('dictionary','r') as inp_file: 
    for word in inp_file.readlines(): 
     word = word.strip() 
     for salt in range(0,256): 
      salt = str(salt) 
      final = salt+word 
      #print final 
      final = final.encode('iso-8859-1') 
      hash_table[hashlib.md5(final).hexdigest()] = salt+word 
#print hash_table 

with open('shadow3','r') as inp_file2: 
    for line in inp_file2.readlines(): 
     line = line.strip() 
     line1 = line.split(":")[1:] 
     print line1[0] 
     crack(line1[0]) 

這裏是提供shadow文件

tleela:72fd3dbc120ea01dd9e7c68d6f257181 
hfarnsworth:204b319de6f41bbfdbcb28da724dda23 
jzoidberg:a08a9e38a28e64583700b20a8251c2ba 
brodrgue:eac6bf62c93cbe3f9f934b5143d945e4 
pfry:e262e88b10ea1bcdbb385e74216d3a7a 
awong:fe58b4b4cecd58d47b08b1916fae00ac 
hconrad:4cdbade3215a250eb5607a1127b8f755 

,這裏是我目前得到的結果。只有一個密碼發現:

Desktop/pyhton1# python hash1.py 
Generating Hashes... 
72fd3dbc120ea01dd9e7c68d6f257181 
NO MATCH 
204b319de6f41bbfdbcb28da724dda23 
NO MATCH 
a08a9e38a28e64583700b20a8251c2ba 
NO MATCH 
eac6bf62c93cbe3f9f934b5143d945e4 
NO MATCH 
e262e88b10ea1bcdbb385e74216d3a7a 
MATCH 
6expression 
fe58b4b4cecd58d47b08b1916fae00ac 
NO MATCH 
4cdbade3215a250eb5607a1127b8f755 
NO MATCH 
+0

難道只有密碼的人可以bruteforced這樣? –

回答

2
>>> bytearray("foobar") 
bytearray(b'foobar') 

>>> for c in bytearray("foobar"): 
...  print c 
... 
102 
111 
111 
98 
97 
114 

我不知道,這確實解決您的哈希問題,但由於MD5庫工作正常字符串。也許你可以展示你的代碼,以及爲什麼你認爲它是錯誤的。

+0

如果沒有編碼參數,這裏不起作用。根據2.7和3.3的[docu](http://docs.python.org/library/functions.html?highlight=bytearray#bytearray):*如果它是一個字符串,則還必須給出編碼(以及可選的,錯誤)參數; * – halex

+0

爲什麼不只是'map(ord,「foobar」)'? –

+0

@halex,文檔很混亂。他們正在採取「字符串」來表示一個unicode對象。在2.x中傳遞'str'與在3.x中傳遞'bytes'相同,所以不需要編碼。 –

0

從你的描述中,我猜你的主要問題是如何將鹽值添加到字典字符串。假設你使用python2,這是可以做到如下:char(salt_byte) + dictionary_string.

0

下蟒蛇工作3.6

a = "foofsfds" 
listresp = list(map(list, a)) 
print (listresp) 
for charersp in listresp: 
    for charfinnal in charersp: 
     print(charfinnal) 


[['f'], ['o'], ['o'], ['f'], ['s'], ['f'], ['d'], ['s']] 
f 
o 
o 
f 
s 
f 
d 
s 
+0

這是如何解決OP的問題? –

相關問題