Python - 以十六进制向上计数

Python - counting up in hex

以十六进制计数并将结果附加到更大的十六进制字符串末尾的好方法是什么?我正在尝试格式化要在填充 oracle 攻击中使用的字符串。这些字符串将连接在一起形成一个 HTTP 请求。

我有两个 32 个字符的十六进制字符串。 'g'是猜测,pad是padding oracle。基本上我需要做的是让 g 的最后一个字节从 0x00 到 0xff.The 的十六进制计数,我到目前为止的代码是:

split = [value[x:x+32] for x in range (0, len(value), 32)]  #Split the CT into 16 byte chunks
IV = unhexlify(split[0])
c0 = unhexlify(split[1])
c1 = unhexlify(split[2])
c2 = unhexlify(split[3])


g = unhexlify("00000000000000000000000000000000")  
pad = unhexlify("00000000000000000000000000000001")  

pad_xor_guess = xorb(g, pad)
c1_prime = xorb(pad_xor_guess, c1)

attack = str(hexlify(c1_prime + c2).decode())

'attack' 将被传递到将攻击字符串附加到网址的查询方法中。现在我坚持的部分是我基本上必须发送最多 256 个 HTTP 请求来猜测明文的一个字节。我如何使用 for 循环从 00 到 ff 到 "count up",将结果附加到 g,以便它可以与 pad 和所选密文块进行异或运算?到目前为止,我一直在沿着这条路走下去,但我仍然坚持如何使用十六进制字符串来实现它。

for i in range(0, 20):
    #g = bytes([i])
    print(bytes([i]),end=' ')
    #print(g, end=' ')

我猜你的意思是这样的:

>>> for i in range(256):
    print "{:02x}".format(i)  # or X for uppercase


00
01
02
...
fd
fe
ff

对于给定的 int 值,hex 函数将为您提供以 0x 开头的十六进制字符串,因此 hex(i)[2:] 为您提供十六进制数本身,zfill 将确保您获得两位数字数字

for i in range(256):
    print(hex(i)[2:].zfill(2))

您可能还想考虑将其全部大写,因为某些解析器依赖于以大写字母书写的十六进制,因此示例如下:

for i in range(256):
    print(hex(i)[2:].zfill(2).upper())

如果你只需要完整的字符串,你不需要一个一个地附加它们,你可以一次性创建字符串:

hex_str = "".join([hex(i)[2:].zfill(2).upper() for i in range(256)])