2014-10-23 2 views
3

암호 파일을 읽으려고합니다. 그런 다음 각 암호의 해시를 계산하고 해시 값과 비교하려고합니다. 이미 암호를 발견했는지 확인해야합니다. 그러나 계속 오류 메시지가 "TypeError : 해시 전에 유니 코드 개체를 인코딩해야합니다"입니다. 여기 내 코드는 다음과 같습니다.Python에서 sha256 해시를 사용하는 방법

from hashlib import sha256 

with open('words','r') as f: 
    for line in f: 

     hashedWord = sha256(line.rstrip()).hexdigest() 

     if hashedWord == 'ca52258a43795ab5c89513f9984b8f3d3d0aa61fb7792ecefe8d90010ee39f2': 
      print(line + "is one of the words!") 

아무도 도와 주실 수 있습니까?

+0

오류 메시지는 어떤 라인을 나타 냅니까? –

+2

이 방법이 유용 할 수 있습니다. http://stackoverflow.com/questions/7585307/typeerror-unicode-objects-must-be-encoded-before-hashing – Bryan

+0

사람들이 더 기꺼이 도움을주기 때문에 들여 쓰기를 수정해야합니다. 코드가있는 사람들은 잘라내어 통역관에 붙여 넣을 수 있습니다. –

답변

4

오류 메시지는 정확히 다음과 같은 의미입니다. 유니 코드 문자열이 있습니다. 유니 코드 문자열을 SHA-256 해시 할 수 없으며 바이트 만 해시 할 수 있습니다.

왜 유니 코드 문자열이 있습니까? 텍스트 모드에서 파일을 여는 것이므로, 파이썬에게 (기본 인코딩을 사용하여) 해당 파일의 바이트를 유니 코드로 디코딩하도록 암묵적으로 요청합니다. 원시 바이트를 가져 오려면 2 진 모드를 사용해야합니다. 에 ...

with open('words','r') as f: 

: 즉

, 그냥이 줄을 변경

with open('words', 'rb') as f: 

당신은 당신이이 문제를 해결하면, print 라인은 예외를 제기 것을 알 수 있습니다. 왜? 을 str에 추가하려고합니다. 또한 공간이 부족하여 벗겨지지 않은 선을 인쇄하고 있습니다. print (print(line.rstrip(), "is one of the words")에서와 같이)에 두 개의 인수를 사용하여이 모든 것을 고칠 수 있습니다.

그러나 Århus is one of the words을 인쇄하려면 b'\xc3\x85rhus' is one of the words과 같은 출력이 나옵니다. 왜냐하면 여러분은 이제 문자열이 아닌 바이트를 가지기 때문입니다. 파이썬은 더 이상 당신을 위해 해독하지 않으므로 수동으로 해줘야합니다. 인코딩을 open으로 지정하지 않을 때 가끔 작동하는 동일한 기본 인코딩을 사용하려면 인수없이 decode으로 전화하십시오. 따라서 :

print(line.rstrip().decode(), "is one of the words") 
관련 문제