Pure Math

i春秋某次比赛的一道数学题
题目给了五个等式

1) A=p ** p % q = 12186712321556274802313402553356126512157290654464701566534349484212382799207163998435287936800610160675151119327710240215652909319302634364970447538455717
2) B=q ** q % p = 6103394310936584067454389409962479048105934646724420866311887833188537117508734349685657794808837203668831916615796300243221266996178553303978705436114327
3) C=(p ** q + q ** p) % (p*q) = 22155274817063045482341099416057324935237041348384691877088932813890941329865823786666098165850666379179769131957380798557361509247403400970656453667799728
4) D=(p+q) ** (p+q) % (p*q) = 71411974885498275383784246113078719643119636057546736047058177626627667526792302176448949473751037629058675758978417076853635417724814383607467105257301429546305423213976613958312001707915249212669805389895459800723068704723908337658402778491602779710698954234449451513269280972414014913698630324013817565619
5) FLAG ** 31337 % (p*q) = 19037153149171469279100153168711299774432729914206582610671321340880014818815509441690050154698899965634507752202942937900705313579458657209861334002077329511597053905730606556433360877647750883663041334949580042579766996097443902208909719308998655263931518712317325389243179442560013715140977121326666953693
Now, wath's the FLAG???

FLAG用了RSA加密,可以猜测p q为两个质数
可由费马小定理得到结论1:

p ** (q-1) %q=1 (费马小定理)
p ** q %q =p
p ** q =p+k * q
p ** q =p+p * k1 * q (k*q与p必有公因子p)
p ** q mod (p * q)= p

同理

q ** p mod (p * q) = q

这样3 式化简为

p+q mod (p * q) = C

由于 p+q < pq,得到式5

p+q = C

对于4式 进行展开可化简为

p ** (p+q) +q ** (p+q) mod (p * q) = D

由结论1可做进一步化简,得到式6

p **(p+1) +q ** (q+1) mod (p * q) = D

要把式1、2 代入 式6中,需要把其变换到模pq上,得到式 7:

p ** p % q ==A
p ** p =A+k * q
p ** (p+1) = A * p + k * q * p
p ** (p+1) % (p * q) =A * p

同理可以得到式8:

q ** (q+1) % (p * q) = B

这样可以把式7、8代入式6,得到式9:

A * p+ B * q % (p * q) =D
A * p +B * q =D +k * p * q

由1、2式可知 A

A * p+B * q =D + k * p * q < 2 * p * q

所以 k<2,又因为k为自然数,因此k为0或k为1。
如果k=0,由式5与式9:

p + q = C
A * p+B * q =D

解二元一次方程组,得到:

p=(D-CB)/(A-B)
q=(CA-D)/(A-B)

如果k=1, 由式5与式9:

p + q = C
A * p+B * q =D+p * q

解二元二次方程组,得到

q ** 2 +(B-A-C) * q+ A * C-D=0

q有两个解,逐个试着去解以下flag即可找到正确的q

解题过程:

>>> p1=12186712321556274802313402553356126512157290654464701566534349484212382799207163998435287936800610160675151119327710240215652909319302634364970447538455717
>>> p2=6103394310936584067454389409962479048105934646724420866311887833188537117508734349685657794808837203668831916615796300243221266996178553303978705436114327
>>> p3=22155274817063045482341099416057324935237041348384691877088932813890941329865823786666098165850666379179769131957380798557361509247403400970656453667799728
>>> p4=71411974885498275383784246113078719643119636057546736047058177626627667526792302176448949473751037629058675758978417076853635417724814383607467105257301429546305423213976613958312001707915249212669805389895459800723068704723908337658402778491602779710698954234449451513269280972414014913698630324013817565619
>>> b=p1-p2-p3
>>> c=p2*p3-p4
>>> from gmpy2 import *
>>> delta=b**2-4*c
>>> delta
3066182027377339426161475390272303281422241117118294025762451536395473699521783439093472519664409147736238564096838411919521305865894011304527212765265209655551893962231547289377814885619666687640707309572454027128028671929414267426941629223066065081111132569647477178476172101767744175624854334223493972496L
>>> isqrt(delta)
mpz(1751051691806195487838264000643235952094252236165089382899353837077943089553005633250916467621995934112357902526603374442915241088088571906923585463469636L)
>>> root=isqrt(delta)
>>> (-b+root)/2
mpz(8911504249124775117660175136653456711639968788404750279882912499972519368860199885583692245740444678142903915886035116513922554006183945908294148514463987L)
>>> p1=(-b+root)/2
>>> p2=(-b-root)/2
>>> p1
mpz(8911504249124775117660175136653456711639968788404750279882912499972519368860199885583692245740444678142903915886035116513922554006183945908294148514463987L)
>>> p2
mpz(7160452557318579629821911136010220759545716552239660896983558662894576279307194252332775778118448744030546013359431742071007312918095374001370563050994351L)
>>> q1=p3-p1
>>> q2=p3-p2
>>> f=(q1-1)*(p1-1)
>>> e=31337
>>> d=invert(e,f)
>>> d
mpz(1201422974225559398959266675080409884613998634434854335235988063236289857734705868310453019635679708820833003308403225520082929066377980119591071385357736574756328616413343140233878127452362227265026399898822473893752534333783267370480165018481942669319606889814243437498540945865432354196928381784030153953L)
>>> c=19037153149171469279100153168711299774432729914206582610671321340880014818815509441690050154698899965634507752202942937900705313579458657209861334002077329511597053905730606556433360877647750883663041334949580042579766996097443902208909719308998655263931518712317325389243179442560013715140977121326666953693
>>> ppp=powmod(c,d,p1*q1)
>>> from libnum import n2s
>>> n2s(ppp)
'flag{6a66b8d5-6047-4299-a48e-4c4d1f874d12}'

你可能感兴趣的:(Pure Math)