Fanfaron
Honnêtement je suis même pas sûr de savoir comment j’ai fais, j’ai essayé pleins de trucs jusqu’à ce qu’il y ait un qui marche
On nous donne un fichier python qui chiffre un message:
#!/usr/bin/env python3
from Crypto.Util.number import bytes_to_long, getPrime
from secret import text
def generate_key():
p = getPrime(2048)
N = pow(p,3)
e = 0x10001
return (N,e)
N,e = generate_key()
pt = bytes_to_long(text.encode())
ct = pow(pt, e, N)
print(f"N = {N}")
print(f"e = {e}")
print(f"ct = {ct}")
N est alors facilement factorisable, car il suffit juste de faire la racine cubique de N pour trouver p. J’ai donc cherché sur http://factordb.com le facteur de N.
N = 28428857216862425537130452151809638870585201670440164102774168551896218168100205152213633573335606074795950860936909761402025302482066629397181332127874781690107447890279245112395465531938896423274141395360970262704909779167707018589864357817791111213511271840213378511697718074294165859260971172362609290267485849180084904144940748838393921567401600509592635494874382276417008507673823115081671490042092401569971784714967754290257908911145643542500664102146986592554079834901704394892228783633537076912827137326016891834541594104590611698329358410180979245308478259684200551881351034920514373465563462262219191109790203460165871292890029611686795983472651706496896708288622799685284969817346594165081394836720312802053906482653335188871524135555965521347733838586799444619975997126635176896822546664055308848906907384220440529267844749468207608219540832563592523885237568126706568904590610958351502694878089108277911322513996903105604902852498591979851180731679198143718895973813645382345414426261342547487976926342117725328701542373558529870071453952984975139795599388332837790987927966786647201647081648767522374408752689623804605548173595865331151515055262078104974191260532013045182910745813454609789595402322479314024608001667583000105169658045969237109182115432457370199124538176994674863262337537731691968390386238249911057352779383345395780506008542930620184286063488726139693567491606241728521201377992519675761699452143101934602981043194413960672140443070359150905632521962729008008652320162317816543545312652928649090211131748984065891692321598405282482168127269279329156322181977514831960300649952552040775677883377955074187731754723766837258163128143854068646865612030995519351076041336269318717559718224917649673945662811457984468011160484668706315323524626165133502946484599260548635667662652902616856589377193341077542713934854149321
p = 30520136202991123898201255193007809073234266624753210491285086444603070373245624900406965667988777915038832064799404138292406623151392369558979974493002801177674790237720236758969320792430660609344621988063480520459285005099607611691038602715018383790064971525007842343404766557109901337434470964608627990124788919053166532878744631176208154679022481148145235404105759121470646924132478800077312516738570142548922475539110087699883989868502528185184792230185677373699663345769430515698935525361108321798536239470912879340641869300624174181483058205499154773450917658494337662283971284420228709151341313637994853482841
e = 65537
ct = 1956102418414964906766658672182038815675149984030160103435546349665029187075809316386742648953476377810230820926464585430398082369745419308135508036729519616949456707646306887308625434960968781475049735624264457409003612848912022836541883235847630663370486482983561063032050190503386140061662486754033680728377314944473870208691356431289118484558856727284234221587639135094976893779817402919870873884217649622688035164956432631838449152966315588753903077306493124036203282029402547451707864762925699469684826007392760137256186629939254660739541848371734904434274667096237665962949204422260745667834399854207891024585329256239287328369954962521140074147071190857231944285570745990291240616710804415678838680210106685517813982525635414266538209916191758297576672215291360346015397575906671703499055916044003173911298137838089401546011477605724936788734756607149122074913483340260020750153635731020565794637000515364741593543969869917899614330898688965854869431262163914840158256876000048054025869637443623061421761207154913212951872740555949280914878030627430460645856378733564290490413458318097820527836724226045031812170628860331877302460685956136295507545313105593869300747547809890843890810828921863952787419807122438953105522715978814086587079659955633528729847103494641769473622940607276213847144124754408371950706033468964947873684667507800619701386504570864553198797129386572364386214641237881940300433091144950366971487075475393400892069381407853025427618080511884088822714215376503568968379791693328105000920306621301025742762442135377887509760560224612346868743344119498370726437259836069194241611912017537080352058030236603068210720471502864537815813098895845252100395590680098101845420542028840764926005686487463133212451692679306227781577596857882758524440685913237797299271268573788281339308108362639226826883472460408058243304117373280
Ensuite c’est la partie où je suis pas exactement sûr. J’ai cherché un peu sur Stack Exchange, et je suis tombé sur ce poste. J’ai pu calculer d avec le code suivant:
d = pow(e, -1, (p-1)*p*p)
ce qui me donne ensuite:
d = 16974374959992730422409504907952194617466004342066223072549185797400718878434001065219215029040017109615032014576837753840161315156716805391475085943754948842876459761577691082795168557155514532846185009107376403404272770627455381607946384267940002943313083882072565337767114850621862524051162899518154082998260353148082798786878808044237492482933183232996161245554869048910904678483671396558598762177657167185476385975577203612189789486885883965723079893512271424588151700864223181966336642390770699859252616242799746622174452887784537381438364953366676821462167367741923673583916678326359887515158823897689841880421197215408076037616565552243566058896070104296191049844070628642517488622055602433733813101481792864401534035040828714409833463647923324758121929421845503705110142968287765388056178082518810363813898615700431796074503415451722355417187292872954258147255634073890653184682576791725288288517697027577177792414203160681136162646704911621217145486797563722318722470228666656671288053291259478416668335972371126335815705407847749335012164680491488421871426882070058011388143524011678753597050227630941647771103411221118105365282585583666204993116171321784404430263269193690451076546511441225443393744321257213010271611915266775398670954214368355616957028586016678889241057634008705310334298006141805554969672369814621948082581290572486183175763598563939354990796799932919637234955119410759341353594085725337679740918788205118121308952199517861061793566495612614857758498050843534081330120673506461562218736464646190245273452246605443346787248050163300621679710021100354941303932573308779973239071620356233652195207529203208095417758303740997679820367721126446240153375220493839961494828402805300542429064487437944691963828916721115841732423410340150394636728404675146655030115596945711093038355930914399235986570187063046604863409214785993
Il ne me reste plus qu’à calculer pt avec:
pt = pow(ct, d, N)
print(long_to_bytes(pt))
Solution
from Crypto.Util.number import long_to_bytes
N = 28428857216862425537130452151809638870585201670440164102774168551896218168100205152213633573335606074795950860936909761402025302482066629397181332127874781690107447890279245112395465531938896423274141395360970262704909779167707018589864357817791111213511271840213378511697718074294165859260971172362609290267485849180084904144940748838393921567401600509592635494874382276417008507673823115081671490042092401569971784714967754290257908911145643542500664102146986592554079834901704394892228783633537076912827137326016891834541594104590611698329358410180979245308478259684200551881351034920514373465563462262219191109790203460165871292890029611686795983472651706496896708288622799685284969817346594165081394836720312802053906482653335188871524135555965521347733838586799444619975997126635176896822546664055308848906907384220440529267844749468207608219540832563592523885237568126706568904590610958351502694878089108277911322513996903105604902852498591979851180731679198143718895973813645382345414426261342547487976926342117725328701542373558529870071453952984975139795599388332837790987927966786647201647081648767522374408752689623804605548173595865331151515055262078104974191260532013045182910745813454609789595402322479314024608001667583000105169658045969237109182115432457370199124538176994674863262337537731691968390386238249911057352779383345395780506008542930620184286063488726139693567491606241728521201377992519675761699452143101934602981043194413960672140443070359150905632521962729008008652320162317816543545312652928649090211131748984065891692321598405282482168127269279329156322181977514831960300649952552040775677883377955074187731754723766837258163128143854068646865612030995519351076041336269318717559718224917649673945662811457984468011160484668706315323524626165133502946484599260548635667662652902616856589377193341077542713934854149321
p = 30520136202991123898201255193007809073234266624753210491285086444603070373245624900406965667988777915038832064799404138292406623151392369558979974493002801177674790237720236758969320792430660609344621988063480520459285005099607611691038602715018383790064971525007842343404766557109901337434470964608627990124788919053166532878744631176208154679022481148145235404105759121470646924132478800077312516738570142548922475539110087699883989868502528185184792230185677373699663345769430515698935525361108321798536239470912879340641869300624174181483058205499154773450917658494337662283971284420228709151341313637994853482841
e = 65537
ct = 1956102418414964906766658672182038815675149984030160103435546349665029187075809316386742648953476377810230820926464585430398082369745419308135508036729519616949456707646306887308625434960968781475049735624264457409003612848912022836541883235847630663370486482983561063032050190503386140061662486754033680728377314944473870208691356431289118484558856727284234221587639135094976893779817402919870873884217649622688035164956432631838449152966315588753903077306493124036203282029402547451707864762925699469684826007392760137256186629939254660739541848371734904434274667096237665962949204422260745667834399854207891024585329256239287328369954962521140074147071190857231944285570745990291240616710804415678838680210106685517813982525635414266538209916191758297576672215291360346015397575906671703499055916044003173911298137838089401546011477605724936788734756607149122074913483340260020750153635731020565794637000515364741593543969869917899614330898688965854869431262163914840158256876000048054025869637443623061421761207154913212951872740555949280914878030627430460645856378733564290490413458318097820527836724226045031812170628860331877302460685956136295507545313105593869300747547809890843890810828921863952787419807122438953105522715978814086587079659955633528729847103494641769473622940607276213847144124754408371950706033468964947873684667507800619701386504570864553198797129386572364386214641237881940300433091144950366971487075475393400892069381407853025427618080511884088822714215376503568968379791693328105000920306621301025742762442135377887509760560224612346868743344119498370726437259836069194241611912017537080352058030236603068210720471502864537815813098895845252100395590680098101845420542028840764926005686487463133212451692679306227781577596857882758524440685913237797299271268573788281339308108362639226826883472460408058243304117373280
d = pow(e, -1, (p-1)*p*p)
print(d)
pt = pow(ct, d, N)
print(long_to_bytes(pt))
Le texte obtenue est:
Dans le domaine de la finance decentralisee, l_innovation ne dort jamais. Aujourd_hui, nous devoilons un smart contract revolutionnaire destine a transformer notre maniere d_interagir avec les actifs numeriques. Avec la transparence, la securite et l_efficacite comme priorites, ce contrat promet de redefinir le paysage des transactions financieres. Embrassez l_avenir avec nous et explorez les possibilitees deverrouillees par cette technologie transformative. Cliquez sur ce lien pour decouvrir ce nouveau monde : SHLK{CF_PR0CH41N_CH4LL_:P}
Le flag obtenu est:
SHLK{CF_PR0CH41N_CH4LL_:P}