wp
根据费马小定理可知
C 2 = d a t a p = d a t a m o d p C_2=data^p=data\;mod\;p C2=datap=datamodp
又因为data < q
所以可以将c2变换为
C 2 = d a t a p = d a t a + k ∗ p m o d n C_2=data^p=data+k*p\;mod\;n C2=datap=data+k∗pmodn
其中k < q 所以 data+k*p < n
计算 c2 - data 和 n 的最大公因数就可以得到p了,二data可以从flag的前缀JDSEC中得到
解题代码
from Crypto.Util.number import *
import libnum
n = 16190071651163806295864019410478994111033069033627784225762863537603051286100205075670533295885064417368900028860200646693729094397336259104108103548185993908365388380839285172911963120514072321190266876940732034732397117137061394460746923843922245782775468266708629538795929791940224005947023797710889884139262655896037569495345277362100989310206818815906815037340109507090191392200724993896961774561625607045531746223966956306007588691156861073213545675831176519130019553724245771994149735589727939984664508149900746138671733567269193055682039733308565608623124419978622690108399287267782094992833491412117540060443
flagenc =15303419998661114679314254717914026405478757825416735351601804954118839229797070479526681279224742375492655311505697019190557550696467480133256967636550925789855469334208787745973414205031434095712965892662629942032090010088494752811463912882633957119964067548777662273186260137022598527046219193475032906299912859488699286089311234866062127452250073707233182744079405190900962311612847001444141191413026226164120884637043140094140783528285331931332316785677352225990586242903100117563104312764791553556755518103356463537538508315396815826486784213208395270070213346386705111244580124327114520898478012805359398827670
dataenc = 1510184595792565064445440906881935995266619097536001461530783965780154369249043641074486895520464486085479962000078556210579654456510298579647913754227118673129421819393900310384823524058038067616709691791898230083313217906194886078501873907639225319148093330535005464365092684845804210054017334558737467574892102337630443813828900547064330664128905647113707379303375108854244133403877761359312330320014228059025076059037200823315174250296513866303939391915733284159144473793081857745772615093108270863280285078431940816859845225827381322898005915615672862823461308519156692000709906390303017977729854164511610194054
flag = b'JDsec{xxx}'
data = bytes_to_long(flag[:4])
tmp = dataenc - data
print(libnum.gcd(tmp,n))
p = libnum.gcd(tmp,n)
q = n//p
print(p)
print(q)
p = 129416181612257876154247458417582099477937741321908494346416374424278580785110448287833530389844259769907461279737604358547288105691818205744945969465444506479969122816591510658838349279841753524475758218895661963835426037214056307137142155259194162395012562620620180830048287576584227716394058666366534674731
q = 125100829351237293983667551205912279244893493834637038081284080595281422847856719193714741962109271202694836230048193115004128890890181031077984761539815993297137310414057579674067168522402894108476151786185082486642284844810466848818145575945029372695173298201907495242066183784160382870055051059378735948753
n=p*q
phi=(p-1)*(q-1)
e = 65537
d = libnum.invmod(e,phi)
print(long_to_bytes(pow(flagenc,d,n)))
# JDSEC{37439fdaba4c2d282a64a71a74d676d4dac412a78d9c183f80f018d19b1415d9}