Advertisement
Guest User

missingno.py

a guest
Apr 2nd, 2017
669
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.53 KB | None | 0 0
  1. #!/usr/bin/env python3
  2.  
  3. """
  4. This was fun :)
  5.  
  6. (c) 2017 - kenoph
  7. github.com/kenoph
  8.  
  9. LICENSE: MIT
  10. """
  11.  
  12. import functools
  13. import operator
  14.  
  15.  
  16. def s2b(xx):
  17.     return [int("".join(x), 16) for x in zip(xx[::2], xx[1::2])]
  18.  
  19. flatten = lambda l: [item for sublist in l for item in sublist]
  20.  
  21. lookup = [0x67, 0x61, 0x64, 0x60, 0x69, 0x6B, 0x66, 0x65, 0x62, 0x6A, 0x63, 0x68, 0x6C, 0xF8, 0xFC, 0xFD]
  22.  
  23. ALPHABET = {
  24.     0x60: 'A',
  25.     0x61: 'B',
  26.     0x62: 'C',
  27.     0x63: 'D',
  28.     0x64: 'E',
  29.     0x65: 'F',
  30.     0x66: 'G',
  31.     0x67: 'H',
  32.     0x68: 'I',
  33.     0x69: 'V',
  34.     0x6A: 'S',
  35.     0x6B: 'L',
  36.     0x6C: 'M',
  37.     0xF6: '0',
  38.     0xF7: '1',
  39.     0xF8: '2',
  40.     0xF9: '3',
  41.     0xFA: '4',
  42.     0xFB: '5',
  43.     0xFC: '6',
  44.     0xFD: '7',
  45.     0xFE: '8',
  46.     0xFF: '9',
  47. }
  48.  
  49. KEY = s2b("""B46BCBDEB874E151593D66DDF3DA9D3F080AE6BB682179F1F2C369F5449FAA7762D12E008252BD5786763484643110FDADA9EA019A53E87B9B0D562250B161F794CE16D59091C7D8F93AC5368B7303AF3738A17A72C8B0024363D71D248525A846E4E033ACC0A76DF4950F4ED641B6991B2D788C97E9284FE36C1E9EB511CC877CA2478DEB708EA381FE4C5A8F5E4A5BEC1520D013FC92587E4B4905098830895FAB752680D2178A60AECFBE96555407ED0C9CCDBAA5322A2935128327EEC97F98E5B919C63E0E420BB71AA46A2CE2D3F8CA18F0DFDC231C3B48BCFBB265EF6EFADBF614716FD45D5C4D93FFD93945402FE76704C4B3A67DC22BC1BF1F063CA0
  50. """)
  51.  
  52.  
  53. def encode_helper(n):
  54.     bc = 0x41A7
  55.     hl = 0x72D4
  56.    
  57.     for i in range(n):
  58.         hl = (hl + bc) & 0xFFFF
  59.        
  60.     return hl & 0xFF
  61.  
  62.  
  63. def encode(flags, rnd, mins, secs):
  64.     """
  65.    Returns the password for the challenge.
  66.    
  67.    :param flags: the achievements bitfield
  68.    :param rnd: a random value
  69.    :param mins: number of minutes the game has been running
  70.    :param secs: number of seconds the game has been running
  71.    :returns: the password required to record the score
  72.    """
  73.    
  74.     rnd &= 0xFE
  75.     # flags &= 0x7F  # Commented out for the lulz
  76.     out = [flags, rnd, mins, secs, 0, 0]
  77.     key = [0x55, 0xAA, 0xF0, 0x0F]
  78.     for i, k in enumerate(key):
  79.         out[i] = KEY[out[i] ^ k]
  80.    
  81.     check_sum = (sum(out) + 0xC7) & 0xFF
  82.     check_xor = (functools.reduce(operator.xor, out) ^ 0x8A) & 0xFF
  83.    
  84.     out[4] = encode_helper(check_sum)
  85.     out[5] = encode_helper(check_xor)
  86.    
  87.     for i in range(4):
  88.         out[i] ^= out[5]
  89.    
  90.     out_s = []
  91.     for b in out:
  92.         out_s.append(lookup[b & 0x0F])
  93.         out_s.append(lookup[b >> 4])
  94.    
  95.     return "".join(map(ALPHABET.get, out_s))
  96.    
  97.  
  98. # Actual maximum flag value is 0b01111111
  99. print("PASS:", encode(0b11111111, 69, 0, 0))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement