Crypto CTF 2021 | lower

#cryptoctf2021

#!/usr/bin/env python3

from Crypto.Util.number import *
import sys
from flag import flag

flag = flag.lstrip('CCTF{').rstrip('}')

def query(n, X, E, p):
    assert n == len(X) > len(E)
    C = [getRandomRange(0, p) for _ in range(n)]
    e = E[getRandomRange(0, len(E))]
    S = e
    for _ in range(n):
        S += X[_] * C[_]
        S %= p
    return C, S

def die(*args):
    pr(*args)
    quit()

def pr(*args):
    s = " ".join(map(str, args))
    sys.stdout.write(s + "\n")
    sys.stdout.flush()

def sc():
    return sys.stdin.readline().strip()

def main():
    border = "+"
    pr(border*72)
    pr(border, " hi all, welcome to the learning by mistakes class of cryptography! ", border)
    pr(border, " try hard to find the flag by querying this oracle times and times!!", border)
    pr(border*72)

    p = 127
    E = [getRandomRange(0, p) for _ in range(5)]
    n = len(flag)
    X = [ord(c) for c in flag]

    while True:
        pr("| Options: \n|\t[Q]uery to oracle \n|\t[E]xit")
        ans = sc().lower()
        if ans == 'q':
            for i in range(12):
                pr(f'| Q_{i+1}: {query(n, X, E, p)}')
        elif ans == 'e':
            die("Exiting ...")
        else:
            die("Bye ...")

if __name__ == '__main__':
    main()

60000クエリ送ったオラクルもDownloadできる