from libnum import * from Crypto.Util.number import * from gmpy2 import next_prime from flag import flag
flag = s2n(flag) a = getRandomRange(pow(10, 499), pow(10, 500)) b = getRandomRange(pow(10, 499), pow(10, 500)) p = a * pow(10, 500) + b q = b * pow(10, 500) + a print p * q e = 65537 c = getRandomInteger(100) p = next_prime(p + c) q = next_prime(q + c) n = p * q print n flag = pow(flag, e, n) print flag
考数学,将pow(10, 500)设为常数s,得到公式p * q = a * b * s ² + (a ² + b ²)* s + a * b。
a * b的部分在pq的[:1000]和[:1000],中间a ² + b ²的部分在pq的[500:1500]。
# coding = utf8 from Crypto.Util.number import long_to_bytes from gmpy2 import *
pq = 37290153165969298170747767487987767106604956327590459309623310884436645867385405226836923826439760402232182199047042298740970941114757402758035338227352981884345194304183079410512904720516197002459598643659802383718137698974557870280366585586392385470235597777672593360788744398375690898546971801388821194234775373952698134335885991694714949974679482564600815766377388895037809222168800554222619940240853717965637149897765149770956991503459995786889995461520332980787566967767243445754450380553166156028030513979079301998632175402072502016282327825403961392784400687386536170117841528456263456021394359662685873080287765689757030352392386374307257266677811647633925457228036341541693812765785784057781251815707260401922647083928541835257244409503393940374048782722357915189148582407507806733352268172024029303953342827905707727300151171157623562387977156106983516547443642151573456682745626175061369310982040554116369983687552560719792717887667637107087090897681039368534492698712183905213300675019880169669159964289135274268951386122314246699412166656323475268623240778461031327966634628420986855022944785421496251349486099392411145566566437986155875600117002222032846697544656901210849382567936904958595228620017066673190455548617917273881089052468844830306632804733848750820391807100094948772492402636422551350516389981409116121666282434777976293668265700614707939438561465158100805697922866599682141928964956895065357677209698826476508887966210560085802544989199042295263908880764987497015388183619829914488242002252489035055312547747792033076017959711401664024465093007341377103124755426567781873434171576297409356302054965976819782564966567852321032108507478998871390301458143582617644492262165902951270805160376459476885522275531457938661136508391452032625051782015102833218959697470722331233350397631435041061401412630047713991858871735035714326218833998760244965866341087147750123869855038366992182962371334384526411144813368418246803652025254206189223834187719880012103660703380187226220860 n = 37290153165969298170747767487987767106604956327590459309623310884436645867385405226836923826439760402232182199047042298740970941114757402758035338227352981884345194304183079410512904720516197002459598643659802383718137698974557870280366585586392385470235597777672593360788744398375690898546971801388821194234775373952698134335885991694714949974679482564600815766377388895037809222168800554222619940240853717965637149897765149770956991503459995786889995461520332980787566967767243445754450380553166156028030513979079301998632175402072502016282327825403961392784400687386536170117841528456263456021394359662685873080287765689757030352392386374307257266677811647633925457228036341541693812765785784057781251815707260401922647083928541835257244409503393940374048782722357915189148582407507806733352268172024029303953342827905707727300151171157623562387977156106983516547443642151573456682745626175061369310982040554116369983687552560719792717887667637107087090897681039368537631451824008445150593322916621649220131918968381060182780056625981084043051299820111816407714077085179863978735943069017108793879580065214612325438873475463670028900700692331942940752758392673078381358679392924527642317471983718497708036815480999969876652686414859011578133113730930542513696962965675847727315009182439824295556392013537952480748938928408290671107333656277905126915134701713932190005567660746756601077906025437341247344713253422720837604831207936303137369977025954243957891577406266667226864293421045998499026349073973676803568161225217742238807019077558158505566968246373749202724739826733649675118977232613022754175080279658222551375134841038576853604493545070340911086664690452703289923302725433846272032435289554345937247024060157309603467510583043117535674355137280615256893616267247008324272285381171004240649782585733382066689782757882726882857063752626302302445421988032917071576855484653938018800413715950664940531918933498765096986757431159488734247146715664409455285656746712809269599736842704425915921 flag = 37184996108096167233025618263505757153157343097156888579791591678112798126919291822117280574121886798076450090988956975942694991748710209332101082905159257360206646364269758967180975253962825625943696420172327932961625085719678913462057142665457670366149034781204452807008455874986258694889544297820868505385801547530471600056912582928858038944066247597538813265625994454536879142936629149425871030836276097612443965190900147217177268273320302968487288289500066066413057425060274495415705347775452378126322700828792271046010263910271491830733016822853700053524052302275780619672110356657862368196424416287062999248715568046365255257809392739368556770263662626707604374137827085932252100188620626033333675559976574305831148764403296339508944436482748296238651395448197460974036742794395872850277918173344274773788864080695651830624419146757315446431269176300228703998177892985982388577831521216077129479998846266657008240203501406588349129137285647942569321607846013589344817050392650458477423460119297842938591617558953789224928692831245011187614395138305116091095517452781922364575105441246935183151829079785593965595659385764661764536534314109799011221376335166825363745468702289956019189691732841787948543771767552418889945812912952844388135828118570454948482278617042826378637743128777368607901501702388930246381982139634661483616105908175895785968677045741141086145187314146524800384426347813569795767829229399693985449649456073846347751123890326703399205472967773736717062282465272801543616851680865089979007872017576434756441977097817456958807489726277542047228572876003573562220328683701400744899648300227399574965938796721337143228465728576794734241148236493866791812420360737798058399689694043617192496134725512211166304050577572889549976404923415229865890151512800020112421854251196729060158218415862519607464231622361159436715876677889457900668694738243191441657050304632774189736769141333132873006921328644347784442609254582911864794147017850676177776316795316841373510481580805823659839 e = 65537
# print a * b * pow(10, 1000) + (a * a + b * b) * pow(10, 500) + a * b
a_plus_b = 125520294471294371756206159368181409945356030402603762503482456202897533387782094536256610499618557722340156388350652825753139764317331244759764232625886315299606875442745587812532678599409403821368176178124423559665940459376956151960208210346359347886654984646062874450883290186056767079719177407287835346204307512502564043099039957758232483284305934705085260831986768250453454694243836141419616105296901321142602722479489972619458888977889921182264113147746483540050001938721542291553506118731266299 a_reduce_b = 28970382423653526230782087428394120199094608888807510969672174008572263444342743452382065495452410979665183590859836472860381842418270886250846330507167646674351905885014449434182842316793842355041032703945358809543746947830533653096857965009150717206961368552309542092906822247898706652989394172510971441082397663739139074168863166474942514453940979697271097233244125249898829123427276166705668136075753341362350636336479869531538499746880132398933374584887892784910782260556527383469248578187483469 a = (a_plus_b + a_reduce_b) // 2 b = a_plus_b - a p = a * pow(10, 500) + b q = b * pow(10, 500) + a # print p, q
# high = 2 ** 100 # low = 0 # c = (high + low) / 2 # while True: # print c # new_p = next_prime(p + c) # new_q = next_prime(q + c) # if new_p * new_q < n: # low = c # print "p * q < n" # elif new_p * new_q > n: # high = c # print "p * q > n" # else: # print new_p, new_q, c # p = new_p # q = new_q # break # c = (high + low) / 2 # # 250059412706552500264745575936
c = 250059412706552500264745575936 p = next_prime(c + p) q = next_prime(c + q) f = (p - 1) * (q - 1) d = invert(e, f) flag = pow(flag, d, n) print long_to_bytes(flag)
# flag{ddc4205ecd6c22035acae589113bb8aa}
Misc
签到
1 2 3 4 5 6
import base64
flag = "cGxlYXNlIHN1Ym1pdDogZmxhZ3toZWxsb19ieWJ9" print base64.b64decode(flag)