Следующая функция принимает двоичный 4-байтовый ключ для key
. buf
— это двоичный ввод, который подвергается операции xor против 4-байтового ключа.
def four_byte_xor(buf, key):
#key = struct.pack(b">I", key) # removed for binary processing
buf = bytearray(buf)
for offset in range(0, len(buf), 4):
for i, byte in enumerate(key):
buf[offset + i] = chr(buf[offset + i] ^ ord(byte))
return str(buf)
Я удалил key = struct.pack(b">I", key)
из four_byte_xor()
, чтобы указать бинарные данные через str(p.payload.payload.payload)[:4]
для key
. Это отлично работает, если длина заканчивается 4 байтами, в противном случае возникает следующая ошибка (см. Тестирование ниже).
Вот несколько тестов, состоящих из ввода xor'd с ключом, результатом которого является 00, первый из которых был успешным:
'ABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCD'
'ABCD'
bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
'ABCD'
Второй тест не успешен и заканчивается на A или на 1 дополнительный байт:
'ABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDA'
'ABCD'
Traceback (most recent call last):
File "./decode.py", line 36, in <module>
process_packets()
File "./decode.py", line 34, in process_packets
out_buf.write(bin_four_byte_xor(pkt_payload, pkt_offset))
File "./decode.py", line 22, in bin_four_byte_xor
buf[offset + i] = chr(buf[offset + i] ^ ord(byte))
IndexError: bytearray index out of range
Можно ли изменить four_byte_xor()
, чтобы принять buf
разной длины?
linehexdump
были вызваны тем, что эта функция не возвращает шестнадцатеричные значения, а просто печатает их. Я рад видеть, что вы отказались от этого подхода. Использование ваших двоичных данных непосредственно в качестве ключа имеет гораздо больше смысла. Длина массива байтовbuff
точно кратна 4? Если нет, вы получите ошибку вне диапазона, когда доберетесь до дополнительных 1-3 байтов в конце. - person Blckknght   schedule 16.07.2012buf
иkey
между итерациями или это происходит автоматически? - person Astron   schedule 16.07.2012four_byte_xor(b'a', 42)
), чтобы программа стала самодостаточным примером? Если вы не знаете точных аргументов, вы можете использоватьprint(repr(buf))
для их отображения в реальной системе. - person phihag   schedule 16.07.2012print(repr(buf))
. - person Astron   schedule 16.07.2012