[广东强网杯 2021 个人决赛]x的rsa

在NSS看到这个题,一时没解出来,vengx的想法正如我意,爆破

from secret import flag
from Crypto.Util.number import *

n=555874362800077307351349323959556305823679865096974739699039304520811461922546877505483292074377962997480168730941084986031918926115468986048132846314317327244366076317881328875305139757468506819753917565301041521994792997784990529160661007807004071216391847168511159628732023598727689401487434853905554749280798380374186272992608799675900580130115029398706932090275515981236686135335055562885949766467864862238746989221793140411672825562857614464113604707083884129479481475175527976959172076475310448821312036486659466916105842946075097043956473104277606702423723092346787634548345809790882164812267088418554967082880247509476360872795847939517188031693706703214952001590599335382728961629795490766539466798430616131302029014446435501132784188333778541649558650344951065109005930688334942546271535462831463682014398306894225082721649002037158349461603703456874829697758625645456581644883467094418741413102904156330359205502975416410454219706265854768344086724973254657989901990683613226147018746869712730551959912063096538353599691529835659891650854292563519351673144631155578490149079108159713125666527036026600547431022292822123451315401453684643031253580663500975010221263956039951448647277306725442343147071135004128741726431033

e1 = getPrime(1024)
e2 = getPrime(1024)

a = (e1*e2)&(~(e1-e2))|(~(e1*e2))&(e1-e2)
b = (e1*e2)&(~(e1+e2))|(~(e1*e2))&(e1+e2)

m = bytes_to_long(flag)
c1 = pow(m, e1, n)
c2 = pow(m, e2, n)
print(a,b,c1,c2)

题目给出n,a,b,c1,c2其中a,b是写法复杂的异或,所以这式子可以写简单点

a = (e1*e2)^(e1-e2)
b = (e1*e2)^(e1+e2)

然后就想到a^b ==e1-e2^e1+e2

(这个写法没错,根据优先级异或后运算,所以不用加括号,但正常情况下还是得加上,太容易误解了。)

然后就是用什么方法得到e1,e2,感觉弄不好内存会不够用,python的递归深度也不够。不过也想不出其它办法了。只能爆破一下。

a =-13044938042781614197445034983537909222226146037511750093047020141727111710810500146119207432647019975699891559853303696176506278954797745370918065864242266499030105194081312738132635200176182847717414623957385926116143001377759565453718117322502556880354740086253475265127032499116496273787538097163916368577122166457790958004093799604137135410557530479630027107396187303600024721882724320802735742544296652623485734285140033180911788248550843651906693168433939700792523103645230339869742760284879188906848299499981647871080403372652800822493942884110628440026118629664341476477007217158736795383995511419254443878039 
b = 13044938042781614197445034983537909222226146037511750093047020141727111710810500146119207432647019975699891559853303696176506278954797745370918065864242266499030105194081312738132635200176182847717414623957385926116143001377759565453718117322502556880354740086253475265127032499116496273787538097163916368576874055182580382255793546788933327218834901665960064085193996132022919932562411434625467211020828398286533973150336823913629906138977211293449318638842465350261409977118004137738412033461291303421716009170813016271185815550198080435630041138750716482537069427193610590539358067592958649447542143426129029858351
from Crypto.Util.number import *

elist = [[1,1]]
for i in range(1,1024):
    tlist = []
    one = 1<<i 
    mask = 1<<(i+1)-1
    atail,btail = a&mask,b&mask
    #print('tail:', atail,btail)
    for te1,te2 in elist:
        for v1,v2 in [[te1,te2],[te1+one,te2],[te1,te2+one],[te1+one,te2+one]]:
            #print(v1,v2,(v1*v2)^(v1-v2),((v1*v2)^(v1-v2))&mask, (v1*v2)^(v1+v2), ((v1*v2)^(v1+v2))&mask)
            if ((v1*v2)^(v1-v2))&mask == atail and ((v1*v2)^(v1+v2))&mask == btail:
                tlist.append([v1,v2])
    print(i,'len:',len(tlist))
    
    elist = tlist

for v1,v2 in elist:
    if isPrime(v1) and isPrime(v2):
        print(v1,v2)

e1,e2 = 101397989149153392173833808241842253815440969897798308579178047007898313772382368163247315236528726848279700308273256111656902639681374839294683546565063103873956087863970580941043846753263714499809219917398980537333036626106750845388403762843240277925975592904748690654621846748810280350549173737562330279763,128650855428630864702841981062231593538035388724121784165018097071191162769926370359486839681754852916174317571160070184630378153832390102965429378828441265256745790281991737143739909010150861745552406365407076160123676277573023513882206333901423456182787832847868342782542996558540141572229348594590631535011

发现这个规模并不大,到最后还不到3000组,通过检查素数得到正确的e

后边就比较简单,两个e,两个c,一个n

import gmpy2
g, x1, x2 = gmpy2.gcdext(e1,e2)   #g!=1, e有公因子需要再开根号
m = pow(c1,x1,n)*pow(c2,x2,n) % n
print(long_to_bytes(int(gmpy2.iroot(m,g)[0])))
#b'flag{J6s7_S0m3_S1mpl3_M@7h}'

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值