41 lines
983 B
Python
41 lines
983 B
Python
from Crypto.Util.number import *
|
||
from sage.all import *
|
||
from secret import FLAG, x, y
|
||
import random
|
||
|
||
# D = {x∈ℕ | 0 ≤ x ≤ 1000}
|
||
# D = {y∈ℕ | 0 ≤ y ≤ 1000}
|
||
|
||
def enc(flag, polynomial_function):
|
||
p = getStrongPrime(512)
|
||
q = getStrongPrime(512)
|
||
N = p * q
|
||
e = 65537
|
||
hint = p**3 - q**8 + polynomial_function(x=x)
|
||
encrypted = pow(bytes_to_long(flag), e, N)
|
||
print(f"{N=}")
|
||
print(f"{e=}")
|
||
print(f"{hint=}")
|
||
print(f"{encrypted=}")
|
||
|
||
|
||
def generate_polynomial_function(seed):
|
||
x = SR.var("x")
|
||
random.seed(seed)
|
||
grade = random.choice([2,3])
|
||
a = random.randint(9999, 999999)
|
||
b = random.randint(8888, 888888)
|
||
c = random.randint(7777, 777777)
|
||
|
||
if grade == 2:
|
||
y_x = a*x**2+b*x+c
|
||
if grade == 3:
|
||
d = random.randint(6666, 666666)
|
||
y_x = a*x**3+b*x**2+c*x+d
|
||
|
||
print(a+b+c)
|
||
return y_x
|
||
|
||
|
||
y_x = generate_polynomial_function(y)
|
||
enc(FLAG.encode(), y_x) |