c1= 463634070971821449698012827631572665302589213868521491855038966879005784397309389922926838028598122795187584361359142761652619958273094398420314927073008031088375892957173280915904309949716842152249806486027920136603248454946737961650252641668562626310035983343018705370077783879047584582817271215517599531278507300104564011142229942160380563527291388260832749808727470291331902902518196932928128107067117198707209620169906575791373793854773799564060536121390593687449884988936522369331738199522700261116496965863870682295858957952661531894477603953742494526632841396338388879198270913523572980574440793543571757278020533565628285714358815083303489096524318164071888139412436112963845619981511061231001617406815056986634680975142352197476024575809514978857034477688443230263761729039797859697947454810551009108031457294164840611157524719173343259485881089252938664456637673337362424443150013961181619441267926981848009107466576314685961478748352388452114042115892243272514245081604607798243817586737546663059737344687130881861357423084448027959893402445303299089606081931041217035955143939567456782107203447898345284731038150377722447329202078375870541529539840051415759436083384408203659613313535094343772238691393447475364806171594 c2= 130959534275704453216282334815034647265875632781798750901627773826812657339274362406246297925411291822193191483409847323315110393729020700526946712786793380991675008128561863631081095222226285788412970362518398757423705216112313533155390315204875516645459370629706277876211656753247984282379731850770447978537855070379324935282789327428625259945250066774049650951465043700088958965762054418615838049340724639373351248933494355591934236360506778496741051064156771092798005112534162050165095430065000827916096893408569751085550379620558282942254606978819033885539221416335848319082054806148859427713144286777516251724474319613960327799643723278205969253636514684757409059003348229151341200451785288395596484563480261212963114071064979559812327582474674812225260616757099890896900340007990585501470484762752362734968297532533654846190900571017635959385883945858334995884341767905619567505341752047589731815868489295690574109758825021386698440670611361127170896689015108432408490763723594673299472336065575301681055583084547847733168801030191262122130369687497236959760366874106043801542493392227424890925595734150487586757484304609945827925762382889592743709682485229267604771944535469557860120878491329984792448597107256325783346904408 n= 609305637099654478882754880905638123124918364116173050874864700996165096776233155524277418132679727857702738043786588380577485490575591029930152718828075976000078971987922107645530323356525126496562423491563365836491753476840795804040219013880969539154444387313029522565456897962200817021423704204077133003361140660038327458057898764857872645377236870759691588009666047187685654297678987435769051762120388537868493789773766688347724903911796741124237476823452505450704989455260077833828660552130714794889208291939055406292476845194489525212129635173284301782141617878483740788532998492403101324795726865866661786740345862631916793208037250277376942046905892342213663197755010315060990871143919384283302925469309777769989798197913048813940747488087191697903624669415774198027063997058701217124640082074789591591494106726857376728759663074734040755438623372683762856958888826373151815914621262862750497078245369680378038995425628467728412953392359090775734440671874387905724083226246587924716226512631671786591611586774947156657178654343092123117255372954798131265566301316033414311712092913492774989048057650627801991277862963173961355088082419091848569675686058581383542877982979697235829206442087786927939745804017455244315305118437 e1=[3,7,3*3,3*7,7*7,7*7*3,7*7*7,7*7*7*3,7*7*3*3,3*3*7] for i in e1: e2=3087//i s,s1,s2=gmpy2.gcdext(i,e2) m = pow(c1,s1,n) * pow(c2,s2,n) % n
c1= 463634070971821449698012827631572665302589213868521491855038966879005784397309389922926838028598122795187584361359142761652619958273094398420314927073008031088375892957173280915904309949716842152249806486027920136603248454946737961650252641668562626310035983343018705370077783879047584582817271215517599531278507300104564011142229942160380563527291388260832749808727470291331902902518196932928128107067117198707209620169906575791373793854773799564060536121390593687449884988936522369331738199522700261116496965863870682295858957952661531894477603953742494526632841396338388879198270913523572980574440793543571757278020533565628285714358815083303489096524318164071888139412436112963845619981511061231001617406815056986634680975142352197476024575809514978857034477688443230263761729039797859697947454810551009108031457294164840611157524719173343259485881089252938664456637673337362424443150013961181619441267926981848009107466576314685961478748352388452114042115892243272514245081604607798243817586737546663059737344687130881861357423084448027959893402445303299089606081931041217035955143939567456782107203447898345284731038150377722447329202078375870541529539840051415759436083384408203659613313535094343772238691393447475364806171594 c2= 130959534275704453216282334815034647265875632781798750901627773826812657339274362406246297925411291822193191483409847323315110393729020700526946712786793380991675008128561863631081095222226285788412970362518398757423705216112313533155390315204875516645459370629706277876211656753247984282379731850770447978537855070379324935282789327428625259945250066774049650951465043700088958965762054418615838049340724639373351248933494355591934236360506778496741051064156771092798005112534162050165095430065000827916096893408569751085550379620558282942254606978819033885539221416335848319082054806148859427713144286777516251724474319613960327799643723278205969253636514684757409059003348229151341200451785288395596484563480261212963114071064979559812327582474674812225260616757099890896900340007990585501470484762752362734968297532533654846190900571017635959385883945858334995884341767905619567505341752047589731815868489295690574109758825021386698440670611361127170896689015108432408490763723594673299472336065575301681055583084547847733168801030191262122130369687497236959760366874106043801542493392227424890925595734150487586757484304609945827925762382889592743709682485229267604771944535469557860120878491329984792448597107256325783346904408 n= 609305637099654478882754880905638123124918364116173050874864700996165096776233155524277418132679727857702738043786588380577485490575591029930152718828075976000078971987922107645530323356525126496562423491563365836491753476840795804040219013880969539154444387313029522565456897962200817021423704204077133003361140660038327458057898764857872645377236870759691588009666047187685654297678987435769051762120388537868493789773766688347724903911796741124237476823452505450704989455260077833828660552130714794889208291939055406292476845194489525212129635173284301782141617878483740788532998492403101324795726865866661786740345862631916793208037250277376942046905892342213663197755010315060990871143919384283302925469309777769989798197913048813940747488087191697903624669415774198027063997058701217124640082074789591591494106726857376728759663074734040755438623372683762856958888826373151815914621262862750497078245369680378038995425628467728412953392359090775734440671874387905724083226246587924716226512631671786591611586774947156657178654343092123117255372954798131265566301316033414311712092913492774989048057650627801991277862963173961355088082419091848569675686058581383542877982979697235829206442087786927939745804017455244315305118437 e1=[3,7,3*3,3*7,7*7,7*7*3,7*7*7,7*7*7*3,7*7*3*3,3*3*7] for i in e1: e2=3087//i s,s1,s2=gmpy2.gcdext(i,e2) ms = pow(c1,s1,n) * pow(c2,s2,n) % n m = gmpy2.iroot(ms,s) if m[1]: print(long_to_bytes(m[0]))
[RoarCTF 2019]RSA
1 2 3 4 5 6
A=(((y%x)**5)%(x%y))**2019+y**316+(y+1)/x p=next_prime(z*x*y) q=next_prime(z) A = 2683349182678714524247469512793476009861014781004924905484127480308161377768192868061561886577048646432382128960881487463427414176114486885830693959404989743229103516924432512724195654425703453612710310587164417035878308390676612592848750287387318129424195208623440294647817367740878211949147526287091298307480502897462279102572556822231669438279317474828479089719046386411971105448723910594710418093977044179949800373224354729179833393219827789389078869290217569511230868967647963089430594258815146362187250855166897553056073744582946148472068334167445499314471518357535261186318756327890016183228412253724 n = 117930806043507374325982291823027285148807239117987369609583515353889814856088099671454394340816761242974462268435911765045576377767711593100416932019831889059333166946263184861287975722954992219766493089630810876984781113645362450398009234556085330943125568377741065242183073882558834603430862598066786475299918395341014877416901185392905676043795425126968745185649565106322336954427505104906770493155723995382318346714944184577894150229037758434597242564815299174950147754426950251419204917376517360505024549691723683358170823416757973059354784142601436519500811159036795034676360028928301979780528294114933347127 c = 41971850275428383625653350824107291609587853887037624239544762751558838294718672159979929266922528917912189124713273673948051464226519605803745171340724343705832198554680196798623263806617998072496026019940476324971696928551159371970207365741517064295956376809297272541800647747885170905737868568000101029143923792003486793278197051326716680212726111099439262589341050943913401067673851885114314709706016622157285023272496793595281054074260451116213815934843317894898883215362289599366101018081513215120728297131352439066930452281829446586562062242527329672575620261776042653626411730955819001674118193293313612128
A=2683349182678714524247469512793476009861014781004924905484127480308161377768192868061561886577048646432382128960881487463427414176114486885830693959404989743229103516924432512724195654425703453612710310587164417035878308390676612592848750287387318129424195208623440294647817367740878211949147526287091298307480502897462279102572556822231669438279317474828479089719046386411971105448723910594710418093977044179949800373224354729179833393219827789389078869290217569511230868967647963089430594258815146362187250855166897553056073744582946148472068334167445499314471518357535261186318756327890016183228412253724 for x inrange(2,100): for y inrange(2,100): try: if A==(((y%x)**5)%(x%y))**2019+y**316+(y+1)//x: print('x=',x)#2 print('y=',y)#83 break except: pass
from Crypto.Util.number import * import gmpy2 import sympy
A=2683349182678714524247469512793476009861014781004924905484127480308161377768192868061561886577048646432382128960881487463427414176114486885830693959404989743229103516924432512724195654425703453612710310587164417035878308390676612592848750287387318129424195208623440294647817367740878211949147526287091298307480502897462279102572556822231669438279317474828479089719046386411971105448723910594710418093977044179949800373224354729179833393219827789389078869290217569511230868967647963089430594258815146362187250855166897553056073744582946148472068334167445499314471518357535261186318756327890016183228412253724 for x inrange(2,100): for y inrange(2,100): try: if A==(((y%x)**5)%(x%y))**2019+y**316+(y+1)//x: print('x=',x) print('y=',y) break except: pass
c1=19105765285510667553313898813498220212421177527647187802549913914263968945493144633390670605116251064550364704789358830072133349108808799075021540479815182657667763617178044110939458834654922540704196330451979349353031578518479199454480458137984734402248011464467312753683234543319955893 e1=3 n1=123814470394550598363280518848914546938137731026777975885846733672494493975703069760053867471836249473290828799962586855892685902902050630018312939010564945676699712246249820341712155938398068732866646422826619477180434858148938235662092482058999079105450136181685141895955574548671667320167741641072330259009 m1=long_to_bytes(gmpy2.iroot(c1,e1)[0]) #b' \nO wild West Wind, thou breath of Autum'
cc1=54995751387258798791895413216172284653407054079765769704170763023830130981480272943338445245689293729308200574217959018462512790523622252479258419498858307898118907076773470253533344877959508766285730509067829684427375759345623701605997067135659404296663877453758701010726561824951602615501078818914410959610 cc2=91290935267458356541959327381220067466104890455391103989639822855753797805354139741959957951983943146108552762756444475545250343766798220348240377590112854890482375744876016191773471853704014735936608436210153669829454288199838827646402742554134017280213707222338496271289894681312606239512924842845268366950 n2=111381961169589927896512557754289420474877632607334685306667977794938824018345795836303161492076539375959731633270626091498843936401996648820451019811592594528673182109109991384472979198906744569181673282663323892346854520052840694924830064546269187849702880332522636682366270177489467478933966884097824069977 ee1=17 ee2=65537 s,s1,s2=gmpy2.gcdext(ee1,ee2) m2=long_to_bytes((pow(cc1,s1,n2)*pow(cc2,s2,n2))%n2) #b"n's being,\nThou, from whose unseen presence the leaves dead\nAre driven, like ghosts from an enchanter fleeing,\nYellow, a"
e3=65537 c3=59213696442373765895948702611659756779813897653022080905635545636905434038306468935283962686059037461940227618715695875589055593696352594630107082714757036815875497138523738695066811985036315624927897081153190329636864005133757096991035607918106529151451834369442313673849563635248465014289409374291381429646 p3=11437038763581010263116493983733546014403343859218003707512796706928880848035239990740428334091106443982769386517753703890002478698418549777553268906496423 n3=113432930155033263769270712825121761080813952100666693606866355917116416984149165507231925180593860836255402950358327422447359200689537217528547623691586008952619063846801829802637448874451228957635707553980210685985215887107300416969549087293746310593988908287181025770739538992559714587375763131132963783147 q3=n3//p3 phi=(p3-1)*(q3-1) d=gmpy2.invert(e3,phi) m3=long_to_bytes(pow(c3,d,n3)) #nd black, and pale, and hectic red,\nPestilence-stricken multitudes: O thou,\nWho chariotest to their dark wintry bed\n
from Crypto.Util.number import * import gmpy2 import hashlib
c1=19105765285510667553313898813498220212421177527647187802549913914263968945493144633390670605116251064550364704789358830072133349108808799075021540479815182657667763617178044110939458834654922540704196330451979349353031578518479199454480458137984734402248011464467312753683234543319955893 e1=3 n1=123814470394550598363280518848914546938137731026777975885846733672494493975703069760053867471836249473290828799962586855892685902902050630018312939010564945676699712246249820341712155938398068732866646422826619477180434858148938235662092482058999079105450136181685141895955574548671667320167741641072330259009 m1=long_to_bytes(gmpy2.iroot(c1,e1)[0]) #b' \nO wild West Wind, thou breath of Autum'
cc1=54995751387258798791895413216172284653407054079765769704170763023830130981480272943338445245689293729308200574217959018462512790523622252479258419498858307898118907076773470253533344877959508766285730509067829684427375759345623701605997067135659404296663877453758701010726561824951602615501078818914410959610 cc2=91290935267458356541959327381220067466104890455391103989639822855753797805354139741959957951983943146108552762756444475545250343766798220348240377590112854890482375744876016191773471853704014735936608436210153669829454288199838827646402742554134017280213707222338496271289894681312606239512924842845268366950 n2=111381961169589927896512557754289420474877632607334685306667977794938824018345795836303161492076539375959731633270626091498843936401996648820451019811592594528673182109109991384472979198906744569181673282663323892346854520052840694924830064546269187849702880332522636682366270177489467478933966884097824069977 ee1=17 ee2=65537 s,s1,s2=gmpy2.gcdext(ee1,ee2) m2=long_to_bytes((pow(cc1,s1,n2)*pow(cc2,s2,n2))%n2) #b"n's being,\nThou, from whose unseen presence the leaves dead\nAre driven, like ghosts from an enchanter fleeing,\nYellow, a"
e3=65537 c3=59213696442373765895948702611659756779813897653022080905635545636905434038306468935283962686059037461940227618715695875589055593696352594630107082714757036815875497138523738695066811985036315624927897081153190329636864005133757096991035607918106529151451834369442313673849563635248465014289409374291381429646 p3=11437038763581010263116493983733546014403343859218003707512796706928880848035239990740428334091106443982769386517753703890002478698418549777553268906496423 n3=113432930155033263769270712825121761080813952100666693606866355917116416984149165507231925180593860836255402950358327422447359200689537217528547623691586008952619063846801829802637448874451228957635707553980210685985215887107300416969549087293746310593988908287181025770739538992559714587375763131132963783147 q3=n3//p3 phi=(p3-1)*(q3-1) d=gmpy2.invert(e3,phi) m3=long_to_bytes(pow(c3,d,n3)) #nd black, and pale, and hectic red,\nPestilence-stricken multitudes: O thou,\nWho chariotest to their dark wintry bed\n
from Crypto.Util.number import * from secret import flag p = getPrime(1024) q = getPrime(16) n = p*q m = bytes_to_long(flag) for i inrange(1,p-q): m = m*i%n e = 1049 print(pow(2,e,n)) print(pow(m,e,n))
c=3303523331971096467930886326777599963627226774247658707743111351666869650815726173155008595010291772118253071226982001526457616278548388482820628617705073304972902604395335278436888382882457685710065067829657299760804647364231959804889954665450340608878490911738748836150745677968305248021749608323124958372559270 c2=4513855932190587780512692251070948513905472536079140708186519998265613363916408288602023081671609336332823271976169443708346965729874135535872958782973382975364993581165018591335971709648749814573285241290480406050308656233944927823668976933579733318618949138978777831374262042028072274386196484449175052332019377 e = 1049
kn=2**1049-c2 q=gmpy2.next_prime(2**15) while1: if kn%q==0: break q=gmpy2.next_prime(q)
k=2 kp=kn//q while1: if kp%k==0: kp=kp//k k=2 if gmpy2.is_prime(kp): p=kp break k+=1
c=3303523331971096467930886326777599963627226774247658707743111351666869650815726173155008595010291772118253071226982001526457616278548388482820628617705073304972902604395335278436888382882457685710065067829657299760804647364231959804889954665450340608878490911738748836150745677968305248021749608323124958372559270 c2=4513855932190587780512692251070948513905472536079140708186519998265613363916408288602023081671609336332823271976169443708346965729874135535872958782973382975364993581165018591335971709648749814573285241290480406050308656233944927823668976933579733318618949138978777831374262042028072274386196484449175052332019377 e = 1049
kn=2**1049-c2 q=gmpy2.next_prime(2**15) while1: if kn%q==0: break q=gmpy2.next_prime(q)
k=2 kp=kn//q while1: if kp%k==0: kp=kp//k k=2 if gmpy2.is_prime(kp): p=kp break k+=1
n=p*q phi=(p-1)*(q-1) d=gmpy2.invert(e,phi) m0=pow(c,d,n) mm=1 for i inrange(p-q,p): mm=mm*i%p m=(-m0)*mm%p print(long_to_bytes(m))
lcm = 4292158730589770192682795435047249488185453170529228019750042608688907718268448193363838203887391025871515871000364259326343790645215256385842265899206372365402431198699714374850409466996627163968391249416054093529090485677808301343590811445080871279796162536469847469761747058736980603093722710824453312207182881241846080117790728778291633761198069016865260030288832065807438020772711645648333908622890343009942617559434851450007195025869850769670769715654662127278293639938359741401336592219730356884542179574372134014927006215640945952229142436595334916765255426954857520777553915330597952622785359222832224632624 c = 4288727484183191191687364666620023549392656794153112764357730676861570386983002380982803054964588111708662498647767438881892355599604826306427809017097724346976778230464708540600157055782723189971534549543664668430013171469625043063261219462210251726207552819381767396148632877168530609902046293626355744288863460554297860696918890189350721960355460410677203131993419723440382095665713164422367291153108363066159712951217816814873413423853338021627653555202253351957999686659021298525147460016557904084617528199284448056532965033560516083489693334373695545423561715471204868795248569806148395196572046378679014697206 N = 17168634922359080770731181740188997952741812682116912079000170434755630873073792773455352815549564103486063484001457037305375162580861025543369063596825489461609724794798857499401637867986508655873564997664216374116361942711233205374363245780323485119184650145879389879046988234947922412374890843297813248828996855478005656041814919367820336728271583686844991928889831691815821365423570311291064846736832327637944358854661523107817781673029406341843040857813841671405147146887291204140157388049394514390098066284975682117038362207142272098796924412602725857521665773622056312191400612944442008222587867782281556388669 E = 65537
for k inrange(1,10000): p,q=solve_p_q(N,k*lcm) if p*q==N: break phi=k*lcm d=gmpy2.invert(E,phi) print(long_to_bytes(pow(c,d,N)))
那么问题来了,这题前面这么多复杂操作是为了什么呢?
[HGAME 2022 week1]Easy RSA
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
from math import gcd from random import randint from gmpy2 import next_prime from Crypto.Util.number import getPrime from secret import flag
defencrypt(c): p = getPrime(8) q = getPrime(8) e = randint(0, p * q) while gcd(e, (p - 1) * (q - 1)) != 1: e = int(next_prime(e)) return e, p, q, pow(ord(c), e, p * q)
from Crypto.Util.number import * from libnum import * import gmpy2 import hashlib
p = 167710954518007348037383082265231465648795974011761905177264545864288011527333715495850532989338171489309608848431113452814709692343039027970312735521415071265608660628968391884287240987858607818275329135585153511665148279408708087727501421558738163577629329044315775019460018956186674179846621352371150072281 q = 130354329753344570838569091064852072757046774566775609047544069941246798511317343102715733555464772099991834579660053860799207243561908291522943696711982657846373844514551117658179060004064010647453939332217996817580433587341521331941287365948919907797478197717562721233289937471168288241937022054501586986443 c1 = 2560344169447809042170685026483682125499025654554670516499742981486615082413150123244985585751880264831112089324011804397189638172356179296987581738515619297036118472798499254785110885662931526277474101787493114656242031264678448394380651657330967744585361662315313462698221954777506355498445242300193032704972074020068699180111637362566860530694807230108024167631423062629721393506643291591971626450262144814424411172618188943774725105690851574922374544865628890948773274109561622040022136970632948166009941425683576381155722191980954262373394704682297682490061906408535261437100820855976015526295573831744458528440 c2 = 9041231631916227099296501948589424780380702196870972231114747229225732542137483840187783630590878594711315671224997985975031038623195921968945234067183003568830416719957054703139219879265482072634572699299971785171441858501409377942183918216246312330291820452436486171483461790388518159980027140392750222843449604265528929311978655519463562520038992870162220913137870017065557254099767583925177889051326144499369420594398043223307161794788085369471538477803421726790780799629276012701406231535048423554314287152404245482928538931953627397633165453319078105028671410039195670727134471011040601278722143504641171853743 c3 = 3193069356811106774640161554961405075257002069448498144279061282023129342916422283816661697787316681475161942522570615456264481238277711114193792510286127129056376618422336477707825009085263623755329815306483253646072909132096678270667136193038337386976289222105363398033633185639402128949635525665502328717781718263894690234837016959581149138917064108193064639981137359869717065147934752707676203651598070046066514316196771853484143158367616177332902152347890310640338106015356361617700741042461419248117687350565094928451141103632305400493998164788411031832078388030194992306440474662871408938796429927990102583837 n=p*q e=2 phi=(p-1)*(q-1) while1: print(e) if isPrime(e) and isPrime(e+2) and isPrime(e+4): e1 = pow(e, 0x10001, phi) e2 = pow(e + 2, 0x10001, phi) s,s1,s2=gmpy2.gcdext(e1,e2) m=(pow(c1,s1,n)*pow(c2,s2,n))%n flag=long_to_bytes(m) #print(flag) str='You are intuitively understanding the distribution of prime numbers! Bonus: You can solve this challenge w/ N instead of p and q!' print(hashlib.md5(str.encode('utf-8')).hexdigest()) break e+=1
from Crypto.Util.number import * import os from flag import flag
defgen(): e = 3 whileTrue: try: p = getPrime(512) q = getPrime(512) n = p*q phi = (p-1)*(q-1) d = inverse(e,phi) return p,q,d,n,e except: continue return p,q,d,n,e
p,q,d,n,e = gen() r = getPrime(512) m = bytes_to_long(flag+os.urandom(32)) M = m%r c = pow(m,e,n) print("r = %d"%r) print("M = %d"%M) print("n = %d"%n) print("e = %d"%e) print("c = %d"%c) ''' r = 7996728164495259362822258548434922741290100998149465194487628664864256950051236186227986990712837371289585870678059397413537714250530572338774305952904473 M = 4159518144549137412048572485195536187606187833861349516326031843059872501654790226936115271091120509781872925030241137272462161485445491493686121954785558 n = 131552964273731742744001439326470035414270864348139594004117959631286500198956302913377947920677525319260242121507196043323292374736595943942956194902814842206268870941485429339132421676367167621812260482624743821671183297023718573293452354284932348802548838847981916748951828826237112194142035380559020560287 e = 3 c = 46794664006708417132147941918719938365671485176293172014575392203162005813544444720181151046818648417346292288656741056411780813044749520725718927535262618317679844671500204720286218754536643881483749892207516758305694529993542296670281548111692443639662220578293714396224325591697834572209746048616144307282 '''
这题对m做了处理,有$m=M+k_1r$
因为$e=3$,所以有:
可以构造多项式$f=(M+k_1r)^3-c$
用coppersmith求解m得到flag:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
from Crypto.Util.number import *
r = 7996728164495259362822258548434922741290100998149465194487628664864256950051236186227986990712837371289585870678059397413537714250530572338774305952904473 M = 4159518144549137412048572485195536187606187833861349516326031843059872501654790226936115271091120509781872925030241137272462161485445491493686121954785558 n = 131552964273731742744001439326470035414270864348139594004117959631286500198956302913377947920677525319260242121507196043323292374736595943942956194902814842206268870941485429339132421676367167621812260482624743821671183297023718573293452354284932348802548838847981916748951828826237112194142035380559020560287 e = 3 c = 46794664006708417132147941918719938365671485176293172014575392203162005813544444720181151046818648417346292288656741056411780813044749520725718927535262618317679844671500204720286218754536643881483749892207516758305694529993542296670281548111692443639662220578293714396224325591697834572209746048616144307282 p.<x>=PolynomialRing(Zmod(n)) f=(M+x*r)^3-c f=f.monic() x0=f.small_roots()[0] k=int(x0) m=M+k*r print(long_to_bytes(m))
N = 1 for base in [2, 3, 7]: N *= pow(base, random.randint(123, 456)) e = random.randint(271828, 314159)
m = int.from_bytes(flag, byteorder='big') assert m.bit_length() < N.bit_length()
for i inrange(m.bit_length()): print(pow(ror(m, i, m.bit_length()), e, N)) ''' 共367个大数 1123279905753420854056949270002079681846506391469678488301569277287912082415123311220349271402019208029052224502080757137106573269187631637748684158368045600005655891722764459682451768985892383847582777401840658306512477897257240329468693759755275846566672333848486514916087101615422164522188501353017634498421719941291156644882844167419683097913336651801182760157321799921263689020310161398379427011654220488495216138997481624067312309716359256133688385745929373875911175705411323092025782228256765 60848463499016786897050297575193379856357320605752544731915960900662600736882534150881154375836797044831443206517611246422944245077214035778529831198642997131725966633365520266930784297332554358743269582513125982070736168184463231257501147666235039856936758619962287224127462217899181431380749110624483441043813791223675322207707555956618770587208981573720919846554234432849886071965346594511242517114924137967847829591750727942755115692172497988369795219622584033874069145907439553222939015905280 237348271212870069146218394147712821983756154361121125464843821356777343086464786262769510843094453963434423871359291400355493177339013648909538576312957298531245771260362473919076759706682735266855920298899200500046967238386252391851138198530671332478315828876262645843939174292712690021408705461921177334034837441241231182751353058298103009124765377211803579840406270396477937117875490192355651017855958671557749329097262800621575287211938761281102664405069806503929644344867737790185734896367903 ... '''
for i inrange(m.bit_length()): print(pow(ror(m, i, m.bit_length()), e, N))
对于ror(m, i, m.bit_length())随着i的增大,被提到最前面的后位越来越多,所以可以根据每一轮的末位来复原原数,e次方并没有改变二进制的末位,由于n为偶数,含有因子2,n的二进制末位一定为0,模运算不会改变原数的末位值,所以直接把得到的这些数末位提取出来还原原数就能得到flag:
1 2 3 4 5 6 7
from Crypto.Util.number import *
withopen('chall.txt','r') as f: f=f.readlines() num=[bin(int(i))[-1] for i in f] flag=''.join(num[len(num)-i-1] for i inrange(len(num))) print(long_to_bytes(int(flag,2)))
defsfsha(str1, str2): t = string.ascii_letters+string.digits for a in t: for b in t: for c in t: for d in t: if hashlib.sha256((a+b+c+d+str1.decode()).encode()).hexdigest() == str2.decode(): return a+b+c+d
defsfsha(str1, str2): t = string.ascii_letters+string.digits for a in t: for b in t: for c in t: for d in t: if hashlib.sha256((a+b+c+d+str1.decode()).encode()).hexdigest() == str2.decode(): return a+b+c+d
p = remote("43.143.7.97", 28018) p.recvuntil(b'sha256(XXXX+') str1 = p.recvuntil(b')', drop=True) p.recvuntil(b'== ') str2 = p.recvuntil(b'\n', drop=True) p.sendline((sfsha(str1, str2)).encode()) for i inrange(100): l = p.recvline() l = p.recvline() c = eval(l.split(b' ')[1]) print(l.split(b' ')[1].decode(), '=', c) p.sendline(str(c).encode()) print(p.recv().decode())
list = ['T', 'Y', 'Z', '2'] b32 = [] for i inlist: for j inlist: if i != j: for h inlist: if h != i and h != j: for g inlist: if h != g and g != i and g != j: key = i+j+h+g b32.append(key)
for i in b32: dic = 'GHI45FQRSCX' + i + 'UVWJK67DELMNOPAB3' res = '' for i in cipher: if i in base32: res += base32[dic.index(i)] else: res += i print(base64.b32decode(res))
n = PP * QQ m = bytes_to_long(flag.encode()) c = pow(m, 65537, n) print('n =', n) print('c =', c)
''' n = 177269125756508652546242326065138402971542751112423326033880862868822164234452280738170245589798474033047460920552550018968571267978283756742722231922451193 c = 47718022601324543399078395957095083753201631332808949406927091589044837556469300807728484035581447960954603540348152501053100067139486887367207461593404096 '''
这题对pq生成用了一种特殊的方法,在得到因子之前,需要先了解一下位数和乘法之间的关系:
对于64bit的p和q,先试一下它们在十进制下的位数长度和乘积长度:
1 2 3 4 5 6 7 8 9
from Crypto.Util.number import *
whileTrue: p = getPrime(64) q = getPrime(64) res = p*q print(len(str(p)),end=" ") print(len(str(q)),end=" ") print(len(str(res)))
n = 177269125756508652546242326065138402971542751112423326033880862868822164234452280738170245589798474033047460920552550018968571267978283756742722231922451193 c = 47718022601324543399078395957095083753201631332808949406927091589044837556469300807728484035581447960954603540348152501053100067139486887367207461593404096 a = 18109858317913867117 b = 9788542938580474429 e=65537 p=int(str(a)+str(a)+str(b)+str(b)) q=int(str(b)+str(b)+str(a)+str(a)) phi=(p-1)*(q-1) d=gmpy2.invert(e,phi) m=pow(c,d,n) print(long_to_bytes(m))
[鹏城杯 2022]babyrsa
1 2 3 4 5 6 7 8 9 10 11 12 13 14
from Crypto.Util.number import * from libnum import s2n from secret import flag p = getPrime(1024) q = getPrime(16) n = p*q m = s2n(flag) for i inrange(1,p-q): m = m*i%n e = 1049 print(pow(2,e,n)) print(pow(m,e,n)) #4513855932190587780512692251070948513905472536079140708186519998265613363916408288602023081671609336332823271976169443708346965729874135535872958782973382975364993581165018591335971709648749814573285241290480406050308656233944927823668976933579733318618949138978777831374262042028072274386196484449175052332019377 #3303523331971096467930886326777599963627226774247658707743111351666869650815726173155008595010291772118253071226982001526457616278548388482820628617705073304972902604395335278436888382882457685710065067829657299760804647364231959804889954665450340608878490911738748836150745677968305248021749608323124958372559270
from Crypto.Util.number import * import gmpy2 import sympy
e=1049 n=170229264879724117919007372149468684565431232721075153274808454126426741324966131188484635914814926870341378228417496808202497615585946352638507704855332363766887139815236730403246238633855524068161116748612090155595549964229654262432946553891601975628848891407847198187453488358420350203927771308228162321231*34211 c=3303523331971096467930886326777599963627226774247658707743111351666869650815726173155008595010291772118253071226982001526457616278548388482820628617705073304972902604395335278436888382882457685710065067829657299760804647364231959804889954665450340608878490911738748836150745677968305248021749608323124958372559270 phi=int(sympy.totient(n)) d=gmpy2.invert(e,phi) M=pow(c,d,n) m=1 for i inrange(p-q,p): m = m*i%p m=(-M)*m%p print(long_to_bytes(m))
from Crypto.Util.number import * from flag import flag import gmpy2
defgen_prime(nbits, gamma): g = getPrime(int(nbits * gamma)) alpha = 0.5 - gamma whileTrue: a = getRandomNBitInteger(int(alpha * nbits)) p = 2 * g * a + 1 if isPrime(p): b = getRandomNBitInteger(int(alpha * nbits)) q = 2 * g * b + 1 h = 2 * g * a * b + a + b whilenot isPrime(q) or isPrime(h) or gmpy2.gcd(a, b) != 1: b = getRandomNBitInteger(int(alpha * nbits)) q = 2 * g * b + 1 return p, q
defencrypt(nbits, gamma): p, q = gen_prime(nbits, gamma) n = p * q e = getPrime(16) while gmpy2.gcd(e, gmpy2.lcm(p-1,q-1)) != 1: e = getPrime(16) m = bytes_to_long(flag) c = pow(m, e, n) return n, e, c
n, e, c = encrypt(1024, 0.48) print'n =', n print'e =', e print'c =', c
# n = 84236796025318186855187782611491334781897277899439717384242559751095347166978304126358295609924321812851255222430530001043539925782811895605398187299748256080526691975084042025794113521587064616352833904856626744098904922117855866813505228134381046907659080078950018430266048447119221001098505107823645953039 # e = 58337 # c = 13646200911032594651110040891135783560995665642049282201695300382255436792102048169200570930229947213493204600006876822744757042959653203573780257603577712302687497959686258542388622714078571068849217323703865310256200818493894194213812410547780002879351619924848073893321472704218227047519748394961963394668
from Crypto.Util.number import * from gmpy2 import invert
f = lambda x,n: (pow(x, n - 1, n) + 3) % n defphllard_rho(n): i = 1 whileTrue: a = getRandomRange(2, n) b = f(a, n) j = 1 whileTrue: p = GCD(abs(a - b), n) if p == n: break elif p > 1: return (p, n // p) else: a = f(a, n) b = f(f(b, n), n) j += 1 i += 1
n = 84236796025318186855187782611491334781897277899439717384242559751095347166978304126358295609924321812851255222430530001043539925782811895605398187299748256080526691975084042025794113521587064616352833904856626744098904922117855866813505228134381046907659080078950018430266048447119221001098505107823645953039 c = 13646200911032594651110040891135783560995665642049282201695300382255436792102048169200570930229947213493204600006876822744757042959653203573780257603577712302687497959686258542388622714078571068849217323703865310256200818493894194213812410547780002879351619924848073893321472704218227047519748394961963394668 e = 58337
p,q = phllard_rho(n) d = invert(e,(p-1)*(q-1)) print(long_to_bytes(pow(c,d,n)))
''' n = 8250871280281573979365095715711359115372504458973444367083195431861307534563246537364248104106494598081988216584432003199198805753721448450911308558041115465900179230798939615583517756265557814710419157462721793864532239042758808298575522666358352726060578194045804198551989679722201244547561044646931280001 e = 3 c = 945272793717722090962030960824180726576357481511799904903841312265308706852971155205003971821843069272938250385935597609059700446530436381124650731751982419593070224310399320617914955227288662661442416421725698368791013785074809691867988444306279231013360024747585261790352627234450209996422862329513284149 '''
n = 8250871280281573979365095715711359115372504458973444367083195431861307534563246537364248104106494598081988216584432003199198805753721448450911308558041115465900179230798939615583517756265557814710419157462721793864532239042758808298575522666358352726060578194045804198551989679722201244547561044646931280001 e = 3 c = 945272793717722090962030960824180726576357481511799904903841312265308706852971155205003971821843069272938250385935597609059700446530436381124650731751982419593070224310399320617914955227288662661442416421725698368791013785074809691867988444306279231013360024747585261790352627234450209996422862329513284149 p = 225933944608558304529179430753170813347 q = 260594583349478633632570848336184053653 r = 218566259296037866647273372633238739089 t = 223213222467584072959434495118689164399
R.<x> = Zmod(p)[] f = x^e-c f = f.monic() results1 = f.roots()
R.<x> = Zmod(q)[] f = x^e-c f = f.monic() results2 = f.roots()
R.<x> = Zmod(r)[] f = x^e-c f = f.monic() results3 = f.roots()
R.<x> = Zmod(t)[] f = x^e-c f = f.monic() results4 = f.roots() for a in results1: for b in results2: for c in results3: for d in results4: list1=[int(a[0]),int(b[0]),int(c[0]),int(d[0])] list2=[p,q,r,t] m = CRT_list(list1,list2) flag = long_to_bytes(int(m)) ifb'flag'in flag: print(flag)
from fastecdsa.curve import P521 as Curve from fastecdsa.point import Point from Crypto.Util.number import bytes_to_long, isPrime from os import urandom from random import getrandbits
defgen_rsa_primes(G): urand = bytes_to_long(urandom(521//8)) whileTrue: s = getrandbits(521) ^ urand
P=0x1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff a = -0x3 b = 0x51953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f00 e = 0x10001 n=0x118aaa1add80bdd0a1788b375e6b04426c50bb3f9cae0b173b382e3723fc858ce7932fb499cd92f5f675d4a2b05d2c575fc685f6cf08a490d6c6a8a6741e8be4572adfcba233da791ccc0aee033677b72788d57004a776909f6d699a0164af514728431b5aed704b289719f09d591f5c1f9d2ed36a58448a9d57567bd232702e9b28f c=0x3862c872480bdd067c0c68cfee4527a063166620c97cca4c99baff6eb0cf5d42421b8f8d8300df5f8c7663adb5d21b47c8cb4ca5aab892006d7d44a1c5b5f5242d88c6e325064adf9b969c7dfc52a034495fe67b5424e1678ca4332d59225855b7a9cb42db2b1db95a90ab6834395397e305078c5baff78c4b7252d7966365afed9e R.<x>=Zmod(P)[] f=x**5+a*x**3+b*x**2-n**2 list=f.roots() for i inlist: if isPrime(int(i[0])) and n%int(i[0])==0: print(i[0]) break
#!/usr/bin/env python from Crypto.Util.number import * from secret import flag
n = 264048827496427248021277383801027180195275776366915828865010362454006394906519399441496561006668252031429735502465174250525698696973129422193405161920872162928097673289330345041221985548078586423910246601720647996170161319016119241836415788315729493164331517547663558380515400720081995290120793014108439083514403659082115510258023834737471488528527557960636984676435543300074504679264476413252780514962473070445293528877641502742438571110744667739728450283295649865745629276142949963507003094791773183928894536793857609738113546410753895719242547720815692998871947957214118354127328586542848234994500987288641595105 e = 65537 m = bytes_to_long(flag) c = pow(m,e,n) print(c) # 76196483810925191371357319946893762223027002702624516192769497540954799651198719100683206759706879828894501526423422596543748404479640715319801018211652987852179907519286760601944889601355220646374788026632971331786307898234821477134265724962397355614076896148563340833323366935479885600112872998594315513803419069126624158092821269145991266528158747750965226483644012365861166608598063649804899693010576080857540523307078138634628539419178875838147396170651777949577793359622498517581948006585916952705460782942977789615065947303447566918741750017127110484065354974088489869377128636357092420660532261674969708694
题目给了一句描述:RSA say : My birthday is in November instead of October
str='ABAABBBAABABAABBABABAABBABAAAABBABABABAAABAAABBAABBBBABBABBABBABABABAABBAABBABAAABBAABBBABABABAAAABBAAABABAABABBABBBABBAAABBBAABABAABBAAAABBBAAAABAABBBAABBABABAABABAAAAABBBBABAABBBBAAAABBBBBAB' str=str.replace('A','0').replace('B', '1') print(''.join(chr(int(str[i:i+8],2)) for i inrange(0,len(str),8)))
from Crypto.Util.number import * from secret import flag
p = getPrime(512) q = getPrime(512) assert p > q n = p*q e = 65536 m = bytes_to_long(flag) num1 = (pow(p,e,n)-pow(q,e,n)) % n num2 = pow(p-q,e,n) c = pow(m,e,n)
deftonelli(n, p):#求n在模p下平方根 assert legendre(n, p) == 1 q = p - 1 s = 0 while q % 2 == 0: q //= 2 s += 1 if s == 1: returnpow(n, (p + 1) // 4, p) for z inrange(2, p): if p - 1 == legendre(z, p): break c = pow(z, q, p) r = pow(n, (q + 1) // 2, p) t = pow(n, q, p) m = s t2 = 0 while (t - 1) % p != 0: t2 = (t * t) % p for i inrange(1, m): if (t2 - 1) % p == 0: break t2 = (t2 * t2) % p b = pow(c, 1 << (m - i - 1), p) r = (r * b) % p c = (b * b) % p t = (t * c) % p m = i return r
count = 0 while e % 2 == 0: e = e // 2 count += 1 d = gmpy2.invert(1,n-1) m = pow(c, d, n) for i inrange(count): m = tonelli(m, n) m = -m % n print(bytes.fromhex(hex(m)[2:]).decode())
ez_fac
下面是剩下两道没出的题目。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
from Crypto.Util.number import * import random from secret import flag,a0,a1,b0,b1
p = getPrime(512) q = getPrime(512) e = getPrime(128) n = p*q assertpow(a0,2) + e * pow(b0,2) == n assertpow(a1,2) + e * pow(b1,2) == n m = bytes_to_long(flag) c = pow(m,e,n)
z = int('1100111100010100101101000110111010110001111111010110111100111111000001001011011010001001010011010000110010100111110011010000011111011011000001101011011101011111111011111111000000001000110110111001111100000100101010101001011111001010110101111001110010010001100001101001001110010001011001011100110111101001011111001001010110100110101110011001001000111101000100000100011101110101101000000000000000010001110001101010111100010111010100110101100000101100110100000001111001101001101011110100000101101001001010100100101110011110100010001001111110011111110101010111111110011111110001000101111100010011111101001111000100111000110011110100010000001001000100110101110000101001001111111000010111101111001110011011011011111100100000011000000111001101000000111111111101001000110101100100011100001010010110001000001110010110100000100010110011010000011010110001101001101100010101001000110110111011100010000010110010000001110010101010101011011010011001011011011001111010101101001111001000101000100001101000110010100101101011100101000100110101010011101000011001111011110111000100111100010111000000011011100111000100001011110001101010001100100101001110000000011001110000010011110101100010000001011110011010011111001100010111010110101101111011001101001110000010010110001100010110011111001110111111001101100010011001111011010111011011001010011110101101110001101000101100111110100001011100100101110100011010110001100010000011110000001001111100000011000110000111101110101010111100101000110100001100101000011001001011111001100010011100111101100001110100101010100100111011011010110001010100101101010001101100110001011111001111111011011010111111101110000001011110001011001110111001011100100001000101101111101011100100010010011001001011010011011101111010101110101101010100101011000100101101100011010111001110001011001110001000101000011001001011000111101010111111000111100111111000110000000101011001011110101010010001111110000011100111011110001001100111011000010111001010011101011111001001011011011011110111010101110001000101000110101101010101100100110101101001011111011010000',2) p = int('10010000100000001100010000110101101101001001001111010110100010000011010001101110011100101100111001111001100101100010010001101100001011011010111111101010010111110111101100011100110101101011111000000111001001010011101111001111010101010100001111110100111101110100101110110101111111001011100110110100111011001101100010001010100011101100100110110010111100101000111000110010101010000111101110111000011100101000101010010111110101011111100110000010101001001001111011110000010100101010000111101101101101001110001010110001101100101011101010001010010100110101110001010001000100101101011000110010100001111101100000111011010110100101111011011100010101111111000001100111111100101111011000000111100101111011100010100111111001110110111001101101110000011010011010010111000011101101001101001010111111000111110101011111110100010011010111101101100110011111010001011001000001100100101000001110111110111011011010011010000011101011001101001101100000110011101011101000000001101101110100000110101001010101010001000110101110001101110111011010101111101001111011110100000000101000001110100110001111101000010001001001000101110100100010101100000010111000010111100010011011011011101111110011100100010001011011010100111001101111100001110011110010110111010100011011101110010110101100111000011011001100110000001000101001111000111100000101110010000100000110000111001101010001011010001100001111010000101001100001010001011010011010110000000110110100011111110110011100010000101001001110111010001011010110001000110101011001111101110010100011101011101111011100110101110100110010111100010100001000110110100111100101011110010110100001011100100110101011100110011010110011011000011100011110101011001000111010101110111010101101101011001010101100100110110001010000001111001101100011101011000010100111011001010100100010110100110101111000000101000111110101010001100000101000101011110110011000111111101111100001110110011111110000101011001100000101011100000001010101100101101100001011010100100000011001010111001111111000111111100101011010011000101000001011010001101001011111101001101000111011001101',2) c = int('111100101010010000001000000001110101001100100110110100010011100100000100001001001011111011001110110000000110110010100101101011100100001110101110101101000000101101111001011100110100101100111000110010100001001111111001110111111000101100100111001110000110101010011101010111101000100010100110110010100000011011001010011010001000010001101101010000101011000000001111001001000000111100011000001110001011111100111010011101010010101101111111110000100010001001010100100011100100000101111000101110100111101010100110010111011000111111111100001101100111000001000111001111010101011100101101111111110110110010011000000101011110100011101100010111111111111011100000000000100001010101111010011010111001010000100011001111110001111111110110100001000001001001010111111101101100111101000001111111100110100110111100101101110111001001001111101000111011011101111010101011000000001001010101110011000110110010110000010111000010000100111010001111110000100001111111000001111000101010100001000001101000101111101101111010101111111010001100001110000110000101100000011110010111000001001000001111101100010001100101001010010010011100001000110010110000001001110111111101100111101100100000011100110101001000110011100111110010111110001110110000101010111000011101001100010000100100000011001111010110100111111110110010011110011101010000010111001101101000011100001001010010011010000010110011001111000101010101100000100111010110110010011111101000001000000011010000100010011100010010001001101010011101000011010011110110011101010110111001000000110001000101011100011110010011000111011001000001100111101010010011100000100000010110000011010001010010101100110011110111101100101001001001011000001111110000111110100110110000111010100001110000110100110101111111101100011101100111100011101110001011011100010101010011000101010110011100100100000110011000011000011010110110011111011110101010111001000000110110111111011010100001100100000100011000000011011010111101010000110101111101110100000011001101101111011011101111110101001010001000111111001011101010010011110110111110011110011011101100101101000010',2)
L = matrix(ZZ, [[1, z],[0, p]]) v = L.LLL()[1] x,y=v[0],v[1] x_1=gmpy2.invert(x,y) m=c*x%p*x_1%y print(long_to_bytes(m))