1. ホーム
  2. スクリプト・コラム
  3. パイソン

[解決済み】TypeErrorの修正方法。Unicodeオブジェクトは、ハッシュ化する前にエンコードする必要がある?

2022-01-09 15:41:35

質問

コードは次のとおりです。

import hashlib, sys
m = hashlib.md5()
hash = ""
hash_file = input("What is the file name in which the hash resides?  ")
wordlist = input("What is your wordlist?  (Enter the file name)  ")
try:
  hashdocument = open(hash_file, "r")
except IOError:
  print("Invalid file.")
  raw_input()
  sys.exit()
else:
  hash = hashdocument.readline()
  hash = hash.replace("\n", "")

try:
  wordlistfile = open(wordlist, "r")
except IOError:
  print("Invalid file.")
  raw_input()
  sys.exit()
else:
  pass
for line in wordlistfile:
  # Flush the buffer (this caused a massive problem when placed 
  # at the beginning of the script, because the buffer kept getting
  # overwritten, thus comparing incorrect hashes)
  m = hashlib.md5()
  line = line.replace("\n", "")
  m.update(line)
  word_hash = m.hexdigest()
  if word_hash == hash:
    print("Collision! The word corresponding to the given hash is", line)
    input()
    sys.exit()

print("The hash given does not correspond to any supplied word in the wordlist.")
input()
sys.exit()

で実行すると Python 3.2.2です。 エラーが発生しました。

Traceback (most recent call last):
  File "python_md5_cracker.py", line 27, in <module>
  m.update(line)
TypeError: Unicode-objects must be encoded before hashing

解決方法は?

の文字エンコーディングを検索しているのでしょう。 wordlistfile .

wordlistfile = open(wordlist,"r",encoding='utf-8')

あるいは、一行単位で作業する場合。

line.encode('utf-8')


EDIT

下のコメントと この回答 .

上記の私の回答は、希望する出力が str から wordlist ファイルを作成します。での作業に慣れているのであれば bytes を使用したほうがよいでしょう。 open(wordlist, "rb") . しかし、覚えておいてほしいのは、あなたの hashfile が必要です。 NOT 使用 rb の出力と比較するのであれば hexdigest . hashlib.md5(value).hashdigest() を出力します。 str であり、bytesオブジェクトと直接比較することはできない。 'abc' != b'abc' . (この話題はもっとたくさんあるのですが、ATMの時間がないので).

また、この行にも注意が必要です。

line.replace("\n", "")

おそらく

line.strip()

これでbyteでもstrでもうまくいきます。しかし、もし単純に bytes という行に変更すればよい。

line.replace(b"\n", b"")