master
1#!/usr/bin/python
2import os
3import struct
4import SocketServer
5import zlib
6from Crypto.Cipher import AES
7from Crypto.Util import Counter
8
9# Not the real keys!
10ENCRYPT_KEY = '0000000000000000000000000000000000000000000000000000000000000000'.decode('hex')
11# Determine this key.
12# Character set: lowercase letters and underscore
13PROBLEM_KEY = 'key_1djkfdjfk239fdsk'
14
15def encrypt(data, ctr):
16 print encrypting
17 aes = AES.new(ENCRYPT_KEY, AES.MODE_CTR, counter=ctr)
18 return aes.encrypt(zlib.compress(data))
19
20class ProblemHandler(SocketServer.StreamRequestHandler):
21 def handle(self):
22 nonce = os.urandom(8)
23 self.wfile.write(nonce)
24 ctr = Counter.new(64, prefix=nonce)
25 while True:
26 data = self.rfile.read(4)
27 if not data:
28 print "NOT DATA"
29 break
30
31 try:
32 length = struct.unpack('I', data)[0]
33 if length > (1<<20):
34 print "lb ", data, length, (1<<20)
35 break
36 data = self.rfile.read(length)
37 print "data2 ", data
38 data += PROBLEM_KEY
39 print "data3 ", data
40 ciphertext = encrypt(data, ctr)
41 print cyphertext
42 self.wfile.write(struct.pack('I', len(ciphertext)))
43 self.wfile.write(ciphertext)
44 sys.exit()
45 except:
46 print "EXCEPTION"
47 break
48
49class ReusableTCPServer(SocketServer.ForkingMixIn, SocketServer.TCPServer):
50 allow_reuse_address = True
51
52if __name__ == '__main__':
53 HOST = '0.0.0.0'
54 PORT = 4433
55 SocketServer.TCPServer.allow_reuse_address = True
56 server = ReusableTCPServer((HOST, PORT), ProblemHandler)
57 print "starting server"
58 server.serve_forever()