· 9 years ago · Sep 01, 2016, 06:52 PM
1def str_to_hex_tuple(key, max_length=5):
2 try:
3 key = int(key)
4 except ValueError:
5 print('[E:] input cannot be parsed to number - "%s"' % key)
6 raise
7
8 bin_key = bin(key)[2:].zfill(pow(2, max_length) + 8)
9 out = []
10 for bin_pos in range(0, (max_length)*8, 8):
11 str_byte = bin_key[bin_pos:][:8]
12 byte = int(str_byte, 2)
13 out.append(byte)
14
15 return tuple(out)
16
17def hex_format_int_stream(stream):
18 return ' '.join("{:02x}".format(c) for c in stream)
19
20def rc4_keystream(key, length=484):
21
22 # Stage 1 - Init S
23 x = 0
24 S = list(range(256))
25 for i in range(256):
26 x = (x + S[i] + key[i % len(key)]) % 256
27 S[i], S[x] = S[x], S[i]
28
29 # Stage 2 - generate
30 x = y = 0
31 out = []
32 for i in range(length):
33 x = (x + 1) % 256
34 y = (y + S[x]) % 256
35 S[x], S[y] = S[y], S[x]
36 out.append(S[(S[x] + S[y]) % 256])
37
38 return out
39
40if __name__ == '__main__':
41
42 # Set variables
43 SECRET_KEY = str_to_hex_tuple('00055', max_length=5) # '55' - 40 bit
44 IV = str_to_hex_tuple('00000000', max_length=8) # 64 bit
45
46 print('SECRET_KEY: ', hex_format_int_stream(SECRET_KEY))
47 print('IV: ', hex_format_int_stream(IV))
48
49 bstream = rc4_keystream(SECRET_KEY + IV)
50 # Drop 256 bit / 8 -> 32 bytes
51 bstream = bstream[32:]
52
53 # Display RC4 keystream
54 print(hex_format_int_stream(bstream))