e = 65537 n = 86934482296048119190666062003494800588905656017203025617216654058378322103517 p = 285960468890451637935629440372639283459 q = 304008741604601924494328155975272418463 phi_n = (p-1) * (q-1)
d = int(gmpy2.invert(e, phi_n)) key = rsa.PrivateKey(n, e, d, p, q)
withopen("flag.enc", 'rb') as obj: print(rsa.decrypt(obj.read(), key))
[AFCTF2018]可怜的RSA
此题也是给出了公钥文件和密文,但需要使用PKCS1_OAEP模式解密。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
from gmpy2 import iroot, next_prime, powmod, invert, gcd from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_OAEP import base64
e = 65537 n = 0x25B18BF5F389097D17237866BB51CFF8DE922453749EBC403B0995C97C0E386D46C161CADFF77C69860DAE4791C214CF8487AAAA9F26E920A977834906038AEFB5C30827DFCF3FC9E9769544F94E07CDFE0872039A3A6262116678B261FB2D6B9D32539E92A153B3675629BAB3942E7D35E30F7EEF5ABF1C50D797D0CC88E1BDCCFD1A12EA6F7EF75C3727DBDF2E780F3428AE8F7A4FB7A89F184A365032B153F8425E845750EB2B7ABC02DC15CE0207507AA950863BB8480A78028DD62979944D6C633FAFA103E4DB28CE87F5A0C6ED4A2F2664427F565C7781AB6191456D971C7FFA395272374CEC0155E5F91189DB742E4C28B03A0FA11CFFB03173D2A4CCE6AE53 p = 3133337 q = 25478326064937419292200172136399497719081842914528228316455906211693118321971399936004729134841162974144246271486439695786036588117424611881955950996219646807378822278285638261582099108339438949573034101215141156156408742843820048066830863814362379885720395082318462850002901605689761876319151147352730090957556940842144299887394678743607766937828094478336401159449035878306853716216548374273462386508307367713112073004011383418967894930554067582453248981022011922883374442736848045920676341361871231787163441467533076890081721882179369168787287724769642665399992556052144845878600126283968890273067575342061776244939 phi = (p-1) *(q-1) d = invert(e, phi)
withopen("D:/share/attachment/flag.enc", 'r') as f: print(key.decrypt(base64.b64decode(f.read().encode())))
[SUCTF2019]SignIn
1 2 3 4 5 6 7 8 9 10 11 12
import gmpy2
e = 65537 n = 103461035900816914121390101299049044413950405173712170434161686539878160984549 p = 282164587459512124844245113950593348271 q = 366669102002966856876605669837014229419 phi_n = (p-1) * (q-1) c = 0xad939ff59f6e70bcbfad406f2494993757eee98b91bc244184a377520d06fc35
d = int(gmpy2.invert(e, phi_n)) m = gmpy2.powmod(c, d, n) print("%x" % int(m))
buuoj Crypto部分
RSA
1 2 3 4 5 6 7 8 9 10
import gmpy2
e = 17 p = 473398607161 q = 4511491 n = p * q phi_n = (p-1) * (q-1)
d = int(gmpy2.invert(e, phi_n)) print(d)
rsarsa
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
import gmpy2 e = 65537 p = 9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483 q = 11874843837980297032092405848653656852760910154543380907650040190704283358909208578251063047732443992230647903887510065547947313543299303261986053486569407 n = p*q #密文 c = 83208298995174604174773590298203639360540024871256126892889661345742403314929861939100492666605647316646576486526217457006376842280869728581726746401583705899941768214138742259689334840735633553053887641847651173776251820293087212885670180367406807406765923638973161375817392737747832762751690104423869019034
d = 56632047571190660567520341028861194862411428416862507034762587229995138605649836960220619903456392752115943299335385163216233744624623848874235303309636393446736347238627793022725260986466957974753004129210680401432377444984195145009801967391196615524488853620232925992387563270746297909112117451398527453977
#求明文 m = gmpy2.powmod(c,d,n) print(m)
RSA1
此题属于已知p,q,dp,dq,c求明文
1 2 3 4 5 6 7 8 9 10 11 12 13
import gmpy2
p = 8637633767257008567099653486541091171320491509433615447539162437911244175885667806398411790524083553445158113502227745206205327690939504032994699902053229 q = 12640674973996472769176047937170883420927050821480010581593137135372473880595613737337630629752577346147039284030082593490776630572584959954205336880228469 dp = 6500795702216834621109042351193261530650043841056252930930949663358625016881832840728066026150264693076109354874099841380454881716097778307268116910582929 dq = 783472263673553449019532580386470672380574033551303889137911760438881683674556098098256795673512201963002175438762767516968043599582527539160811120550041 c = 24722305403887382073567316467649080662631552905960229399079107995602154418176056335800638887527614164073530437657085079676157350205351945222989351316076486573599576041978339872265925062764318536089007310270278526159678937431903862892400747915525118983959970607934142974736675784325993445942031372107342103852
e = 65537 n = 248254007851526241177721526698901802985832766176221609612258877371620580060433101538328030305219918697643619814200930679612109885533801335348445023751670478437073055544724280684733298051599167660303645183146161497485358633681492129668802402065797789905550489547645118787266601929429724133167768465309665906113 dp = 905074498052346904643025132879518330691925174573054004621877253318682675055421970943552016695528560364834446303196939207056642927148093290374440210503657
c = 140423670976252696807533673586209400575664282100684119784203527124521188996403826597436883766041879067494280957410201958935737360380801845453829293997433414188838725751796261702622028587211560353362847191060306578510511380965162133472698713063592621028959167072781482562673683090590521214218071160287665180751
p = 0 for k inrange(1,e): if (e*dp - 1) % k == 0: _p = (e*dp - 1) // k + 1 if n % _p == 0: p = _p break
q = n // p phi_n = (p-1) * (q-1) d = gmpy2.invert(e, phi_n) m = gmpy2.powmod(c, d, n) print("%x" % m)
import hashlib import gmpy2 from Crypto.PublicKey import RSA import ContinuedFractions, Arithmetic from Crypto.Util.number import long_to_bytes
n = 101991809777553253470276751399264740131157682329252673501792154507006158434432009141995367241962525705950046253400188884658262496534706438791515071885860897552736656899566915731297225817250639873643376310103992170646906557242832893914902053581087502512787303322747780420210884852166586717636559058152544979471 e = 46731919563265721307105180410302518676676135509737992912625092976849075262192092549323082367518264378630543338219025744820916471913696072050291990620486581719410354385121760761374229374847695148230596005409978383369740305816082770283909611956355972181848077519920922059268376958811713365106925235218265173085
defwiener_hack(e, n): # firstly git clone https://github.com/pablocelayes/rsa-wiener-attack.git ! frac = ContinuedFractions.rational_to_contfrac(e, n) convergents = ContinuedFractions.convergents_from_contfrac(frac) for (k, d) in convergents: if k != 0and (e * d - 1) % k == 0: phi = (e * d - 1) // k s = n - phi + 1 discr = s * s - 4 * n if (discr >= 0): t = Arithmetic.is_perfect_square(discr) if t != -1and (s + t) % 2 == 0: print("Hacked!") return d returnFalse
n = 0x52d483c27cd806550fbe0e37a61af2e7cf5e0efb723dfc81174c918a27627779b21fa3c851e9e94188eaee3d5cd6f752406a43fbecb53e80836ff1e185d3ccd7782ea846c2e91a7b0808986666e0bdadbfb7bdd65670a589a4d2478e9adcafe97c6ee23614bcb2ecc23580f4d2e3cc1ecfec25c50da4bc754dde6c8bfd8d1fc16956c74d8e9196046a01dc9f3024e11461c294f29d7421140732fedacac97b8fe50999117d27943c953f18c4ff4f8c258d839764078d4b6ef6e8591e0ff5563b31a39e6374d0d41c8c46921c25e5904a817ef8e39e5c9b71225a83269693e0b7e3218fc5e5a1e8412ba16e588b3d6ac536dce39fcdfce81eec79979ea6872793 e = 3 c = 0x10652cdfaa6b63f6d7bd1109da08181e500e5643f5b240a9024bfa84d5f2cac9310562978347bb232d63e7289283871efab83d84ff5a7b64a94a79d34cfbd4ef121723ba1f663e514f83f6f01492b4e13e1bb4296d96ea5a353d3bf2edd2f449c03c4a3e995237985a596908adc741f32365 k = 0 whileTrue: res = gmpy2.iroot(c + k*n, e) k += 1 if res[1]: m = res[0] print("%x" % m) break
if s1<0: s1 = - s1 for i inrange(len(cL1)): cL1[i] = gmpy2.invert(cL1[i], n) m = gmpy2.powmod(cL1[i],s1,n) * gmpy2.powmod(cL2[i],s2,n) % n res += long_to_bytes(m) if s2<0: s2 = - s2 for i inrange(len(cL1)): cL2[i] = gmpy2.invert(cL2[i], n) m = gmpy2.powmod(cL1[i],s1,n) * gmpy2.powmod(cL2[i],s2,n) % n res += long_to_bytes(m)
withopen("D:/share/res.txt", 'wb') as f: f.write(res)
再利用base64隐写解密。
[HDCTF2019]bbbbbbrsa
此题需要爆破e,得出的结果需要转成byte进行分析。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
import gmpy2
p = 177077389675257695042507998165006460849 n = 37421829509887796274897162249367329400988647145613325367337968063341372726061 c = 2373740699529364991763589324200093466206785561836101840381622237225512234632
q = n //p phi_n = (p-1) * (q-1)
withopen("D:/share/res.txt", 'w') as f: for e inrange(50000,70000): if gmpy2.gcd(e, phi_n) == 1: d = gmpy2.invert(e, phi_n) text = int.to_bytes(int(gmpy2.powmod(c, d, n)), byteorder='big', length=64) ifb'flag'in text: print(text)
p = 842868045681390934539739959201847552284980179958879667933078453950968566151662147267006293571765463137270594151138695778986165111380428806545593588078365331313084230014618714412959584843421586674162688321942889369912392031882620994944241987153078156389470370195514285850736541078623854327959382156753458569 q = 139916095583110895133596833227506693679306709873174024876891023355860781981175916446323044732913066880786918629089023499311703408489151181886568535621008644997971982182426706592551291084007983387911006261442519635405457077292515085160744169867410973960652081452455371451222265819051559818441257438021073941183 n = p * q c = 41971850275428383625653350824107291609587853887037624239544762751558838294718672159979929266922528917912189124713273673948051464226519605803745171340724343705832198554680196798623263806617998072496026019940476324971696928551159371970207365741517064295956376809297272541800647747885170905737868568000101029143923792003486793278197051326716680212726111099439262589341050943913401067673851885114314709706016622157285023272496793595281054074260451116213815934843317894898883215362289599366101018081513215120728297131352439066930452281829446586562062242527329672575620261776042653626411730955819001674118193293313612128 phi_n = (p-1) * (q-1)
for e inrange(65537, 2, -1): if gmpy2.is_prime(e): if gmpy2.gcd(e, phi_n) == 1: try: d = gmpy2.invert(e, phi_n) except Exception as e: print(e) continue m = gmpy2.powmod(c, d, n) print(m)
from gmpy2 import iroot, next_prime, powmod, invert, gcd from Crypto.Util.number import long_to_bytes, sieve_base as primes
n = 32849718197337581823002243717057659218502519004386996660885100592872201948834155543125924395614928962750579667346279456710633774501407292473006312537723894221717638059058796679686953564471994009285384798450493756900459225040360430847240975678450171551048783818642467506711424027848778367427338647282428667393241157151675410661015044633282064056800913282016363415202171926089293431012379261585078566301060173689328363696699811123592090204578098276704877408688525618732848817623879899628629300385790344366046641825507767709276622692835393219811283244303899850483748651722336996164724553364097066493953127153066970594638491950199605713033004684970381605908909693802373826516622872100822213645899846325022476318425889580091613323747640467299866189070780620292627043349618839126919699862580579994887507733838561768581933029077488033326056066378869170169389819542928899483936705521710423905128732013121538495096959944889076705471928490092476616709838980562233255542325528398956185421193665359897664110835645928646616337700617883946369110702443135980068553511927115723157704586595844927607636003501038871748639417378062348085980873502535098755568810971926925447913858894180171498580131088992227637341857123607600275137768132347158657063692388249513 c = 26308018356739853895382240109968894175166731283702927002165268998773708335216338997058314157717147131083296551313334042509806229853341488461087009955203854253313827608275460592785607739091992591431080342664081962030557042784864074533380701014585315663218783130162376176094773010478159362434331787279303302718098735574605469803801873109982473258207444342330633191849040553550708886593340770753064322410889048135425025715982196600650740987076486540674090923181664281515197679745907830107684777248532278645343716263686014941081417914622724906314960249945105011301731247324601620886782967217339340393853616450077105125391982689986178342417223392217085276465471102737594719932347242482670320801063191869471318313514407997326350065187904154229557706351355052446027159972546737213451422978211055778164578782156428466626894026103053360431281644645515155471301826844754338802352846095293421718249819728205538534652212984831283642472071669494851823123552827380737798609829706225744376667082534026874483482483127491533474306552210039386256062116345785870668331513725792053302188276682550672663353937781055621860101624242216671635824311412793495965628876036344731733142759495348248970313655381407241457118743532311394697763283681852908564387282605279108 e = 0x10001
prd = 1 for i in primes: prd *= i #p为(2^prd-1)和n的公约数 p = gcd(powmod(2,prd,n)-1,n) q = n // p phi = (p-1) * (q-1) d = invert(e, phi)
from gmpy2 import iroot, next_prime, powmod, invert, gcd from sympy import nextprime, prevprime from Crypto.Util.number import long_to_bytes
d = 19275778946037899718035455438175509175723911466127462154506916564101519923603308900331427601983476886255849200332374081996442976307058597390881168155862238533018621944733299208108185814179466844504468163200369996564265921022888670062554504758512453217434777820468049494313818291727050400752551716550403647148197148884408264686846693842118387217753516963449753809860354047619256787869400297858568139700396567519469825398575103885487624463424429913017729585620877168171603444111464692841379661112075123399343270610272287865200880398193573260848268633461983435015031227070217852728240847398084414687146397303110709214913 c = 5382723168073828110696168558294206681757991149022777821127563301413483223874527233300721180839298617076705685041174247415826157096583055069337393987892262764211225227035880754417457056723909135525244957935906902665679777101130111392780237502928656225705262431431953003520093932924375902111280077255205118217436744112064069429678632923259898627997145803892753989255615273140300021040654505901442787810653626524305706316663169341797205752938755590056568986738227803487467274114398257187962140796551136220532809687606867385639367743705527511680719955380746377631156468689844150878381460560990755652899449340045313521804 e = 0x10001
ed = e*d - 1 for k inrange(2**15, 2**16): if ed % k == 0: phi = ed // k mid = iroot(phi, 2)[0] q = nextprime(mid) p = prevprime(mid) if (p-1) * (q-1) == phi: n = p * q m = powmod(c, d, n) print(long_to_bytes(m)) break
from gmpy2 import iroot, next_prime, powmod, invert, gcd from Crypto.Util.number import long_to_bytes
e = 65537 c = 7922547866857761459807491502654216283012776177789511549350672958101810281348402284098310147796549430689253803510994877420135537268549410652654479620858691324110367182025648788407041599943091386227543182157746202947099572389676084392706406084307657000104665696654409155006313203957292885743791715198781974205578654792123191584957665293208390453748369182333152809882312453359706147808198922916762773721726681588977103877454119043744889164529383188077499194932909643918696646876907327364751380953182517883134591810800848971719184808713694342985458103006676013451912221080252735948993692674899399826084848622145815461035 z = 32115748677623209667471622872185275070257924766015020072805267359839059393284316595882933372289732127274076434587519333300142473010344694803885168557548801202495933226215437763329280242113556524498457559562872900811602056944423967403777623306961880757613246328729616643032628964072931272085866928045973799374711846825157781056965164178505232524245809179235607571567174228822561697888645968559343608375331988097157145264357626738141646556353500994924115875748198318036296898604097000938272195903056733565880150540275369239637793975923329598716003350308259321436752579291000355560431542229699759955141152914708362494482 n = 15310745161336895413406690009324766200789179248896951942047235448901612351128459309145825547569298479821101249094161867207686537607047447968708758990950136380924747359052570549594098569970632854351825950729752563502284849263730127586382522703959893392329333760927637353052250274195821469023401443841395096410231843592101426591882573405934188675124326997277775238287928403743324297705151732524641213516306585297722190780088180705070359469719869343939106529204798285957516860774384001892777525916167743272419958572055332232056095979448155082465977781482598371994798871917514767508394730447974770329967681767625495394441
import gmpy2 import sympy import random from Crypto.Util.number import long_to_bytes, bytes_to_long
e = 65537 P_n = 14057332139537395701238463644827948204030576528558543283405966933509944444681257521108769303999679955371474546213196051386802936343092965202519504111238572269823072199039812208100301939365080328518578704076769147484922508482686658959347725753762078590928561862163337382463252361958145933210306431342748775024336556028267742021320891681762543660468484018686865891073110757394154024833552558863671537491089957038648328973790692356014778420333896705595252711514117478072828880198506187667924020260600124717243067420876363980538994101929437978668709128652587073901337310278665778299513763593234951137512120572797739181693 P_F_n = 14057332139537395701238463644827948204030576528558543283405966933509944444681257521108769303999679955371474546213196051386802936343092965202519504111238572269823072199039812208100301939365080328518578704076769147484922508482686658959347725753762078590928561862163337382463252361958145933210306431342748775024099427363967321110127562039879018616082926935567951378185280882426903064598376668106616694623540074057210432790309571018778281723710994930151635857933293394780142192586806292968028305922173313521186946635709194350912242693822450297748434301924950358561859804256788098033426537956252964976682327991427626735740 Q_n = 20714298338160449749545360743688018842877274054540852096459485283936802341271363766157976112525034004319938054034934880860956966585051684483662535780621673316774842614701726445870630109196016676725183412879870463432277629916669130494040403733295593655306104176367902352484367520262917943100467697540593925707162162616635533550262718808746254599456286578409187895171015796991910123804529825519519278388910483133813330902530160448972926096083990208243274548561238253002789474920730760001104048093295680593033327818821255300893423412192265814418546134015557579236219461780344469127987669565138930308525189944897421753947 Q_E_D = 100772079222298134586116156850742817855408127716962891929259868746672572602333918958075582671752493618259518286336122772703330183037221105058298653490794337885098499073583821832532798309513538383175233429533467348390389323225198805294950484802068148590902907221150968539067980432831310376368202773212266320112670699737501054831646286585142281419237572222713975646843555024731855688573834108711874406149540078253774349708158063055754932812675786123700768288048445326199880983717504538825498103789304873682191053050366806825802602658674268440844577955499368404019114913934477160428428662847012289516655310680119638600315228284298935201 c = 40855937355228438525361161524441274634175356845950884889338630813182607485910094677909779126550263304194796000904384775495000943424070396334435810126536165332565417336797036611773382728344687175253081047586602838685027428292621557914514629024324794275772522013126464926990620140406412999485728750385876868115091735425577555027394033416643032644774339644654011686716639760512353355719065795222201167219831780961308225780478482467294410828543488412258764446494815238766185728454416691898859462532083437213793104823759147317613637881419787581920745151430394526712790608442960106537539121880514269830696341737507717448946962021
defgetP(n, phi): p_add_q = n - phi + 1 p_sub_q = gmpy2.iroot(p_add_q**2 - 4*n, 2)[0] p = (p_add_q + p_sub_q) // 2 q = (p_add_q - p_sub_q) // 2 if p > q: tmp = p p = q q = tmp factor2 = 2021 * p + 2020 * q if factor2 < 0: factor2 = (-1) * factor2 return sympy.nextprime(factor2)
defdivide_pq(ed, n): k = ed - 1 whileTrue: g = random.randint(2, n-1) t = k whileTrue: if t % 2 != 0: break t //= 2 x = pow(g, t, n) if x > 1and gmpy2.gcd(x-1, n) > 1: p = gmpy2.gcd(x-1, n) q = n // p return p, q
defgetQ(n, ed): p, q = divide_pq(ed, n) if p > q: tmp = p p = q q = tmp factor2 = 2021 * p - 2020 * q if factor2 < 0: factor2 = (-1) * factor2 return sympy.nextprime(factor2)
p = getP(P_n, P_F_n) q = getQ(Q_n, Q_E_D) print(p, q) n = p * q phi = (p-1) * (q-1) d = gmpy2.invert(e, phi) m = gmpy2.powmod(c, d, n) print(long_to_bytes(m))
defgetP(P_p, e, factor): P = [0for i inrange(17)] P[9] = P_p for i inrange(9,0,-1): P[i-1]=sympy.prevprime(P[i]) for i inrange(9,16): P[i+1]=sympy.nextprime(P[i]) n = 1 phi = 1 for f in P: n *= f phi *= (f - 1) d = gmpy2.invert(e, phi) m = gmpy2.powmod(factor, d, n) return sympy.nextprime(m)
p = getP(P_p, e, P_factor) q = getQ(Q_1, Q_2, sub_Q) n = p * q phi = (p-1) * (q-1) d = gmpy2.invert(e, phi) m = gmpy2.powmod(Ciphertext, d, n) print(long_to_bytes(m))
import gmpy2 from Crypto.Util.number import long_to_bytes, bytes_to_long
e = 54722 n = 17083941230213489700426636484487738282426471494607098847295335339638177583685457921198569105417734668692072727759139358207667248703952436680183153327606147421932365889983347282046439156176685765143620637107347870401946946501620531665573668068349080410807996582297505889946205052879002028936125315312256470583622913646319779125559691270916064588684997382451412747432722966919513413709987353038375477178385125453567111965259721484997156799355617642131569095810304077131053588483057244340742751804935494087687363416921314041547093118565767609667033859583125275322077617576783247853718516166743858265291135353895239981121 gift = 2135492653776686212553329560560967285303308936825887355911916917454772197960682240149821138177216833586509090969892419775958406087994054585022894165950768427741545736247918410255804894522085720642952579638418483800243368312702566458196708508543635051350999572787188236243275631609875253617015664414032058822919469443284453403064076232765024248435543326597418851751586308514540124571309152787559712950209357825576896132278045112177910266019741013995106579484868768251084453338417115483515132869594712162052362083414163954681306259137057581036657441897428432575924018950961141822554251369262248368899977337886190114104 c = 3738960639194737957667684143565005503596276451617922474669745529299929395507971435311181578387223323429323286927370576955078618335757508161263585164126047545413028829873269342924092339298957635079736446851837414357757312525158356579607212496060244403765822636515347192211817658170822313646743520831977673861869637519843133863288550058359429455052676323196728280408508614527953057214779165450356577820378810467527006377296194102671360302059901897977339728292345132827184227155061326328585640019916328847372295754472832318258636054663091475801235050657401857262960415898483713074139212596685365780269667500271108538319
e = e // 2 for k inrange(2, 10000): print(k, end='\r') phi = gift * k try: d = gmpy2.invert(e, phi) m = gmpy2.powmod(c, d, n) m = gmpy2.iroot(m, 2)[0] flag = long_to_bytes(m) ifb"{"in flag: print(flag) break except: pass