2012-08-29 75 views
5

我正在嘗試爲實踐構建一個md5餅乾。我去任何進一步這裏之前是我的代碼:如何在Python中對字符串進行二進制編碼?

def offline_wordlist_attack(list_path): 
     with fileinput.input(files=(list_path)) as wordlist: 
      for word in wordlist: 
       md5_hash_object = hashlib.md5() # constructing an md5 hash object 
       md5_hash_object.update(binascii.a2b_uu(word)) 
       word_digest = md5_hash_object.digest() # performing the md5 digestion of the word 
       print(word_digest) # Debug 

我的問題是與md5_hash_object.update(binascii.a2b_uu(word))hashlib Python 3文檔聲明傳遞給update()的字符串應該在二進制表示中。該文檔使用m.update(b"Nobody inspects")作爲示例。在我的代碼中,我不能簡單地在變量word前附加b。於是,我就用binascii庫,但該庫也有文檔說明在一張紙條:

編碼和解碼功能不接受Unicode字符串。只有 bytestring和bytearray對象可以被處理。

有人能幫我解決這個問題嗎?它越來越好了。

+0

注意:在你的情況下''fileinput.input()'可能太慢了。你可以使用'md5(word).digest()',而不用明確的'update()'。 – jfs

回答

8

您需要傳入一個bytes對象,而不是str。從str(Python 3中的unicode字符串)到bytes的典型方法是在字符串上使用.encode()方法,並指定要使用的編碼。

my_bytes = my_string.encode('utf-8') 
4

只需撥打fileinput.input(...,mode='rb')即可在二進制模式下打開文件。在文本模式下打開文件時,這些文件會生成二進制字符串而不是Unicode字符串。

它允許您跳過從磁盤讀取的字節的不必要(隱式)解碼,然後在將它們傳遞到md5()之前使用.encode()立即將它們編碼回字節。

+0

這將是另一種解決方案。然而,在更一般的情況下,它有不利於確保使用什麼編碼的缺點(因爲它取決於輸入文件編碼)。 – Amber

相關問題