我有这样的错误:
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("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()
该程序是上述MD5破解程序的免费和增强版本,它读取包含散列密码列表的文件,并从英语字典单词列表中检查散列单词。希望对大家有所帮助。
我从下面的链接下载了英语词典
https://github.com/dwyl/english-words
# md5cracker.py
# English Dictionary https://github.com/dwyl/english-words
import hashlib, sys
hash_file = 'exercise\hashed.txt'
wordlist = 'data_sets\english_dictionary\words.txt'
try:
hashdocument = open(hash_file,'r')
except IOError:
print('Invalid file.')
sys.exit()
else:
count = 0
for hash in hashdocument:
hash = hash.rstrip('\n')
print(hash)
i = 0
with open(wordlist,'r') as wordlistfile:
for word in wordlistfile:
m = hashlib.md5()
word = word.rstrip('\n')
m.update(word.encode('utf-8'))
word_hash = m.hexdigest()
if word_hash==hash:
print('The word, hash combination is ' + word + ',' + hash)
count += 1
break
i += 1
print('Itiration is ' + str(i))
if count == 0:
print('The hash given does not correspond to any supplied word in the wordlist.')
else:
print('Total passwords identified is: ' + str(count))
sys.exit()
它可能正在从wordlistfile中寻找字符编码。
wordlistfile = open(wordlist,"r",encoding='utf-8')
或者,如果你在逐行工作:
line.encode('utf-8')
EDIT
根据下面的评论和这个答案。
我上面的回答假设所需的输出是来自wordlist文件的str。如果您习惯使用字节,那么您最好使用open(wordlist,“rb”)。但是重要的是要记住,如果你将hashfile与hexdigest的输出进行比较,那么你的hashfile不应该使用rb。Hashlib.md5 (value).hashdigest()输出一个不能与bytes对象直接比较的STR: 'abc' != b'abc'。(关于这个话题还有很多,但我没有时间)。
还应该注意到这句话:
line.replace("\n", "")
应该是
line.strip()
这对bytes和str都适用。但是如果你决定简单地转换为字节,那么你可以将行更改为:
line.replace(b"\n", b"")
请先看一下答案。
现在,错误信息很清楚:您只能使用字节,而不能使用Python字符串(在Python < 3中使用unicode),因此您必须使用您喜欢的编码编码字符串:utf-32, utf-16, utf-8,甚至是受限制的8位编码之一(有些人可能称之为编码页)。
当你从文件中读取时,wordlist文件中的字节会被Python 3自动解码为Unicode。我建议你:
m.update(line.encode(wordlistfile.encoding))
因此,推送到md5算法的编码数据的编码与底层文件完全相同。