Advertisement
Guest User

GuessGame solver by rockosov

a guest
Feb 9th, 2014
560
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.23 KB | None | 0 0
  1. import hashlib
  2. import itertools
  3. import socket
  4. import time
  5. import re
  6. import random
  7. import string
  8.  
  9. def recv_timeout(the_socket,timeout=3):
  10.     the_socket.setblocking(0)
  11.     total_data=[];data='';begin=time.time()
  12.     while 1:
  13.         #if you got some data, then break after wait sec
  14.         if total_data and time.time()-begin>timeout:
  15.             break
  16.         #if you got no data at all, wait a little longer
  17.         elif time.time()-begin>timeout*2:
  18.             break
  19.         try:
  20.             data=the_socket.recv(8192)
  21.             if data:
  22.                 total_data.append(data)
  23.                 begin=time.time()
  24.             else:
  25.                 time.sleep(0.1)
  26.         except:
  27.             pass
  28.     return ''.join(total_data)
  29.  
  30. def create_suffix_generator(bytes_len):
  31.     rounds = range(10000000)
  32.     for round in rounds:
  33.         yield str(round)
  34.  
  35.  
  36. def found_suffix_for_prefix(prefix_in_hex):
  37.     prefix = prefix_in_hex.decode('hex')
  38.     found = False
  39.     suffixes_generator = create_suffix_generator(3)
  40.     for suffix in suffixes_generator:
  41.         # suffix = ''.join(i for i in suffix)
  42.         payload = prefix + suffix
  43.         # print payload.encode('hex')
  44.         hasH = hashlib.sha1(prefix + suffix).hexdigest()
  45.         if hasH.startswith("000000"):
  46.             found = True
  47.             break
  48.  
  49.     if found:
  50.         return suffix.encode('hex')
  51.     else:
  52.         return None
  53.  
  54. def inv(sk, a):
  55.     print "Try to inv %s..." % a
  56.     question_inv_format = "inv %s"
  57.     inv_a = question_inv_format % a
  58.     print "Request:", inv_a
  59.     sk.send(inv_a + "\n")
  60.     response = recv_timeout(sk).strip("\n")
  61.     print "Response:", response
  62.     answer = response.split(' ')[0]
  63.     print "DONE! Answer is %s!" % answer
  64.     return answer
  65.  
  66. def mix(sk, a, b):
  67.     print "Try to mix %s %s..." % (a, b)
  68.     question_mix_format = "mix %s %s"
  69.     mix_a_b = question_mix_format % (a, b)
  70.     print "Request:", mix_a_b
  71.     sk.send(mix_a_b + "\n")
  72.     response = recv_timeout(sk).strip("\n")
  73.     print "Response:", response
  74.     answer = response.split(' ')[0]
  75.     print "DONE! Answer is %s!" % answer
  76.     return answer
  77.  
  78. def build_left_direct_table(sk, g, m):
  79.     print "Try to build left direct table..."
  80.     direct_table = {}
  81.     # g^1 mod p = g
  82.     direct_table.update({g : 1})
  83.     answer = g
  84.     for i in range(2, m + 1):
  85.         print "Round:", i
  86.         answer = mix(sk, g, answer)
  87.         # g^i mod p = answer
  88.         direct_table.update({answer : i})
  89.     last_element = answer
  90.     print "DONE!"
  91.     return direct_table, last_element
  92.  
  93. def build_left_inverse_table(sk, direct_table):
  94.     print "Try to build left inverse table..."
  95.     inverse_table = {}
  96.     count = 1
  97.     for key in direct_table.keys():
  98.         print "Round:", count
  99.         answer = inv(sk, key)
  100.         # g^(-i) mod p = answer
  101.         inverse_table.update({answer : (-1) * direct_table[key]})
  102.         count += 1
  103.     print "DONE!"
  104.     return inverse_table
  105.  
  106. def build_right_direct_table(sk, a, last_element, m):
  107.     print "Try to build right direct table..."
  108.     direct_table = {}
  109.     answer = inv(sk, a)
  110.     for i in range(1, m + 1):
  111.         print "Round:", i
  112.         answer = mix(sk, answer, last_element)
  113.         # a*g^i mod p = answer
  114.         direct_table.update({answer : i})
  115.     print "DONE!"
  116.     return direct_table
  117.  
  118. def build_right_inverse_table(sk, direct_table):
  119.     print "Try to build right inverse table..."
  120.     inverse_table = {}
  121.     count = 1
  122.     for key in direct_table.keys():
  123.         print "Round:", count
  124.         answer = inv(sk, key)
  125.         # g^(-i) mod p = answer
  126.         inverse_table.update({answer : (-1) * direct_table[key]})
  127.         count += 1
  128.     print "DONE!"
  129.     return inverse_table
  130.  
  131. def solve_dlog_problem(left_direct_table, left_inverse_table, right_direct_table, m):
  132.     print "Try to solve dlog problem..."
  133.     answer = 0
  134.     for key in right_direct_table:
  135.         if key in left_direct_table.keys():
  136.             j = right_direct_table[key]
  137.             i = left_direct_table[key]
  138.             print "DONE! Key = %s, i = %s, j = %s, m = %s" % (key, i, j, m)
  139.             answer = j * m - i
  140.             break
  141.         if key in left_inverse_table.keys():
  142.             j = right_direct_table[key]
  143.             i = (-1) * left_inverse_table[key]
  144.             print "DONE! Key = %s, i = %s, j = %s, m = %s!" % (key, i, j, m)
  145.             answer = j * m - i
  146.             break
  147.     if answer == 0:
  148.         print "ERROR! Can't solve dlog problem!"
  149.     return answer
  150.  
  151. LOC_HOST = '109.233.61.11'
  152. LOC_PORT = 3126
  153.  
  154. sk = socket.socket()
  155. sk.connect((LOC_HOST, LOC_PORT))
  156. welcome = recv_timeout(sk)
  157. print welcome
  158.  
  159. prefix_in_hex = re.findall("Prefix is \(hexed\) [\w]*", welcome)[0].split(' ')[3]
  160. suffix = found_suffix_for_prefix(prefix_in_hex)
  161. print suffix
  162. sk.send(prefix_in_hex + suffix + "\n")
  163. response = recv_timeout(sk)
  164. print response
  165. temp = re.findall("How many [\w\' ?]*", response)[0]
  166. g = temp.split(' ')[2].strip('\'')
  167. a = temp.split(' ')[6][:-1].strip('\'')
  168. print "g =", g
  169. print "a =", a
  170. m = 125
  171.  
  172. left_direct_table, last_element = build_left_direct_table(sk, g, m)
  173. left_inverse_table = build_left_inverse_table(sk, left_direct_table)
  174. print "Left Direct table:", left_direct_table
  175. print "Last element:", last_element
  176. last_element = mix(sk, last_element, last_element)
  177. print "Last_element ^ 2:", last_element
  178. print "Left Inverse table:", left_inverse_table
  179.  
  180. right_direct_table = build_right_direct_table(sk, a, last_element, m)
  181. # right_inverse_table = build_right_inverse_table(sk, right_direct_table)
  182. print "Right Direct table:", right_direct_table
  183. # print "Right Inverse table:", right_inverse_table
  184.  
  185. answer = solve_dlog_problem(left_direct_table, left_inverse_table, right_direct_table, m * 2)
  186. print "Answer is", answer
  187.  
  188. sk.send("guess %s\n" % answer);
  189. print recv_timeout(sk)
  190.  
  191. sk.close()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement