master
Raw Download raw file
 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()