这题直接是将 Flag 通过 bytes_to_long 转成了一个长整型,那么我们只需要用 long_to_bytes 将其转换回来即可,写点代码:
1 2 3 4 5
from Crypto.Util.number import long_to_bytes
m = 7130439814057451283123261212311792965221465187093665325418151083084336062884806048278336517910440471098303223600583095785498954652150321894178963775030272294956440353105533996517701166778749
from Crypto.Util.number import long_to_bytes, inverse
p = 217873395548207236847876059475581824463 q = 185617189161086060278518214521453878483 c = 6170206647205994850964798055359827998224330552323068751708721001188295410644 e = 65537 n = p * q
phi = (p - 1) * (q - 1) d = inverse(e, phi) m = pow(c, d, n)
print(long_to_bytes(m).decode('utf-8'))
运行程序解码后得到 Flag:flag{Y0ung_meiyou_xiaojj}
……?
XOR
题目给了 RSA 加密中 p 与 q 的 xor 值,当然,其实还有 p 与 q 的乘法值 n,所以可以通过一些手段计算出 p 和 q:
defexplode(n,x,r): n1 = n x1 = x cur_mod = 1 a_list, b_list = [0], [0] for _ in tqdm(range(r)): cur_mod *= 2 next_a = [] next_b = [] for al, bl inzip(a_list, b_list): for ah, bh in itertools.product([0, 1], repeat=2): aa, bb = ah*(cur_mod // 2) + al, bh*(cur_mod // 2) + bl if ((aa * bb % cur_mod == n1 % cur_mod) and ((aa ^ bb) == x1 % cur_mod)): next_a.append(aa) next_b.append(bb) a_list, b_list = next_a, next_b for a in a_list: for b in b_list: if a*b == n1 and a ^ b == x1: return a, b
n = 20810298530643139779725379335557687960281905096107101411585220918672653323875234344540342801651123667553812866458790076971583539529404583369246005781146655852295475940942005806084842620601383912513102861245275690036363402134681262533947475193408594967684453091957401932685922178406769578067946779033282889429596341714417295489842047781388337010440309434639274398589029236213499110100040841426995862849012466514170374143655264739023758914247116354182164550612494432327931655944868705959874670536031052370968354394583880324756639698871918124498442308334232127034553164826483441746719644515097123067550594588348951855987 x = 66138689143868607947630785415331461127626263390302506173955100963855136134289233949354345883327245336547595357625259526618623795152771487180400409991587378085305813144661971099363267511657121911410275002816755637490837422852032755234403225128695875574749525003296342076268760708900752562579555935703659615570 r = 1024
print(explode(n,x,r))
运行后就能得到 p 和 q 的值,直接计算 d 然后进行解密:
1 2 3 4 5 6 7 8 9 10 11 12 13
from Crypto.Util.number import long_to_bytes, inverse
p = 121707024037268877853347577606022680727723421754483145354598542291389059730952536897407296725631390435306824149329251450428520017032068370905491236371588783551854860933656246846861645834009102275363106544337746297119821339365287420703692873394398852690091625453178968493127766149991473384937200789954598163517 q = 170986832479534233007906048950464510414382588164533889416767650420928742690929190093999799507883047422413122991286355305384227808800633111611572663168246588357071419165779511128259447564377245832827901688451015954867004306626552500789867499455455629032408110167560346510245108938981288797349665759162752876911 c = 15294238831055894095745317706739204020319929545635634316996804750424242996533741450795483290384329104330090410419090776738963732127756947425265305276394058773237118310164375814515488333015347737716139073947021972607133348357843542310589577847859875065651579863803460777883480006078771792286205582765870786584904810922437581419555823588531402681156158991972023042592179567351862630979979989132957073962160946903567157184627177910380657091234027709595863061642453096671316307805667922247180282486325569430449985678954185611299166777141304330040782500340791721548519463552822293017606441987565074653579432972931432057376 e = 65537 n = p * q
phi = (p - 1) * (q - 1) d = inverse(e, phi) m = pow(c, d, n)
n = 312769358113056565136009929613710078319 a = 502544169271820386689252632658814094367301437045954876397315583623220656128 b = 11856650155037935400579201826386146297 s = 201319433320428898153580935653793106657
f = open("ez_rsa.1.txt", "r").read() f = f.split("\n") f = [int(_.split(" = ")[1]) for _ in f]
a = 1 for i in f: assert isPrime(i) a *= (i-1)
n = 114107341297408283801468814470303963122122556489590451040619457052827864984505912502462030175984161431709841571908269123131659496812467145870607611968843929870716066046232009282431653653484798819370087696248364531531706249180822839879862098012984590503284615395588919199545142177727328844260380842155437987767067800740569616584597507776426572206990858918111272636507821551592564540694671795374831548677720629329358177802890287837056940407030212276399942462042866947423728888561392653713356355778914658317507319575084393752755452971007289968044006561357799908892371839922838486713582082980752194204224263283004373 c = 28535916699190273475273097091422420145718978597126134891571109006456944397344856577421369324831702083810238921719657496747722337086131545474384253288151783029981352196506749672783866527948391034258269669654392993063423671431837882584570973320095601407578443348352802850496429240170710269529489900871208384711844617081275862971410246759090936379744946527813691945129059991795202769186014306943707223831130752782380563227353615164053563120572722464543812139164048342504963081408349934180883607554389607335607410546630525512019818062185681153477671373000186961748278118124044645584490544698827467815360888525822167
d = inverse(65537, a) print(long_to_bytes(pow(c, d, n)).decode('ascii'))
运行后得到 Flag 的前半部分:flag{05929ec9778ed7 。至于第二部分,则可以采用共模攻击:
n = 21235204662158833223664424963408105101885570855652885953922511758363954474947609854216589644512813634294435585894296340005122907229365513346971631594453999584706013889403572150499529308966742992668850443386284277210686717652643585324255759216699733045642544284406720854291604837774882256435503827543483289606177965628162259184958789025311291796067574924595051311298594432767265114154138693108465671184854794167878031822162731921299518989845784744659944947091213703810190708463199067553747177712259911724424547999547534441790125049383068377243727588278432796727885216967953646999183906479537750330738956233695342750567
m = rsa_def(e1, e2, c1, c2, n) print(m) print(libnum.n2s(int(m)).decode())
运行后得到 Flag 后半部分:39d94ee1a77b742714} 。所以 Flag:flag{05929ec9778ed739d94ee1a77b742714}
e?
事实上这个 e 就是加密时候所用的 e,此题并不是爆破 e。因为 e 并不是质数,所以不能用正常的 RSA 解密方法进行解密。查的相关情况的解密代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
from gmpy2 import gcd, invert, iroot from Crypto.Util.number import long_to_bytes
defdecrypt(p, q, e, c): n = p * q phi = (p - 1) * (q - 1) t = gcd(e, phi) d = invert(e // t, phi) m = pow(c, d, n) msg = iroot(m, t) if msg[1]: print(long_to_bytes(msg[0]))
p = 70724362259337647663584082414795381346569735601816096923682814277857463878289 q = 114427188167532721707398034034072867253267857672869034942206947096293901917007 e = 1314 c = 4308122681135507736058122041934864039713319497673888928736468819190185301630702240416683093700232966794026900978699666246019059398861283337865339404916304
from Crypto.Util.number import long_to_bytes, inverse import sympy
c = 52409805591744226507807531465616894934028463651864630447934395956954575834603756391651746535033902964658694070544877880970130028487381287088425209448038533705903737694267359561133766799228825599943891152463160326583722749586721691729062524310148743637505134465210906856660867852927837112666513674858029892207902196213784902541173835447263733760225682942461048573387925463479672527491229113710629340960375692432470493054415657845868577650170648157402682163577152288432313996310562452677399267755695644659367792066311336521698894993982901657735586844358679888210537898629281625526455444811591386493005341435516094660429968084363084301878446471676122069724608083578102382181382107225473535696274374370868301830807644939881080301668756603163431000745972823980427048672732291 n = 226515252384227990547287743140613580056836242860947832749754689048997071950972581790210817523352001702907675581567498443649554801433663166425134375454937126656357069687274036935331269594383360450823787099121079436459236734336130768046337169817940540921822023269188752420603975467384377614321048859304185067329741055517464271746238143742661897809442359331215501438861121047081117632626097939097519866099140569819965948998542652908170134545593659233229897003698175558888336706474178958535138595687148003367152624421106553412886263257022809480187410133186189435436294593588009551451899398811758511878324326255293307347560753524372663257044426744744426759970254203341706284024734042826158828749144322843934985927079504722440497388146240627249465363931951790326885478025237643 a = 11776588228599764849559519654482976956833367474471407292255776713760090338489966385328569279135095351660161277221351884258247731394014018172166064062551483 e = 65537
a_minus_1 = a - 1 a_power_4 = a**4
phi_n = a_minus_1 * a_power_4 d = inverse(e, phi_n)
from Crypto.Util.number import long_to_bytes import gmpy2 as gp
for i inrange(1, e): if (dp*e-1) % i == 0: if n % (((dp*e-1)//i)+1) == 0: p = ((dp*e-1)//i)+1 q = n//(((dp*e-1)//i)+1) phi = (q-1)*(p-1) d = gp.invert(e, phi) m = pow(c, d, n)