import base64 import hmac import os import pathlib import gmpy2 from flask import Flask, make_response, g, request def generate_challenge(): p = random_prime() q = random_prime() r = random_prime() N_c1 = p * q N_c2 = q * r return N_c1, N_c2 def verify_response(a: int, b: int, N_c1: int, N_c2: int): e = 65537 if not (a > 1 and b > 1) or (a == N_c1 and b == N_c2): raise ValueError('Too easy response, try harder.') # pow(x, y, n) calculates x^y (mod n) if pow(a, e, N_c1) != pow(b, e, N_c2): raise ValueError('Invalid challenge response.') return True def random_prime(): """Return a random 512 bit prime. No malicous mistake here.""" return int(gmpy2.next_prime(int.from_bytes(os.urandom(64), 'big'))) # # Everything below is not relevant for solving the challenge. # Just various utility functions which contain no malicous mistakes. # app = Flask(__name__) CHALLENGE_TEMPLATE = """
Nc1 = {N_c1}
Nc2 = {N_c2}