如何在Python中对字符串进行二进制编码?

15

我正在尝试构建一个MD5破解器进行练习。在进一步之前,这是我的代码:

def offline_wordlist_attack(list_path):
      with fileinput.input(files=(list_path)) as wordlist:
          for word in wordlist:
              md5_hash_object = hashlib.md5() # constructing an md5 hash object
              md5_hash_object.update(binascii.a2b_uu(word))
              word_digest = md5_hash_object.digest() # performing the md5 digestion of the word   
              print(word_digest) # Debug

我的问题出在md5_hash_object.update(binascii.a2b_uu(word))上。Python 3 的hashlib文档指定传递给update()的字符串应为二进制表示。文档使用m.update(b"Nobody inspects")作为示例。在我的代码中,我不能只是在变量word前面添加b。所以我尝试使用binascii库,但该库的文档也有一个注释:

 

注意

   

编码和解码函数不接受Unicode字符串。只能处理字节串和字节数组。

有人能帮我解决这个问题吗?这让我很困扰。


注意:在某些情况下,fileinput.input() 可能会过慢。您可以使用 md5(word).digest() 而无需显式地调用 update() - jfs
2个回答

14
你需要传入一个 bytes 对象,而不是一个 str。从 str(在 Python 3 中是一个Unicode字符串)转换为 bytes 的典型方法是使用字符串的 .encode() 方法并指定你希望使用的编码方式。
my_bytes = my_string.encode('utf-8')

6

只需调用fileinput.input(...,mode='rb')以二进制模式打开文件。与以文本模式打开的文件不同,这种文件产生的是二进制字符串而不是Unicode字符串。

它允许您跳过从磁盘读取的字节的不必要(隐式)解码,接着立即使用.encode()对其进行编码为字节,然后将其传递给md5()


这将是另一种解决方案。然而,在更一般的情况下,它的缺点是不能确保您正在使用哪种编码(因为它取决于输入文件的编码)。 - Amber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接