与 鹤城杯2021#3 babyrsa 很像
需要正确计算3次整数m的值,以下为sage代码,请在sage shell或者sage notebook中运行。
有时候会出现无法求解p的情况,建议多试几次或者重启远端的靶机环境。
p1= 962995651028784056228967211189298603501600247761455347639544685569393219476504898551748733
ct= 53692868731001626333440793541878974197039413877018388507320606323515264945427751
n= 13584890220251264218145775170856639490650517128337616575834960469001489208134004876538465671824104012713357630552766538943902688318740738013506759557154024608216331001923510277085255016894517573218226070793817136622540614343717167314933886251019143584715403066869488344399918685900745858044531169029610061736593670069813018722602125858468578670551068901858471742223308582893605096903512791990246746639102996749737502078430290734498984203569950519004546666774922244514553604367334742539881958665924058301543953380087523937366841425277988667401595750158847916087310792164881378525163440959041067401255177462658854441691
c= 3594292739649962962399237162835969086717092012634077792124941757513923539040859603396238208231740284046155922589708530902151863477538208711513769173565881219100257782683392861990412731220124359397529374519375481227241284649475552799861274599374021246649243557193472317297773304929852765637737898203421168909638647235781036853684379367083578777948146478186458404592367724189342507409293493070188455919471183759323808539786090537512771480003660364283098077787431095007304551965180332432089099594792658608843614964130676738688316332519202007665842218549463300088010745100574994675049478716900346984060092628067775596441
mod=pow(2,265)
# p0=n*invert(q0,mod)%mod
pbar=(p1<<724)+ct
PR.<x> = PolynomialRing(Zmod(n))
for i in range(32):
f=pbar+x*mod*32
f=f.monic()
pp=f.small_roots(X=2^454,beta=0.4)
if(pp):
break
pbar+=mod
assert pp
p=pbar+pp[0]*32*mod
print(p,type(p))
print(len(str(p)))
print(n//Integer(p))
q=n//Integer(p)
e=65537
phi=(p-1)*(q-1)
# d = gmpy2.invert(e, (p - 1) *(q - 1))
# m = powmod(c, d, n)
d = inverse_mod(e, phi)
m = pow(c, d, n)
print(m)