[广东强网杯 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<

发现这个规模并不大,到最后还不到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}'

你可能感兴趣的:(python,开发语言)