48 lines
1.4 KiB
Python
48 lines
1.4 KiB
Python
from cStringIO import StringIO
|
|
|
|
flag = "l0w_n"
|
|
|
|
def modx(base,exp,mod):
|
|
r = 1;
|
|
while (exp > 0):
|
|
if (exp % 2 == 1):
|
|
r = (r * base) % mod
|
|
base = (base * base) % mod
|
|
exp = exp/2
|
|
return r
|
|
|
|
def probprime(s):
|
|
if s%2==0:
|
|
s += 1
|
|
smolprimes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
|
|
while len(set([modx(i,s-1,s) for i in smolprimes])) != 1 or modx(2,s-1,s) != 1:
|
|
s+=2
|
|
return(s)
|
|
|
|
def get_problem(random):
|
|
# add Probable Prime function later
|
|
p = probprime(random.randint(10**20,9*10**20))
|
|
q = probprime(random.randint(10**20,9*10**20))
|
|
e = 65537
|
|
salt = "".join([random.choice("0123456789abcdef") for i in range(4)])
|
|
return (p, q, e, salt)
|
|
|
|
def generate_ciphertext(random):
|
|
p, q, e, salt = get_problem(random)
|
|
encoded = int(("flag{%s_%s}" % (flag, salt)).encode('hex'),16)
|
|
ciphertext = 'n: '+str(p*q)+'\n'
|
|
ciphertext += 'e: '+str(e)+'\n'
|
|
ciphertext += 'c: '+str(pow(encoded, e, p*q))+'\n'
|
|
|
|
return StringIO(ciphertext)
|
|
|
|
def generate(random):
|
|
return dict(files={
|
|
"ciphertext.txt": generate_ciphertext
|
|
})
|
|
|
|
def grade(random, key):
|
|
n, salt = get_problem(random)
|
|
if key.find("%s_%s" % (flag, salt)) >= 0:
|
|
return True, "Correct!"
|
|
return False, "Nope."
|