1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| import gmpy2 from Crypto.Util.number import * from secret import flag
message = bytes_to_long(flag[8:-1]) Baglenth=286 Bag=[2, 3, 6, 12, 24, 48, 96, 192, 384, 768, 1536, 3072, 6144, 12288, 24576, 49152, 98304, 196608, 393216, 786432, 1572864, 3145728, 6291456, 12582912, 25165824, 50331648, 100663296, 201326592, 402653184, 805306368, 1610612736, 3221225472, 6442450944, 12884901888, 25769803776, 51539607552, 103079215104, 206158430208, 412316860416, 824633720832, 1649267441664, 3298534883328, 6597069766656, 13194139533312, 26388279066624, 52776558133248, 105553116266496, 211106232532992, 422212465065984, 844424930131968, 1688849860263936, 3377699720527872, 6755399441055744, 13510798882111488, 27021597764222976, 54043195528445952, 108086391056891904, 216172782113783808, 432345564227567616, 864691128455135232, 1729382256910270464, 3458764513820540928, 6917529027641081856, 13835058055282163712, 27670116110564327424, 55340232221128654848, 110680464442257309696, 221360928884514619392, 442721857769029238784, 885443715538058477568, 1770887431076116955136, 3541774862152233910272, 7083549724304467820544, 14167099448608935641088, 28334198897217871282176, 56668397794435742564352, 113336795588871485128704, 226673591177742970257408, 453347182355485940514816, 906694364710971881029632, 1813388729421943762059264, 3626777458843887524118528, 7253554917687775048237056, 14507109835375550096474112, 29014219670751100192948224, 58028439341502200385896448, 116056878683004400771792896, 232113757366008801543585792, 464227514732017603087171584, 928455029464035206174343168, 1856910058928070412348686336, 3713820117856140824697372672, 7427640235712281649394745344, 14855280471424563298789490688, 29710560942849126597578981376, 59421121885698253195157962752, 118842243771396506390315925504, 237684487542793012780631851008, 475368975085586025561263702016, 950737950171172051122527404032, 1901475900342344102245054808064, 3802951800684688204490109616128, 7605903601369376408980219232256, 15211807202738752817960438464512, 30423614405477505635920876929024, 60847228810955011271841753858048, 121694457621910022543683507716096, 243388915243820045087367015432192, 486777830487640090174734030864384, 973555660975280180349468061728768, 1947111321950560360698936123457536, 3894222643901120721397872246915072, 7788445287802241442795744493830144, 15576890575604482885591488987660288, 31153781151208965771182977975320576, 62307562302417931542365955950641152, 124615124604835863084731911901282304, 249230249209671726169463823802564608, 498460498419343452338927647605129216, 996920996838686904677855295210258432, 1993841993677373809355710590420516864, 3987683987354747618711421180841033728, 7975367974709495237422842361682067456, 15950735949418990474845684723364134912, 31901471898837980949691369446728269824, 63802943797675961899382738893456539648, 127605887595351923798765477786913079296, 255211775190703847597530955573826158592, 510423550381407695195061911147652317184, 1020847100762815390390123822295304634368, 2041694201525630780780247644590609268736, 4083388403051261561560495289181218537472, 8166776806102523123120990578362437074944, 16333553612205046246241981156724874149888, 32667107224410092492483962313449748299776, 65334214448820184984967924626899496599552, 130668428897640369969935849253798993199104, 261336857795280739939871698507597986398208, 522673715590561479879743397015195972796416, 1045347431181122959759486794030391945592832, 2090694862362245919518973588060783891185664, 4181389724724491839037947176121567782371328, 8362779449448983678075894352243135564742656, 16725558898897967356151788704486271129485312, 33451117797795934712303577408972542258970624, 66902235595591869424607154817945084517941248, 133804471191183738849214309635890169035882496, 267608942382367477698428619271780338071764992, 535217884764734955396857238543560676143529984, 1070435769529469910793714477087121352287059968, 2140871539058939821587428954174242704574119936, 4281743078117879643174857908348485409148239872, 8563486156235759286349715816696970818296479744, 17126972312471518572699431633393941636592959488, 34253944624943037145398863266787883273185918976, 68507889249886074290797726533575766546371837952, 137015778499772148581595453067151533092743675904, 274031556999544297163190906134303066185487351808, 548063113999088594326381812268606132370974703616, 1096126227998177188652763624537212264741949407232, 2192252455996354377305527249074424529483898814464, 4384504911992708754611054498148849058967797628928, 8769009823985417509222108996297698117935595257856, 17538019647970835018444217992595396235871190515712, 35076039295941670036888435985190792471742381031424, 70152078591883340073776871970381584943484762062848, 140304157183766680147553743940763169886969524125696, 280608314367533360295107487881526339773939048251392, 561216628735066720590214975763052679547878096502784, 1122433257470133441180429951526105359095756193005568, 2244866514940266882360859903052210718191512386011136, 4489733029880533764721719806104421436383024772022272, 8979466059761067529443439612208842872766049544044544, 17958932119522135058886879224417685745532099088089088, 35917864239044270117773758448835371491064198176178176, 71835728478088540235547516897670742982128396352356352, 143671456956177080471095033795341485964256792704712704, 287342913912354160942190067590682971928513585409425408, 574685827824708321884380135181365943857027170818850816, 1149371655649416643768760270362731887714054341637701632, 2298743311298833287537520540725463775428108683275403264, 4597486622597666575075041081450927550856217366550806528, 9194973245195333150150082162901855101712434733101613056, 18389946490390666300300164325803710203424869466203226112, 36779892980781332600600328651607420406849738932406452224, 73559785961562665201200657303214840813699477864812904448, 147119571923125330402401314606429681627398955729625808896, 294239143846250660804802629212859363254797911459251617792, 588478287692501321609605258425718726509595822918503235584, 1176956575385002643219210516851437453019191645837006471168, 2353913150770005286438421033702874906038383291674012942336, 4707826301540010572876842067405749812076766583348025884672, 9415652603080021145753684134811499624153533166696051769344, 18831305206160042291507368269622999248307066333392103538688, 37662610412320084583014736539245998496614132666784207077376, 75325220824640169166029473078491996993228265333568414154752, 150650441649280338332058946156983993986456530667136828309504, 301300883298560676664117892313967987972913061334273656619008, 602601766597121353328235784627935975945826122668547313238016, 1205203533194242706656471569255871951891652245337094626476032, 2410407066388485413312943138511743903783304490674189252952064, 4820814132776970826625886277023487807566608981348378505904128, 9641628265553941653251772554046975615133217962696757011808256, 19283256531107883306503545108093951230266435925393514023616512, 38566513062215766613007090216187902460532871850787028047233024, 77133026124431533226014180432375804921065743701574056094466048, 154266052248863066452028360864751609842131487403148112188932096, 308532104497726132904056721729503219684262974806296224377864192, 617064208995452265808113443459006439368525949612592448755728384, 1234128417990904531616226886918012878737051899225184897511456768, 2468256835981809063232453773836025757474103798450369795022913536, 4936513671963618126464907547672051514948207596900739590045827072, 9873027343927236252929815095344103029896415193801479180091654144, 19746054687854472505859630190688206059792830387602958360183308288, 39492109375708945011719260381376412119585660775205916720366616576, 78984218751417890023438520762752824239171321550411833440733233152, 157968437502835780046877041525505648478342643100823666881466466304, 315936875005671560093754083051011296956685286201647333762932932608, 631873750011343120187508166102022593913370572403294667525865865216, 1263747500022686240375016332204045187826741144806589335051731730432, 2527495000045372480750032664408090375653482289613178670103463460864, 5054990000090744961500065328816180751306964579226357340206926921728, 10109980000181489923000130657632361502613929158452714680413853843456, 20219960000362979846000261315264723005227858316905429360827707686912, 40439920000725959692000522630529446010455716633810858721655415373824, 80879840001451919384001045261058892020911433267621717443310830747648, 161759680002903838768002090522117784041822866535243434886621661495296, 323519360005807677536004181044235568083645733070486869773243322990592, 647038720011615355072008362088471136167291466140973739546486645981184, 1294077440023230710144016724176942272334582932281947479092973291962368, 2588154880046461420288033448353884544669165864563894958185946583924736, 5176309760092922840576066896707769089338331729127789916371893167849472, 10352619520185845681152133793415538178676663458255579832743786335698944, 20705239040371691362304267586831076357353326916511159665487572671397888, 41410478080743382724608535173662152714706653833022319330975145342795776, 82820956161486765449217070347324305429413307666044638661950290685591552, 165641912322973530898434140694648610858826615332089277323900581371183104, 331283824645947061796868281389297221717653230664178554647801162742366208, 662567649291894123593736562778594443435306461328357109295602325484732416, 1325135298583788247187473125557188886870612922656714218591204650969464832, 2650270597167576494374946251114377773741225845313428437182409301938929664, 5300541194335152988749892502228755547482451690626856874364818603877859328, 10601082388670305977499785004457511094964903381253713748729637207755718656, 21202164777340611954999570008915022189929806762507427497459274415511437312, 42404329554681223909999140017830044379859613525014854994918548831022874624, 84808659109362447819998280035660088759719227050029709989837097662045749248, 169617318218724895639996560071320177519438454100059419979674195324091498496, 339234636437449791279993120142640355038876908200118839959348390648182996992, 678469272874899582559986240285280710077753816400237679918696781296365993984, 1356938545749799165119972480570561420155507632800475359837393562592731987968, 2713877091499598330239944961141122840311015265600950719674787125185463975936, 5427754182999196660479889922282245680622030531201901439349574250370927951872, 10855508365998393320959779844564491361244061062403802878699148500741855903744, 21711016731996786641919559689128982722488122124807605757398297001483711807488, 43422033463993573283839119378257965444976244249615211514796594002967423614976, 86844066927987146567678238756515930889952488499230423029593188005934847229952, 173688133855974293135356477513031861779904976998460846059186376011869694459904, 347376267711948586270712955026063723559809953996921692118372752023739388919808, 694752535423897172541425910052127447119619907993843384236745504047478777839616, 1389505070847794345082851820104254894239239815987686768473491008094957555679232, 2779010141695588690165703640208509788478479631975373536946982016189915111358464, 5558020283391177380331407280417019576956959263950747073893964032379830222716928, 11116040566782354760662814560834039153913918527901494147787928064759660445433856, 22232081133564709521325629121668078307827837055802988295575856129519320890867712, 44464162267129419042651258243336156615655674111605976591151712259038641781735424, 88928324534258838085302516486672313231311348223211953182303424518077283563470848, 177856649068517676170605032973344626462622696446423906364606849036154567126941696, 355713298137035352341210065946689252925245392892847812729213698072309134253883392, 711426596274070704682420131893378505850490785785695625458427396144618268507766784, 1422853192548141409364840263786757011700981571571391250916854792289236537015533568, 2845706385096282818729680527573514023401963143142782501833709584578473074031067136, 5691412770192565637459361055147028046803926286285565003667419169156946148062134272, 11382825540385131274918722110294056093607852572571130007334838338313892296124268544, 22765651080770262549837444220588112187215705145142260014669676676627784592248537088, 45531302161540525099674888441176224374431410290284520029339353353255569184497074176, 91062604323081050199349776882352448748862820580569040058678706706511138368994148352, 182125208646162100398699553764704897497725641161138080117357413413022276737988296704, 364250417292324200797399107529409794995451282322276160234714826826044553475976593408, 728500834584648401594798215058819589990902564644552320469429653652089106951953186816, 1457001669169296803189596430117639179981805129289104640938859307304178213903906373632, 2914003338338593606379192860235278359963610258578209281877718614608356427807812747264, 5828006676677187212758385720470556719927220517156418563755437229216712855615625494528, 11656013353354374425516771440941113439854441034312837127510874458433425711231250989056, 23312026706708748851033542881882226879708882068625674255021748916866851422462501978112, 46624053413417497702067085763764453759417764137251348510043497833733702844925003956224, 93248106826834995404134171527528907518835528274502697020086995667467405689850007912448, 186496213653669990808268343055057815037671056549005394040173991334934811379700015824896] Bag=Bag[::-1] m=372992427307339981616536686110115630075342113098010788080347982669869622759400031649792 w=274062421102700155372289583695782343443 assert gmpy2.gcd(m,w)==1 h=0 j=0 if m.bit_length()%2==0: h=m.bit_length() j=int(h//2) else: h=m.bit_length() j=int(h//2+1) def pad(m,lenth): while len(m)<lenth: m='0'+m return m def keygen(): pk=[] sk=[] sk.append(m) sk.append(int(gmpy2.invert(w,m))) D=[] binD=[] for i in range(Baglenth): di=(w*Bag[i])%m D.append(di) bindi=bin(di)[2:] bindi=pad(bindi,h) binD.append(bindi) U=[] V=[] for i in range(Baglenth): tempu=int(str(binD[i][:j]),2) U.append(tempu) tempv=int(str(binD[i][j:]),2) V.append(tempv) e=gmpy2.next_prime(sum(V))+2 f=gmpy2.next_prime(sum(U)) assert gmpy2.gcd(e,f)==1 sk.append(int(e)) sk.append(int(f)) for i in range(Baglenth): ai=e*U[i]+f*V[i] pk.append(int(ai)) return pk,sk Pk,Sk=keygen() print(Pk) print(Sk) def Encrypt(plain,pk): mbin=bin(plain)[2:] c=0 mbin=pad(mbin,Baglenth) for i in range(Baglenth): c=c+int(mbin[i])*pk[i] return c c=Encrypt(message,Pk) print(c)
|