nepctf
crypto
中学数学
task
from gmpy2 import *
from Crypto.Util.number import *
from secret import flag
p = getPrime(1024)
q = next_prime(p + (p >> 500))
e = 0x10001
n = p * q
c = pow(bytes_to_long(flag), e, n)
print("n=", n)
print("c=", c)
'''
n= 13776679754786305830793674359562910178503525293501875259698297791987196248336062506951151345232816992904634767521007443634017633687862289928715870204388479258679577315915061740028494078672493226329115247979108035669870651598111762906959057540508657823948600824548819666985698501483261504641066030188603032714383272686110228221709062681957025702835354151145335986966796484545336983392388743498515384930244837403932600464428196236533563039992819408281355416477094656741439388971695931526610641826910750926961557362454734732247864647404836037293509009829775634926600458845832805085222154851310850740227722601054242115507
c= 6253975396639688013947622483271226838902346034187241970785550830715516801386404802832796746428068354515287579293520381463797045055114065533348514688044281004266071342722261719304097175009672596062130939189624163728328429608123325223000160428261082507446604698345173189268359115612698883860396660563679801383563588818099088505120717238037463747828729693649297904035253985982099474025883550074375828799938384533606092448272306356003096283602697757642323962299153853559914553690456801745940925602411053578841756504799815771173679267389055390097241148454899265156705442028845650177138185876173539754631720573266723359186
'''
思路
p , q 接近,且 p , q 的 500 − > 1024 位相同 , n > > 500 ≈ p > > 500 ≈ q − p , 可以爆破与 q − p 的偏差 的到真正的 q − p , 从而得到 p , q . p,q接近,且p,q的500->1024位相同,\sqrt{n}>>500\approx p>>500 \approx q-p,可以爆破与q-p的偏差\\的到真正的q-p,从而得到p,q. p,q接近,且p,q的500−>1024位相同,n>>500≈p>>500≈q−p,可以爆破与q−p的偏差的到真正的q−p,从而得到p,q.
wpcode
from gmpy2 import *
from sympy import *
from libnum import *
e=0x10001
c=6253975396639688013947622483271226838902346034187241970785550830715516801386404802832796746428068354515287579293520381463797045055114065533348514688044281004266071342722261719304097175009672596062130939189624163728328429608123325223000160428261082507446604698345173189268359115612698883860396660563679801383563588818099088505120717238037463747828729693649297904035253985982099474025883550074375828799938384533606092448272306356003096283602697757642323962299153853559914553690456801745940925602411053578841756504799815771173679267389055390097241148454899265156705442028845650177138185876173539754631720573266723359186
n= 13776679754786305830793674359562910178503525293501875259698297791987196248336062506951151345232816992904634767521007443634017633687862289928715870204388479258679577315915061740028494078672493226329115247979108035669870651598111762906959057540508657823948600824548819666985698501483261504641066030188603032714383272686110228221709062681957025702835354151145335986966796484545336983392388743498515384930244837403932600464428196236533563039992819408281355416477094656741439388971695931526610641826910750926961557362454734732247864647404836037293509009829775634926600458845832805085222154851310850740227722601054242115507
x=int(iroot(n,2)[0])
xh=x>>500
def dec(p,q):
try:
d=int(invert(e,(p-1)*(q-1)))
m=pow(c,d,n)
print(n2s(int(m)))
except:
print("N0")
for k in range(1,100000000000):
d=xh-k
x = symbols('x')
y= symbols('y')
ans=solve([x*y-n,x-y-d],[x,y])
if(len(ans)==0):
continue
if(len(ans)==1):
print(k)
p=ans[0]
q=ans[1]
dec(p,q)
if(len(ans)>1):
print(k)
for key in ans:
p=key[0]
q=key[1]
dec(p,q)