由于后面的知识盲点太多了,就从头开始把之前不会的再做一遍。
1.RSA5
一大串数据,20次加密过程中的m、e相同。我以为是广播攻击,想着用剩余定理来解,自己编的脚本差劲,就用了书上的脚本。解出个’\x01‘。回头再看一下广播攻击的前提,加密指数e较低!!!e = 65537应该算大吧。于是只能将这20个n进行分解,在n5的时候解出了p、q。
import libnum,gmpy2
n = 22822039733049388110936778173014765663663303811791283234361230649775805923902173438553927805407463106104699773994158375704033093471761387799852168337898526980521753614307899669015931387819927421875316304591521901592823814417756447695701045846773508629371397013053684553042185725059996791532391626429712416994990889693732805181947970071429309599614973772736556299404246424791660679253884940021728846906344198854779191951739719342908761330661910477119933428550774242910420952496929605686154799487839923424336353747442153571678064520763149793294360787821751703543288696726923909670396821551053048035619499706391118145067
c = 15406498580761780108625891878008526815145372096234083936681442225155097299264808624358826686906535594853622687379268969468433072388149786607395396424104318820879443743112358706546753935215756078345959375299650718555759698887852318017597503074317356745122514481807843745626429797861463012940172797612589031686718185390345389295851075279278516147076602270178540690147808314172798987497259330037810328523464851895621851859027823681655934104713689539848047163088666896473665500158179046196538210778897730209572708430067658411755959866033531700460551556380993982706171848970460224304996455600503982223448904878212849412357
p = 132585806383798600305426957307612567604223562626764190211333136246643723811046149337852966828729052476725552361132437370521548707664977123165279305052971868012755509160408641100548744046621516877981864180076497524093201404558036301820216274968638825245150755772559259575544101918590311068466601618472464832499
q = 172130338499326278748088659642118539903263306644625489813269854049704514120598134934786316771912260248369075948864036229605563950070491992643125838594149381631362120542615545158696925360916086470107987771246645459433841320759048661246016875180635458357799131806734777129141845728102816378815607663660131827433
e = 65537
phi = (p-1)*(q-1)
d = int(gmpy2.invert(e,phi))
m = pow(c,d,n)
print(libnum.n2s(m))
2.rsa2
提示hash前要encode,于是
flag = “flag{” + hashlib.md5(hex(d).encode()).hexdigest() + “}”
print(flag)#flag{8159e6c4abdd3b94ce461ed9a1a24017}
可还是错的。
后面看了一下大佬的,才知道这个程序在python2中才能运行成功。我之前还以为是我不会md5和hash(确实不会)。后面按照大佬的指示,用网站的python2运行才算出结果。
菜鸟工具 python
import gmpy2,libnum
import hashlibN = 101991809777553253470276751399264740131157682329252673501792154507006158434432009141995367241962525705950046253400188884658262496534706438791515071885860897552736656899566915731297225817250639873643376310103992170646906557242832893914902053581087502512787303322747780420210884852166586717636559058152544979471
q = 9046853915223503351787031888977627106934564043204783593118678181991596316582877057556463152579621699010610569526573031954779520781448550677767565207407183
p = 11273732364123571293429600400343309403733952146912318879993851141423284675797325272321856863528776914709992821287788339848962916204774010644058033316303937
e = 46731919563265721307105180410302518676676135509737992912625092976849075262192092549323082367518264378630543338219025744820916471913696072050291990620486581719410354385121760761374229374847695148230596005409978383369740305816082770283909611956355972181848077519920922059268376958811713365106925235218265173085
#e很大
phi = (p-1)*(q-1)
d = int(gmpy2.invert(e,phi))
#flag = "flag{" + hashlib.md5(hex(d)).hexdigest() + "}"
#
print(flag)
3.[HDCTF2019]bbbbbbrsa
代码中写的是对c进行base32编码,但是用base32解码不对,使用base64解码。根据代码推测e是要进行爆破的(50000<e<70000)。用try except来处理e模phi没有逆元的情况。
import base64,gmpy2,libnum,sympy
from Crypto.Util.number import long_to_bytes
from binascii import a2b_hex,b2a_hex
p = 177077389675257695042507998165006460849
n = 37421829509887796274897162249367329400988647145613325367337968063341372726061
c = '==gMzYDNzIjMxUTNyIzNzIjMyYTM4MDM0gTMwEjNzgTM2UTN4cjNwIjN2QzM5ADMwIDNyMTO4UzM2cTM5kDN2MTOyUTO5YDM0czM3MjM'
q = n//p
Cipher = c[::-1]
c = int(base64.b64decode(Cipher))
#print(c)
phi = (p-1)*(q-1)
e = 50001
''' while e<70000:if gmpy2.gcd(e,phi) == 1:try:d = int(gmpy2.invert(e,phi))m = pow(c,d,n)m = str(long_to_bytes(m))if 'CTF' in m or 'flag' in m:print(m)except:passe = sympy.nextprime(e)'''
for e in range (50000,70000):if gmpy2.gcd (e,phi) == 1:try:d = gmpy2.invert (e,phi)m = pow (c,d,n)m = str(long_to_bytes(m))if 'CTF' in m or 'flag' in m:print(m)except:pass
4.[ACTF新生赛2020]crypto-rsa0
import gmpy2,sympy
from Crypto.Util.number import long_to_bytesp = 9018588066434206377240277162476739271386240173088676526295315163990968347022922841299128274551482926490908399237153883494964743436193853978459947060210411
q = 7547005673877738257835729760037765213340036696350766324229143613179932145122130685778504062410137043635958208805698698169847293520149572605026492751740223
c = 50996206925961019415256003394743594106061473865032792073035954925875056079762626648452348856255575840166640519334862690063949316515750256545937498213476286637455803452890781264446030732369871044870359838568618176586206041055000297981733272816089806014400846392307742065559331874972274844992047849472203390350
n = p*q
phi = (p-1)*(q-1)for e in range(2,100000):if sympy.isprime(e) == True:if gmpy2.gcd(e,phi) == 1:try:d = int(gmpy2.invert(e,phi))m = pow(c,d,n)flag = str(long_to_bytes(m))if 'CTF' in flag or 'flag' in flag or 'ctf' in flag:print('e = ',e)print(flag) except:pass
5.[GWCTF 2019]BabyRSA
原来是我想的不仔细。根据原代码,我们可以知道p<q,c2<N,又因为c1 = F1 + F2,c2 = pow(F1, 3) + pow(F2, 3),可以知道c1<c2<N,而且c2 =(F1+F2) * (F12 - F1 * F2 + F22) = (F1+F2)((F1+F2)2 - 3 * F1 * F2),从而推出F1 * F2。知道了F1 + F2和F1 * F2,我们就可以构造方程 x2 -(F1+F2)*x+F1 * F2 = 0,解出F1 ,F2。
import gmpy2
from Crypto.Util.number import long_to_bytesN = 636585149594574746909030160182690866222909256464847291783000651837227921337237899651287943597773270944384034858925295744880727101606841413640006527614873110651410155893776548737823152943797884729130149758279127430044739254000426610922834573094957082589539445610828279428814524313491262061930512829074466232633130599104490893572093943832740301809630847541592548921200288222432789208650949937638303429456468889100192613859073752923812454212239908948930178355331390933536771065791817643978763045030833712326162883810638120029378337092938662174119747687899484603628344079493556601422498405360731958162719296160584042671057160241284852522913676264596201906163
m1 = 90009974341452243216986938028371257528604943208941176518717463554774967878152694586469377765296113165659498726012712288670458884373971419842750929287658640266219686646956929872115782173093979742958745121671928568709468526098715927189829600497283118051641107305128852697032053368115181216069626606165503465125725204875578701237789292966211824002761481815276666236869005129138862782476859103086726091860497614883282949955023222414333243193268564781621699870412557822404381213804026685831221430728290755597819259339616650158674713248841654338515199405532003173732520457813901170264713085107077001478083341339002069870585378257051150217511755761491021553239
m2 = 487443985757405173426628188375657117604235507936967522993257972108872283698305238454465723214226871414276788912058186197039821242912736742824080627680971802511206914394672159240206910735850651999316100014691067295708138639363203596244693995562780286637116394738250774129759021080197323724805414668042318806010652814405078769738548913675466181551005527065309515364950610137206393257148357659666687091662749848560225453826362271704292692847596339533229088038820532086109421158575841077601268713175097874083536249006018948789413238783922845633494023608865256071962856581229890043896939025613600564283391329331452199062858930374565991634191495137939574539546
e = int('0x10001',16)
p = 797862863902421984951231350430312260517773269684958456342860983236184129602390919026048496119757187702076499551310794177917920137646835888862706126924088411570997141257159563952725882214181185531209186972351469946269508511312863779123205322378452194261217016552527754513215520329499967108196968833163329724620251096080377747699
q = 797862863902421984951231350430312260517773269684958456342860983236184129602390919026048496119757187702076499551310794177917920137646835888862706126924088411570997141257159563952725882214181185531209186972351469946269508511312863779123205322378452194261217016552527754513215520329499967108196968833163329724620251096080377748737
phi = (p-1)*(q-1)
d = int(gmpy2.invert(e,phi))
c1 = pow(m1,d,N)# 这里的c1 = (F1 + F2)%N = F1 + F2
c2 = pow(m2,d,N)# c2 = pow(F1, 3) + pow(F2, 3) < N
#c2 = F1**3+F2**3 = (F1+F2)*(F1**2-F1*F2+F2**2) = c1*((F1+F2)**2-3*F1*F2) = c1*(c1**2-3*F1*F2)
#==>F1*F2 = (c1**2-c2//c1)//3
F1F2 = (c1**2-c2//c1)//3
#构造方程x**2-(F1+F2)*x+F1*F2 = 0
pd = int(gmpy2.iroot(c1**2-4*F1F2,2)[0])
F1 = (c1+pd)//2
F2 = (c1-pd)//2
flag1 = long_to_bytes(F1)
flag2 = long_to_bytes(F2)
print(flag1,'\n',flag2)