2015-02-10 77 views
5

以十六进制数进行加法并将结果追加到较大的十六进制字符串的结尾处的好方法是什么?我正在尝试格式化一个字符串以用于填充oracle攻击。这些字符串将连接在一起形成一个HTTP请求。Python - 以十六进制数向上

我有一个两个32个字符的十六进制字符串。 'g'是猜测,pad是填充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()) 

“攻击”将被传递到查询方法将追加攻击字符串的网址。现在我坚持的是我必须发送多达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=' ') 
+4

'我在范围内(255):十六进制(i)' – user2097159 2015-02-10 13:29:11

回答

4

对于给定的int值,十六进制的功能会给你0x开头的十六进制字符串,所以十六进制(我)[2:]给你十六进制数字本身,zfill将确保您获得两位数字的个位数号码

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

您也可能要考虑将它全部大写,因为有些解析器依靠六角正在用大写字母书写,S Ø的例子是:

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)]) 
3

我猜你的意思是这样:

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


00 
01 
02 
... 
fd 
fe 
ff