반응형
질문
나는 이 오류를 가지고 있습니다:
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")
를 사용하는 것이 좋습니다. 그러나 hashfile
은 rb
를 사용해서는 안 됩니다. 왜냐하면 hashlib.md5(value).hashdigest()
는 str
을 출력하며, 이는 바이트 객체와 직접 비교할 수 없기 때문입니다: 'abc' != b'abc'
. (이 주제에는 더 있지만, 현재 시간이 부족합니다).
또한 이 줄:
line.replace("\n", "")
다음과 같이 되어야 합니다:
line.strip()
이는 바이트와 문자열 모두에 대해 작동합니다. 그러나 단순히 bytes
로 변환하기로 결정한다면, 줄을 다음과 같이 변경할 수 있습니다:
line.replace(b"\n", b"")
반응형
댓글