nepctf 中学数学

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,q500>1024位相同,n >>500p>>500qp,可以爆破与qp的偏差的到真正的qp,从而得到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)

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

never629

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值