/ encoding / 13377_e3dd25795e7a6053f2df0aa399b3cf34.py
13377_e3dd25795e7a6053f2df0aa399b3cf34.py
 1  #!/usr/bin/env python3
 2  
 3  from Crypto.Util.number import bytes_to_long, long_to_bytes
 4  from utils import listener
 5  import base64
 6  import codecs
 7  import random
 8  
 9  FLAG = "crypto{????????????????????}"
10  ENCODINGS = [
11      "base64",
12      "hex",
13      "rot13",
14      "bigint",
15      "utf-8",
16  ]
17  with open('/usr/share/dict/words') as f:
18      WORDS = [line.strip().replace("'", "") for line in f.readlines()]
19  
20  
21  class Challenge():
22      def __init__(self):
23          self.challenge_words = ""
24          self.stage = 0
25  
26      def create_level(self):
27          self.stage += 1
28          self.challenge_words = "_".join(random.choices(WORDS, k=3))
29          encoding = random.choice(ENCODINGS)
30  
31          if encoding == "base64":
32              encoded = base64.b64encode(self.challenge_words.encode()).decode() # wow so encode
33          elif encoding == "hex":
34              encoded = self.challenge_words.encode().hex()
35          elif encoding == "rot13":
36              encoded = codecs.encode(self.challenge_words, 'rot_13')
37          elif encoding == "bigint":
38              encoded = hex(bytes_to_long(self.challenge_words.encode()))
39          elif encoding == "utf-8":
40              encoded = [ord(b) for b in self.challenge_words]
41  
42          return {"type": encoding, "encoded": encoded}
43  
44      #
45      # This challenge function is called on your input, which must be JSON
46      # encoded
47      #
48      def challenge(self, your_input):
49          if self.stage == 0:
50              return self.create_level()
51          elif self.stage == 100:
52              self.exit = True
53              return {"flag": FLAG}
54  
55          if self.challenge_words == your_input["decoded"]:
56              return self.create_level()
57  
58          return {"error": "Decoding fail"}
59  
60  
61  listener.start_server(port=13377)
62