defmul_THcurve(n, P): R = (0, 0) while n > 0: if n % 2 == 1: R = add_THcurve(R, P) P = add_THcurve(P, P) n = n // 2 return R
p = 10297529403524403127640670200603184608844065065952536889 a = 2 G = (8879931045098533901543131944615620692971716807984752065, 4106024239449946134453673742202491320614591684229547464)
FLAG = flag.lstrip(b'DASCTF{').rstrip(b'}') assertlen(FLAG) == 15 m = bytes_to_long(FLAG) assert m < p Q = mul_THcurve(m, G) print("Q =", Q) # Q = (6784278627340957151283066249316785477882888190582875173, 6078603759966354224428976716568980670702790051879661797)
p = 10297529403524403127640670200603184608844065065952536889 a = 2 d = 8817708809404273675545317762394593437543647288341187200 c = 1 F = GF(p) x, y, z = QQ["x,y,z"].gens() eq = a*x ^ 3 + y ^ 3 + c * z ^ 3 - d * x * y * z phi = EllipticCurve_from_cubic(eq) E = phi.codomain().change_ring(GF(p)) P = (8879931045098533901543131944615620692971716807984752065, 4106024239449946134453673742202491320614591684229547464) Q = (6784278627340957151283066249316785477882888190582875173, 6078603759966354224428976716568980670702790051879661797) fx, fy, fz = map(lambda f: f.change_ring(F), phi.defining_polynomials()) phiP = lambda x, y, z=1: E(fx(x, y, z) / fz(x, y, z), fy(x, y, z) / fz(x, y, z)) EP = phiP(*P) EQ = phiP(*Q) print(EP.order(), EQ.order()) x = discrete_log(EQ, EP, operation='+') print(x)
#!/usr/bin/env python # -*- coding: UTF-8 -*- import os import hashlib from sage.allimport * from Crypto.Cipher import AES from Crypto.Util.Padding import pad from secret import c, b, key, FLAG
defadd_curve(P, Q, K): a, d, p = K if P == (0, 0): return Q if Q == (0, 0): return P x1, y1 = P x2, y2 = Q x3 = (x1 * y2 + y1 * x2) * pow(1 - d * x1 ** 2 * x2 ** 2, -1, p) % p y3 = ((y1 * y2 + 2 * a * x1 * x2) * (1 + d * x1 ** 2 * x2 ** 2) + 2 * d * x1 * x2 * (x1 ** 2 + x2 ** 2)) * pow( (1 - d * x1 ** 2 * x2 ** 2) ** 2, -1, p) % p return x3, y3
defmul_curve(n, P, K): R = (0, 0) while n > 0: if n % 2 == 1: R = add_curve(R, P, K) P = add_curve(P, P, K) n = n // 2 return R
defAES_encrypt(k): key = hashlib.sha256(str(k).encode()).digest()[:16] iv = os.urandom(16) cipher = AES.new(key, AES.MODE_CBC, iv) cipher = cipher.encrypt(pad(FLAG, 16)) data = {} data["iv"] = iv.hex() data["cipher"] = cipher.hex() return data
from Crypto.Util.number import * deftwist_to_weier(G): x, y = G r = 2*(3*(y+1) - d*x**2)*inverse(3*x**2, p)%p s = 4*((y+1)-d*x**2)*inverse(x**3, p)%p return (r, s)
d = -46 e = 20 p = 826100030683243954408990060837
A = -4*(3*e+d**2)*inverse(3, p)%p B = -16*d*(d**2-9*e)*inverse(27, p)%p
c = 35 b = 98 p = 770311352827455849356512448287 Fp = GF(p) E = EllipticCurve(Fp, [-c, b]) G = E((584273268656071313022845392380, 105970580903682721429154563816)) P = E((401055814681171318348566474726, 293186309252428491012795616690))
order = E.order() k = 1 while (p**k - 1) % order: k += 1
from Crypto.Util.number import * from gmpy2 import * from secret import flag
defdecode_e(e): if e > 1: mul = 1 for i inrange(1, e): mul *= i if e - mul % e - 1 == 0: mulmod = mul % e - e else: mulmod = mul % e return mulmod + decode_e(e - 1) else: return0
q = getPrime(1024) p = next_prime(q) n = p * q phi = (p - 1) * (q - 1) e = abs(decode_e(703440151)) c = pow(bytes_to_long(flag), e, n) print('n = {}\n' 'c = {}'.format(n, c))
''' n = 18770575776346636857117989716700159556553308603827318013591587255198383129370907809760732011993542700529211200756354110539398800399971400004000898098091275284235225898698802555566416862975758535452624647017057286675078425814784682675012671384340267087604803050995107534481069279281213277371234272710195280647747033302773076094600917583038429969629948198841325080329081838681126456119415461246986745162687569680825296434756908111148165787768172000131704615314046005916223370429567142992192702888820837032850104701948658736010527261246199512595520995042205818856177310544178940343722756848658912946025299687434514029951 c = 2587907790257921446754254335909686808394701314827194535473852919883847207482301560195700622542784316421967768148156146355099210400053281966782598551680260513547233270646414440776109941248869185612357797869860293880114609649325409637239631730174236109860697072051436591823617268725493768867776466173052640366393488873505207198770497373345116165334779381031712832136682178364090547875479645094274237460342318587832274304777193468833278816459344132231018703578274192000016560653148923056635076144189403004763127515475672112627790796376564776321840115465990308933303392198690356639928538984862967102082126458529748355566 '''
from Crypto.Util.number import * from math import factorial import sys sys.setrecursionlimit(10000)
defdecode_e(e, mul): if e > 1: # mul = 1 # for i in range(1, e): # mul *= i if e - mul % e - 1 == 0: mulmod = mul % e - e else: mulmod = mul % e print(e, mul, mulmod) return mulmod + decode_e(e - 1, mul//(e-1)) else: return0
p = 137005750887861042579675520137044512945598822783534629619239107541807615882572096858257909592145785126427095471870315367525847725823941391135851384962433640952546093687945848986528958373691860995753297871619638780075391669495117388905134584566094832853663864356912013900594295175075123578366393694884648557219 n = 18770575776346636857117989716700159556553308603827318013591587255198383129370907809760732011993542700529211200756354110539398800399971400004000898098091275284235225898698802555566416862975758535452624647017057286675078425814784682675012671384340267087604803050995107534481069279281213277371234272710195280647747033302773076094600917583038429969629948198841325080329081838681126456119415461246986745162687569680825296434756908111148165787768172000131704615314046005916223370429567142992192702888820837032850104701948658736010527261246199512595520995042205818856177310544178940343722756848658912946025299687434514029951 c = 2587907790257921446754254335909686808394701314827194535473852919883847207482301560195700622542784316421967768148156146355099210400053281966782598551680260513547233270646414440776109941248869185612357797869860293880114609649325409637239631730174236109860697072051436591823617268725493768867776466173052640366393488873505207198770497373345116165334779381031712832136682178364090547875479645094274237460342318587832274304777193468833278816459344132231018703578274192000016560653148923056635076144189403004763127515475672112627790796376564776321840115465990308933303392198690356639928538984862967102082126458529748355566 q = n//p phi = (p - 1) * (q - 1) # e = 703440151 li = [] print(decode_e(100, factorial(99)))
from Crypto.Util.number import * e = 703440151 li = prime_range(1, e) print(len(li)) # 36421874
p = 137005750887861042579675520137044512945598822783534629619239107541807615882572096858257909592145785126427095471870315367525847725823941391135851384962433640952546093687945848986528958373691860995753297871619638780075391669495117388905134584566094832853663864356912013900594295175075123578366393694884648557219 n = 18770575776346636857117989716700159556553308603827318013591587255198383129370907809760732011993542700529211200756354110539398800399971400004000898098091275284235225898698802555566416862975758535452624647017057286675078425814784682675012671384340267087604803050995107534481069279281213277371234272710195280647747033302773076094600917583038429969629948198841325080329081838681126456119415461246986745162687569680825296434756908111148165787768172000131704615314046005916223370429567142992192702888820837032850104701948658736010527261246199512595520995042205818856177310544178940343722756848658912946025299687434514029951 c = 2587907790257921446754254335909686808394701314827194535473852919883847207482301560195700622542784316421967768148156146355099210400053281966782598551680260513547233270646414440776109941248869185612357797869860293880114609649325409637239631730174236109860697072051436591823617268725493768867776466173052640366393488873505207198770497373345116165334779381031712832136682178364090547875479645094274237460342318587832274304777193468833278816459344132231018703578274192000016560653148923056635076144189403004763127515475672112627790796376564776321840115465990308933303392198690356639928538984862967102082126458529748355566 q = n//p phi = (p - 1) * (q - 1) # e = 703440151 li = [] # print(decode_e(100, factorial(99)))
# e = abs(decode_e(703440151)) e = 36421874 for i inrange(-100, 100): try: d = inverse(e+i, phi) tmp = long_to_bytes(pow(c, d, n)) if tmp.startswith(b'DAS'): print(tmp) except: continue