以十六进制计算并将结果追加到更大的十六进制字符串末尾的好方法是什么?我正在尝试格式化在填充oracle攻击中使用的字符串。字符串将连接在一起形成HTTP请求。
我有两个32个字符的十六进制字符串。 '克'是猜测,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())
'攻击'将被传递到查询方法,该方法将攻击字符串附加到Web地址。现在我坚持的部分是我必须发送最多256个HTTP请求来猜测明文的一个字节。如何使用for循环来计算"计数"从00到ff,将结果附加到g,使得它可以与填充和选择的密文块相关联?到目前为止,我一直沿着这条路走下去,但我仍然坚持如何使用十六进制字符串来完成这项工作。
for i in range(0, 20):
#g = bytes([i])
print(bytes([i]),end=' ')
#print(g, end=' ')
答案 0 :(得分:5)
对于给定的int值,十六进制函数将为您提供前面带有0x的十六进制字符串,因此hex(i)[2:]为您提供十六进制数字本身,zfill将确保您获得两位数的单位数字< / p>
for i in xrange(256):
print hex(i)[2:].zfill(2)
您可能还想考虑全部大写,因为一些解析器依赖于以大写字母书写的十六进制,所以示例将是:
for i in xrange(256):
print hex(i)[2:].zfill(2).upper()
如果你只需要完整的字符串,你不需要逐个添加它们,你可以一次创建字符串:
hex_str = "".join([hex(i)[2:].zfill(2).upper() for i in xrange(256)])
答案 1 :(得分:4)
我猜你的意思是:
>>> for i in range(256):
print "{:02x}".format(i) # or X for uppercase
00
01
02
...
fd
fe
ff