본문 바로가기
Python/Python FAQ

Python TypeError: Unicode-objects must be encoded before hashing를 어떻게 수정할 수 있나요?, How to correct TypeError: Unicode-objects must be encoded before hashing?

by 베타코드 2023. 11. 16.
반응형

질문


나는 이 오류를 가지고 있습니다:

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

나는 Python 3.2.2에서 이 코드를 실행하려고 할 때:

import hashlib, sys
m = hashlib.md5()
hash = ""
hash_file = input("해시가 있는 파일 이름은 무엇입니까?  ")
wordlist = input("워드리스트는 무엇입니까?  (파일 이름을 입력하세요)  ")
try:
  hashdocument = open(hash_file, "r")
except IOError:
  print("유효하지 않은 파일입니다.")
  raw_input()
  sys.exit()
else:
  hash = hashdocument.readline()
  hash = hash.replace("\n", "")

try:
  wordlistfile = open(wordlist, "r")
except IOError:
  print("유효하지 않은 파일입니다.")
  raw_input()
  sys.exit()
else:
  pass
for line in wordlistfile:
  # 버퍼를 비웁니다 (이것은 스크립트의 시작 부분에 놓여있을 때 매우 큰 문제를 일으켰습니다.
  # 버퍼가 계속 덮어쓰여서 올바르지 않은 해시를 비교하게 되었습니다)
  m = hashlib.md5()
  line = line.replace("\n", "")
  m.update(line)
  word_hash = m.hexdigest()
  if word_hash == hash:
    print("충돌 발생! 주어진 해시에 해당하는 단어는", line, "입니다")
    input()
    sys.exit()

print("주어진 해시는 워드리스트에 해당하는 단어와 일치하지 않습니다.")
input()
sys.exit()

답변


문자 인코딩을 찾고 있습니다. wordlistfile에서.

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

또는, 한 줄씩 작업하는 경우:

line.encode('utf-8')

편집

아래 댓글과 이 답변을 참고하십시오.

위의 답변은 wordlist 파일에서의 출력이 str임을 가정합니다. 만약 bytes로 작업하는 것에 익숙하다면, open(wordlist, "rb")를 사용하는 것이 좋습니다. 그러나 hashfilerb를 사용해서는 안 됩니다. 왜냐하면 hashlib.md5(value).hashdigest()str을 출력하며, 이는 바이트 객체와 직접 비교할 수 없기 때문입니다: 'abc' != b'abc'. (이 주제에는 더 있지만, 현재 시간이 부족합니다).

또한 이 줄:

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

다음과 같이 되어야 합니다:

line.strip()

이는 바이트와 문자열 모두에 대해 작동합니다. 그러나 단순히 bytes로 변환하기로 결정한다면, 줄을 다음과 같이 변경할 수 있습니다:

line.replace(b"\n", b"")
반응형

댓글