2015-02-10 71 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