Python - 以十六进制计数

Ric*_*chy 5 python hex count

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

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

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())
Run Code Online (Sandbox Code Playgroud)

'attack'将传递给查询方法,该方法会将攻击字符串附加到网址.现在我坚持的部分是我必须发送最多256个HTTP请求来猜测明文的一个字节.如何使用for循环从00到ff"计数",将结果附加到g,使得它可以与pad和选择的密文块进行xor'd?到目前为止,我一直在走这条道路,但我仍然坚持如何使用十六进制字符串来完成这项工作.

for i in range(0, 20):
    #g = bytes([i])
    print(bytes([i]),end=' ')
    #print(g, end=' ')
Run Code Online (Sandbox Code Playgroud)

jon*_*rpe 5

我猜你的意思是这样的:

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


00
01
02
...
fd
fe
ff
Run Code Online (Sandbox Code Playgroud)


Era*_*ran 5

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

for i in xrange(256):
    print hex(i)[2:].zfill(2)
Run Code Online (Sandbox Code Playgroud)

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

for i in xrange(256):
    print hex(i)[2:].zfill(2).upper()
Run Code Online (Sandbox Code Playgroud)

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

hex_str = "".join([hex(i)[2:].zfill(2).upper() for i in xrange(256)])
Run Code Online (Sandbox Code Playgroud)