以下函数接受key
的二进制4字节密钥。 buf
是二进制输入,与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
长度?
答案 0 :(得分:3)
当然,您可以修改该功能以接受不同的密钥长度。例如,像
def many_byte_xor(buf, key):
buf = bytearray(buf)
for i, bufbyte in enumerate(buf):
buf[i] = chr(bufbyte ^ ord(key[i % len(key)]))
return str(buf)
循环键的所有字符(itertools.cycle
的模数版本)。这会产生
>>> many_byte_xor("AABAA", "AB")
'\x00\x03\x03\x03\x00'
>>> many_byte_xor("ABCDABCD", "ABCD")
'\x00\x00\x00\x00\x00\x00\x00\x00'
>>> many_byte_xor("ABCDABCDA", "ABCD")
'\x00\x00\x00\x00\x00\x00\x00\x00\x00'
>>> many_byte_xor("ABCDABCDAB", "ABCD")
'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
>>> many_byte_xor("ABCDABCDAB", "ABC")
'\x00\x00\x00\x05\x03\x01\x02\x06\x02\x03'
哪种IIUC是你想要的。