from Crypto.Util.number import * from gmpy2 import gcdext from extend_mt19937_predictor import ExtendMT19937Predictor from itertools import product from tqdm import tqdm
defmy_pow(m,e,n): if e<0: return inverse(pow(m,-e,n),n)%n else: returnpow(m,e,n)
for c1,c2 in c: tmp=pow(c1,t,n)*inverse(pow(c2,s,n),n)%n for m inrange(256): if my_pow(m,t-s,n)==tmp: encflag.append(m) break encflag=bytes_to_long(bytes(encflag)) print(encflag) #5808031027043628162680151939451046896318461702606899637261519628597633638670331617408988305725962951563713997335461555788456061664507614271209312052190146070886646800923406401095648933383421520598567936442062181397887455263188256755970400658783406029792373329955006020555525415893643918145187677700370550761
encflag=5808031027043628162680151939451046896318461702606899637261519628597633638670331617408988305725962951563713997335461555788456061664507614271209312052190146070886646800923406401095648933383421520598567936442062181397887455263188256755970400658783406029792373329955006020555525415893643918145187677700370550761 mlist=list(long_to_bytes(encflag)) possible_rlist=[] for m,cc inzip(mlist,c): c1,c2=cc tmpr=int(my_pow(c1,A,n)*my_pow(c2,B,n)*inverse(my_pow(m,A+B,n),n)%n) assert c1==m*pow(tmpr,s,n)%n assert c2==m*pow(tmpr,t,n)%n if tmpr==0: break tmprlist=[] while tmpr.bit_length()<=1024: tmprlist.append(tmpr) tmpr+=n possible_rlist.append(tmprlist)
#624/(1024/32)=19.5 possible_rlist=possible_rlist[:20] for rlist in tqdm(product(*possible_rlist)): predictor=ExtendMT19937Predictor() #624=19*(1024/32)+(512/32) for i inrange(19): predictor.setrandbits(rlist[i],1024) predictor.setrandbits(rlist[19]&(2**512-1),512) for i inrange(624): predictor.backtrack_getrandbits(32) guess_s=predictor.backtrack_getrandbits(1024) if guess_s==s: a=predictor.backtrack_getrandbits(1024) k_phi=s*a+t*(1-a) d=inverse(0x10001,k_phi) flag=long_to_bytes(pow(encflag,d,n)) print(flag) exit(0) #b'n1ctf{5255840f-9140-4479-950f-a3c03fe7f4cd}'
from Crypto.Util.number import * from math import prod from secret import flag
defkeygen(pbits,kbits,k): p = getPrime(pbits) x = [getPrime(kbits + 1) for i inrange(k)] y = prod(x) while1: r = getPrime(pbits - kbits * k) q = 2 * y * r + 1 if isPrime(q): return p*q, (p, q, r, x)
key = keygen(512, 24, 20) flag = bytes_to_long(flag) messages = [getPrime(flag.bit_length()) for i inrange(47)] + [flag] enc = [encrypt(key[0], message) for message in messages]
m=matrix(ZZ,l,l+1) for i inrange(l): m[i,i]=1 m[i,l]=messages[i] ml=m.LLL() #print(ml) kn=[] for row in ml: v=vector(ZZ,row[:-1]) mes=vector(ZZ,messages) assert v*mes==row[-1] t1,t2=0,0 s1,s2=1,1 for i inrange(len(row[:-1])): if row[i]>0: t1+=messages[i]*row[i] s1*=enc[i]^row[i] else: t2+=messages[i]*(-row[i]) s2*=enc[i]^(-row[i]) if row[-1]<0: t1+=(-row[-1]) s1*=e^(-row[-1]) else: t2+=row[-1] s2*=e^row[-1] if t1<t2: kn.append(s1*e^(t2-t1)-s2) else: kn.append(s2*e^(t1-t2)-s1)
n=gcd(kn) print(n)
''' 49611284910337799636686093973628884556519420722411744808788041251053464830295020698422734325291979154664020667752312689941156441913588062021033819091827109198856404394033383330790178899747263327203370892584838961198767774504917946326930691665376634864787990599380909937268721753630966833756746550396165568643515524639508308583115086758244593451557057086091631335435790943219993697350307236788433226079650671638629500149333590709610544282138758930744076756362806343446562260731142938656726337673043604423108674514420668104284015023085322240000000000000000000 div by small primes 131158523227880830085100826212925738665356578827561846263073537503153187073136528966506785633847097997799377037969243883439723340886038624250936927221630287086602285835045356221763554989140952262353930420392663280482277832613695689454662506372252641564106136178637816827646124189347219273164844809807934422046441 ''' n=131158523227880830085100826212925738665356578827561846263073537503153187073136528966506785633847097997799377037969243883439723340886038624250936927221630287086602285835045356221763554989140952262353930420392663280482277832613695689454662506372252641564106136178637816827646124189347219273164844809807934422046441 c=enc[-1] ''' yafu pm1(131158523227880830085100826212925738665356578827561846263073537503153187073136528966506785633847097997799377037969243883439723340886038624250936927221630287086602285835045356221763554989140952262353930420392663280482277832613695689454662506372252641564106136178637816827646124189347219273164844809807934422046441) -B1pm1 33554432 -B2pm1 4294967296 ''' p=10104420349837363561278745998119091841853342383118385156657416134976061697027571349895988817770681767227605656666215380267313369652920490697343475330713803 q=12980311456459934558628309999285260982188754011593109633858685687007370476504059552729490523256867881534711749584157463076269599380216374688443704196597025947 res=discrete_log(mod(c,q),mod(e,q)) print(long_to_bytes(res)) b'n1ctf{1f1b18f9-8523-4584-a8eb-c8b5c9c9433d}'
from Crypto.Util.number import * from secret import flag
m = Integer(int.from_bytes(flag, 'big'))
for _ inrange(7): p = getPrime(512) q = getPrime(512) n = p * q while1: try: a = randint(0,n) b = randint(0,n) Ep = EllipticCurve(GF(p), [a,b]) Gp = Ep.lift_x(m) * 2 Eq = EllipticCurve(GF(q), [a,b]) Gq = Eq.lift_x(m) * 2 y = crt([int(Gp[1]),int(Gq[1])],[p,q]) break except Exception as err: pass print(n, a, b, y)