1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| key_table = [ 0x14, 0x18, 0x3D, 0x0C, 0x00, 0x03, 0x32, 0x1F, 0x18, 0x3C, 0x3D, 0x19, 0x2C, 0x42, 0x1B, 0x0F, 0x23, 0x15, 0x0B, 0x1F ] key_stream_256 = [key_table[i % len(key_table)] for i in range(256)] S = list(range(256)) j = 0 for i in range(256): j = (S[i] + j + key_stream_256[i]) & 0xFF S[i], S[j] = S[j], S[i] def rc4_prga(state, n): S = state[:] i = 0 j = 0 out = [] for _ in range(n): i = (i + 1) & 0xFF j = (j + S[i]) & 0xFF S[i], S[j] = S[j], S[i] out.append(S[(S[i] + S[j]) & 0xFF]) return out keystream = rc4_prga(S, 42) buf1_ints = [ 0xBE7D51AF, 0x7EEEE1C6, 0x4FD3C578, 0xB89BFBA1, 0x25B28FEF, 0xAAF725CD, 0xED399B71, 0x8C807901, 0xAE63C11C, 0xEFF75BDF ] cipher_bytes = [] for value in buf1_ints: cipher_bytes += [(value >> (8 * k)) & 0xFF for k in range(4)] v15 = 10008 cipher_bytes += [v15 & 0xFF, (v15 >> 8) & 0xFF] assert len(cipher_bytes) == 42 plain_bytes = bytes(((c - 113) & 0xFF) ^ k for c, k in zip(cipher_bytes, keystream)) print("Plain (hex):", plain_bytes.hex()) try: print("Plain (ascii):", plain_bytes.decode('ascii')) except UnicodeDecodeError: print("Plain (ascii, replace):", plain_bytes.decode('ascii', errors='replace'))
|