问题描述
请接受一个尝试学习的没有经验(并且非常热情)的程序员提出的这个问题:
我需要计算从 0x00 到 0xff 的每个字节组合的 md5 哈希值。我试图用 Python 做到这一点,但我不确定 Python 如何解释我的输入。如前所述,我需要散列字节值,而不是字符“fa”或“00”,而是值本身。
这是我测试过的一个代码示例。问题是 bytes.fromhex 的输出显示了一些表示为 ascii 的十六进制数字。我想然后 ascii 表示是散列的,而不是字节值。第二个问题是我不确定如何正确使用 hashlib 以便对字节值进行哈希处理。
导入哈希库
# Global variables
HEX_VALUES = {0:"0",1:"1",2:"2",3:"3",4:"4",5:"5",6:"6",7:"7",8:"8",9:"9",10:"a",11:"b",12:"c",13:"d",14:"e",15:"f"}
# Helper function for converting decimal number to another base.
def dec_to_base(num,base):
exp = 0
list1 = []
while (num // base ** exp) > 0:
num2 = (num // base ** exp) % base
list1.insert(0,num2)
exp += 1
return list1
# Function for converting decimal to hex numbers.
def dec_to_hex(num):
ret_val = []
for x in dec_to_base(num,16):
x = HEX_VALUES[x]
ret_val.append(x)
ret_val_str = ''.join(ret_val)
ret_val_str_pad = ret_val_str.zfill(4)
# Returns the hex number as a string with four zero-padding.
return ret_val_str_pad
for i in range(1,65536):
hex_number = bytes.fromhex(dec_to_hex(i))
print(hex_number)
h = hashlib.md5(hex_number)
md5_hash = h.hexdigest()
print(md5_hash)
# Checks after TARGET STRING
解决方法
md5 接受字节但不接受字符串。
md5(b'00').hexdigest() # 'b4b147bc522828731f1a016bfa72c073'
md5('00').hexdigest() # TypeError: Unicode-objects must be encoded before hashing
字符串在传递给 md5 之前必须编码成字节。
md5('00'.encode()).hexdigest() # 'b4b147bc522828731f1a016bfa72c073'
'00'.encode() == b'00' # True
b'\x30\x30' == b'00' # True
在上述情况下,在 C 语言中,您将字节数组 {0x30,0x30}
作为参数传递。在您的代码中,hex_number = bytes.fromhex(dec_to_hex(i))
返回大小为 2 个字节。根据您的目标,您可能无法得到想要的。
hex_number = bytes.fromhex(dec_to_hex(1)) # b'\x00\x01'
md5(b'\x00\x01').hexdigest() # '441077cc9e57554dd476bdfb8b8b8102'
md5(b'\x01').hexdigest() # '55a54008ad1ba589aa210d2629c1df41'