MrDood_Modding

crypto

Sep 13th, 2019
282
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.36 KB | None | 0 0
  1. import socketserver
  2. import random
  3. import signal
  4. import time
  5. import gmpy2
  6. from Crypto.Util.number import inverse, bytes_to_long, long_to_bytes
  7.  
  8. FLAG = open('flag', 'r').read().strip()
  9.  
  10.  
  11. def s2n(s):
  12.     return bytes_to_long(bytearray(s, 'latin-1'))
  13.  
  14.  
  15. def n2s(n):
  16.     return long_to_bytes(n).decode('latin-1')
  17.  
  18.  
  19. def gen_prime():
  20.     base = random.getrandbits(1024)
  21.     off = 0
  22.     while True:
  23.         if gmpy2.is_prime(base + off):
  24.             break
  25.         off += 1
  26.     p = base + off
  27.  
  28.     return p, off
  29.  
  30.  
  31. class RSA(object):
  32.     def __init__(self):
  33.         pass
  34.  
  35.     def generate(self, p, q, e=0x10001):
  36.         self.p = p
  37.         self.q = q
  38.         self.N = p * q
  39.         self.e = e
  40.         phi = (p-1) * (q-1)
  41.         self.d = inverse(e, phi)
  42.  
  43.     def encrypt(self, p):
  44.         return pow(p, self.e, self.N)
  45.  
  46.     def decrypt(self, c):
  47.         return pow(c, self.d, self.N)
  48.  
  49.     # ===== FUNCTIONS FOR PERSONAL TESTS, DON'T USE THEM =====
  50.     def TEST_CRT_encrypt(self, p, fun=0):
  51.         ep = inverse(self.d, self.p-1)
  52.         eq = inverse(self.d, self.q-1)
  53.         qinv = inverse(self.q, self.p)
  54.         c1 = pow(p, ep, self.p)
  55.         c2 = pow(p, eq, self.q) ^ fun
  56.         h = (qinv * (c1 - c2)) % self.p
  57.         c = c2 + h*self.q
  58.         return c
  59.  
  60.     def TEST_CRT_decrypt(self, c, fun=0):
  61.         dp = inverse(self.e, self.p-1)
  62.         dq = inverse(self.e, self.q-1)
  63.         qinv = inverse(self.q, self.p)
  64.         m1 = pow(c, dp, self.p)
  65.         m2 = pow(c, dq, self.q) ^ fun
  66.         h = (qinv * (m1 - m2)) % self.p
  67.         m = m2 + h*self.q
  68.         return m
  69.  
  70.  
  71. def go(req):
  72.     r = RSA()
  73.     p, x = gen_prime()
  74.     q, y = gen_prime()
  75.  
  76.     r.generate(p, q)
  77.     fake_flag = 'fake_flag{%s}' % (('%X' % y).rjust(32, '0'))
  78.  
  79.     def enc_flag():
  80.         req.sendall(b'%X\n' % r.encrypt(s2n(FLAG)))
  81.  
  82.     def enc_fake_flag():
  83.         req.sendall(b'%X\n' % r.encrypt(s2n(fake_flag)))
  84.  
  85.     def enc_fake_flag_TEST():
  86.         req.sendall(b'%X\n' % r.TEST_CRT_encrypt(s2n(fake_flag), x))
  87.  
  88.     def enc_msg():
  89.         req.sendall(b'input the data:')
  90.         p = str(req.recv(4096).strip(), 'utf-8')
  91.         req.sendall(b'%X\n' % r.encrypt(s2n(p)))
  92.  
  93.     menu = {
  94.         '1': enc_flag,
  95.         '2': enc_fake_flag,
  96.         '3': enc_fake_flag_TEST,
  97.         '4': enc_msg,
  98.     }
  99.  
  100.     cnt = 2
  101.     while cnt > 0:
  102.         req.sendall(bytes(
  103.             '====================================\n'
  104.             '            fault box\n'
  105.             '====================================\n'
  106.             '1. print encrypted flag\n'
  107.             '2. print encrypted fake flag\n'
  108.             '3. print encrypted fake flag (TEST)\n'
  109.             '4. encrypt\n'
  110.             '====================================\n', 'utf-8'))
  111.  
  112.         choice = str(req.recv(2).strip(), 'utf-8')
  113.         if choice not in menu:
  114.             exit(1)
  115.  
  116.         menu[choice]()
  117.  
  118.         if choice == '4':
  119.             continue
  120.  
  121.         cnt -= 1
  122.  
  123.  
  124. class incoming(socketserver.BaseRequestHandler):
  125.     def handle(self):
  126.         signal.alarm(300)
  127.         random.seed(time.time())
  128.  
  129.         req = self.request
  130.         while True:
  131.             go(req)
  132.  
  133.  
  134. class ReusableTCPServer(socketserver.ForkingMixIn, socketserver.TCPServer):
  135.     pass
  136.  
  137.  
  138. socketserver.TCPServer.allow_reuse_address = True
  139. server = ReusableTCPServer(("0.0.0.0", 23333), incoming)
  140. server.serve_forever()
Advertisement
Add Comment
Please, Sign In to add comment