from Crypto.Util.number import * import gmpy2 from sympy.ntheory import discrete_log from hashlib import * from Crypto.Cipher import AES
# 构造一个很光滑的p,即p可以分解成许多小素数之积 p = 1 i = 2 while isPrime(p+1) ==Falseor p.bit_length()<1024 : p *= i i = gmpy2.next_prime(i)
# print(p+1)
# 接下来就是解Alice的私钥a g = 2 p = p+1 A = 6497613672285956425201511287597625030386480108672286755480826112363203245642148151212994725377254666591461004877010242830011793120730597548153751505160757772485565892716879723968695533469583944347775896608532625158303921475557511270608379047178615651278485591942635948967376062201899549648208278357029126731213145007749394102828405131490762093895807059008547765574826356405482971857911257856639902792877504986919307035949726 B = 6892121088985539176550813556605471863390995273766116635861764749041016271848611822954736310722897673081939505093515966422841748844230466887689109451140120941395556326881049077033545866417480327268932777262530024548392468111847291103142479432094000792091679519431359554583970331286677886683961473976144527513383303092681236504569767664611631709120184944129897975070357015740122424467791475504388327118892471415926469637241282
enc = b'`<\xad\x93e\xeez\x8e\x1b\xe2B\xe9\xc7\x166\xc92$\x1a\xda\x86\x12m\x07\xb2\xa5d\x0b.\x13\xee\xa7.y(1\xd0\xf8\xc5\xffL\xf1\xb6_m840' iv = b"dasctfdasctfdasc" a = discrete_log(p,A,g)
key = sha256(long_to_bytes(pow(B, a, p))).digest() # print(a)
aes = AES.new(key, AES.MODE_CBC, iv) flag = aes.decrypt(enc) print(flag)
from Crypto.Util.number import * from secret import secret, flag defencrypt(m): returnpow(m, e, n) assert flag == b"dasctf{" + secret + b"}" e = 11 p = getPrime(512) q = getPrime(512) n = p * q P = getPrime(512) Q = getPrime(512) N = P * Q gift = P ^ (Q >> 16)
print(N, gift, pow(n, e, N)) print(encrypt(bytes_to_long(secret)), encrypt(bytes_to_long(flag)))
N = 75000029602085996700582008490482326525611947919932949726582734167668021800854674616074297109962078048435714672088452939300776268788888016125632084529419230038436738761550906906671010312930801751000022200360857089338231002088730471277277319253053479367509575754258003761447489654232217266317081318035524086377 gift = 8006730615575401350470175601463518481685396114003290299131469001242636369747855817476589805833427855228149768949773065563676033514362512835553274555294034 pow(n,e,N) = 14183763184495367653522884147951054630177015952745593358354098952173965560488104213517563098676028516541915855754066719475487503348914181674929072472238449853082118064823835322313680705889432313419976738694317594843046001448855575986413338142129464525633835911168202553914150009081557835620953018542067857943 pow(secret,e,n) = 69307306970629523181683439240748426263979206546157895088924929426911355406769672385984829784804673821643976780928024209092360092670457978154309402591145689825571209515868435608753923870043647892816574684663993415796465074027369407799009929334083395577490711236614662941070610575313972839165233651342137645009 pow(flag,e,n) = 46997465834324781573963709865566777091686340553483507705539161842460528999282057880362259416654012854237739527277448599755805614622531827257136959664035098209206110290879482726083191005164961200125296999449598766201435057091624225218351537278712880859703730566080874333989361396420522357001928540408351500991
import sys from tqdm import * sys.setrecursionlimit(3000) gift = 8006730615575401350470175601463518481685396114003290299131469001242636369747855817476589805833427855228149768949773065563676033514362512835553274555294034 N = 75000029602085996700582008490482326525611947919932949726582734167668021800854674616074297109962078048435714672088452939300776268788888016125632084529419230038436738761550906906671010312930801751000022200360857089338231002088730471277277319253053479367509575754258003761447489654232217266317081318035524086377
# 低位往高位爆
deffindp(p,q): iflen(p) == 512: pp = int(p,2) if N % pp == 0: print("p = ",pp) print("q = ",N // pp) else: l = len(p) pp = int(p,2) qq = int(q,2) if (pp ^ (qq>>16)) % (2 ** l) == gift %(2**l) and pp * qq %(2 ** l) == N % (2**l): findp('1' + p,'1' + q) findp('1' + p,'0' + q) findp('0' + p,'1' + q) findp('0' + p,'0' + q) for i in trange(2**17,2**16,-1): findp('1',bin(i)[2:])
N = 75000029602085996700582008490482326525611947919932949726582734167668021800854674616074297109962078048435714672088452939300776268788888016125632084529419230038436738761550906906671010312930801751000022200360857089338231002088730471277277319253053479367509575754258003761447489654232217266317081318035524086377 gift = 8006730615575401350470175601463518481685396114003290299131469001242636369747855817476589805833427855228149768949773065563676033514362512835553274555294034 c = 14183763184495367653522884147951054630177015952745593358354098952173965560488104213517563098676028516541915855754066719475487503348914181674929072472238449853082118064823835322313680705889432313419976738694317594843046001448855575986413338142129464525633835911168202553914150009081557835620953018542067857943 secret_c = 69307306970629523181683439240748426263979206546157895088924929426911355406769672385984829784804673821643976780928024209092360092670457978154309402591145689825571209515868435608753923870043647892816574684663993415796465074027369407799009929334083395577490711236614662941070610575313972839165233651342137645009 flag_c = 46997465834324781573963709865566777091686340553483507705539161842460528999282057880362259416654012854237739527277448599755805614622531827257136959664035098209206110290879482726083191005164961200125296999449598766201435057091624225218351537278712880859703730566080874333989361396420522357001928540408351500991 e = 11
P = 8006847171912577069085166877758626954304824756138758266557706391662987806065132448544117840031499707938227955094109779732609035310252723066470330862622641 Q = N // P d = gmpy2.invert(e,(P-1)*(Q-1)) n0 = pow(c,d,N) print(n0) print(n0.bit_length())