HITCONCTF 2022
非常高质量的赛题,其中不少题目是maple大佬出的。只做了两题,但会努力复现其余的。
BabySSS
题目:
chall.py
from random import SystemRandom
from Crypto.Cipher import AES
from hashlib import sha256
from secret import flag
rand = SystemRandom()
def polyeval(poly, x):
return sum([a * x**i for i, a in enumerate(poly)])
DEGREE = 128
SHARES_FOR_YOU = 8 # I am really stingy :)
poly = [rand.getrandbits(64) for _ in range(DEGREE + 1)]
shares = []
for _ in range(SHARES_FOR_YOU):
x = rand.getrandbits(16)
y = polyeval(poly, x)
shares.append((x, y))
print(shares)
secret = polyeval(poly, 0x48763)
key = sha256(str(secret).encode()).digest()[:16]
cipher = AES.new(key, AES.MODE_CTR)
print(cipher.encrypt(flag))
print(cipher.nonce)
分析:
Shamir's Secret Sharing,但是明显给我们的(x,y)组数太少不够拉格朗日插值恢复flag。考虑LLL规约,具体还是背包格的操作,注意为了规约成功需要给\(x^j\)乘上较大系数。规约成功的标志是最短向量的前8维都为0。恢复系数之后用CTR模式解密即可。
exp:
shares=[(41458, 3015894889650529600470920314593280408459518223054415623846810748413393737686521849609926975694824777687791824408686652245102687392987299828716863372946074882798754477101786150262288970710451710086966378817944448615584285684364802621112755627795146504720812935041851556318832824799502759754100408717888912062197676588256634343721633045179136302533777168978134770315363985448879229514802330846792965525004570768212871252658334277172395338054448791891165981203069346039654617938169527772805687564575525262812469960675835101499054296722994451502140787064163668418661661374437567033971648550576296023422536253955229), (3389, 188433716494377932944071544153838579057591833387651830021721770473524507947811754295899393634645349682360212761145039355690817927625249659010181081209481357850193656763556243022791637306094953982811471415645267589939465925098159204147714779617946431727015863707468081949286110249296858079354949234074465541940264775783884708819566758872542606519408358277173683256608326688673226933790117016596834640875497643330432185114931410656582728964222203181026468387428893233826461), (20016, 100434774699078525844435127144579870564983915777345068724291926367405061427748836490810414860997895358378538088786283372231649911113841061354335739776409724471256377867811133591349442950556374825868587940833009529662869081130218551306459690738900795035660420986807973542512081415453215211908130387754214098414826747340962722685373241806099462750595976574593799013733614097923338311883793416643213898201680852118540438376386415411317989072583126108177482838299109479175882214603698768498421016054035672774286507312986602290254323930575001551875601243671354491241420409219), (50683, 444545881882748849210617532697661279371689521082184772844723908765173319859389018743414369945234307906596253496624659734919646710483514374218993496994560985318096082923429834553341897367168830049334302307406087637232329348570485341223211629167329394484624055745054495405880099706580380696671879365741197827080224977821589102425678989782880274304484630899425664722718972847034030888019348402685383311095030884356731112886316823960378572796288532824588478234949384868912708000223119984161992105752059185137674711077940232530298853451166664700609238496874366152042676602089571801873748042888046623717879084695143810047335029), (6445, 101461065764578261241074518788237888467081270902741849861528201922043223477790661159690684156056890167304291810116447916457265705130707166062372766839626095333813681671546097679623755546322833727082145873422243641505450049118758544298328784536759107951763715458884889255549767465897671061295486677353893450789955616926292534325337544782386120469581214993770910137353221116457111551538222138388416162630076391624447865248920466274175229034129561913505977209131490066291917549232913771218316393849495621818397), (1359, 301175604076484656987097022479686300460199620068959954988990822483114048418823291831080744590394713639405681060973359346474547015206086229256524657214311815578895906855833813636970640902962286472992468394831014254279137613828904924898823470285520515090889491445149243620044782726415898188702226878029241518020146726699446397961112596830223444821094650508662477147134721631935528182772284099429814417490160457082241680661), (45286, 244867719210730952183489456726726432791149629831242968845409984537752132549250274779516590253042559196452609852176114909791657154092483479876795482861784431886143414585698773882088948703730268947925790809436449512089696895048994874003651088538416399435467483409931121063976149037130454114161175715871108284419975118570732022104749321213013756795645219060997019373915339235627535694458093194617642834806820772479160496966470147893963746139947337914575231526069667124822677688977724313174612816604463495630041075005651663546036363128325535621487658461744362098985183050127661470315454320073092665472364666768205258769), (5649, 4766101906865350375503575239791521167258753430948472304582908507542293595346756303331383584550516424087839316050412570112796817549423179461056531056102741963677007097061600281918678364910813585444151640384802648969082273001142879806475184857246441212406056540028447374033197873299250076862108042582790928405869475508762352345569281589853917902601519294573327847401601789315980414998055948162169170771240383220643819333682845459742335249254576151835966500230706707674854493184181354958093926469960861)]
L = []
# 这里必须得扩大x^j 才能正确规约
for i in range(8):
tmp=[]
x = shares[i][0]
for j in range(129):
tmp.append(2^100 * x^j)
L.append(tmp)
#print(L)
M = matrix(ZZ, L).T.augment(matrix.identity(129))
M = list(M)
b=[]
for i in range(8):
b.append(shares[i][1])
M.append(b + [0]*129)
M = matrix(ZZ, M)
#print(M)
print('start')
solv = M.LLL()
# 第一组就是解
for i in solv:
if i[0] == 0:
print(i)
print('done')
from Crypto.Cipher import AES
from hashlib import *
def polyeval(poly, x):
return sum([a * x**i for i, a in enumerate(poly)])
l = [0, 0, 0, 0, 0, 0, 0, 0, 16876298701281144467, 4341623479214198629, 9201397801953532306, 16204350779251421655, 7345694695627297185, 9043033823256673136, 13493545904865138327, 2528656505346190391, 5860787621291874225, 6911473480019821660, 7243049348656678008, 15582139446035944589, 4898759005642311623, 13791107940088032965, 12202568751666342068, 16987321544504012245, 81059762722874258, 7300483918734745424, 15522853686464250250, 1029559960397028677, 12494803888399693048, 3734196368338715525, 15876183448428297430, 16128996156529178645, 4948741747165821941, 14842428818718442113, 5559834054321886198, 15728109525492077240, 9769628437887116864, 9965299213511216432, 16259271979529821198, 4229013624431837547, 5351526237814543513, 6773957888903744354, 15645554050981602119, 7948327242954695525, 16879408807485088820, 4028678427431584477, 4809288965140723749, 8081529126186710847, 7560833815277423481, 17204735409055418872, 11348195481616076967, 1216578903694340432, 5872332661386383894, 13414321564692773665, 3519815358731143412, 5120611231903772726, 4274699638525163443, 1156680578665422810, 11533605743510980247, 3262872174220935935, 14556822122593458142, 14852936183989110748, 5260815632225305836, 16724519892340136538, 354608512346660782, 6315123139620427930, 2090521840274083881, 17914258078059478594, 8915266026793545520, 7633550742675101743, 9306196833324379048, 16775657501334402922, 10068962090850430903, 53746211197164712, 4153332649563623090, 2345418168814011449, 9887295388060984536, 618922458519797218, 11454815375689330253, 7951472701497910031, 13924576411140545088, 2847759873854470776, 13493139746901263185, 2449153562558820340, 17244128610087613349, 16841263615562893339, 11821681183043089029, 509027547159796581, 355856489167137322, 1690661705662377094, 3787045116088456450, 12844355662392298492, 9983113560564770896, 5069848799053711081, 11137625778284499577, 7836696626880825407, 14387144355632294030, 13040653029635159169, 8469174034864633671, 6441902548654130006, 1054167408507924626, 3297294965843274745, 4139569188640819500, 530116604287271342, 3790498327282851437, 7521471263757737841, 5547392118425333225, 1929920249747932991, 7902611611979821251, 104476927105896567, 12906275653182030863, 5475144703486940934, 10700443736925473174, 11218183961955369894, 11666617398898960015, 13807357350539883877, 5182212691681791674, 6826440877850042350, 7876617494447104127, 16565719315945899133, 3249206776894505732, 8291312543867747874, 15719222726003530388, 7543295826642959012, 13378331951002428824, 18201617500757492128, 7308172856848374280, 5422570462453015583, 9947318394966047309, 8085486783658335213, 14650296685926254303, 5491524275106992252, 1882441946478942917, 4296575711662619838, 8322461215449306738, 10191503544855118944, 2663837216318969053][8:]
short = []
for i in l:
short.append(i)
print(i.bit_length())
print(len(short))
poly = short
secret = polyeval(poly, 0x48763)
key = sha256(str(secret).encode()).digest()[:16]
print(key)
c = b'G$\xf5\x9e\xa9\xb1e\xb5\x86w\xdfz\xbeP\xecJ\xb8wT<<\x84\xc5v\xb4\x02Z\xa4\xed\x8fB\x00[\xc0\x02\xf9\xc0x\x16\xf9\xa4\x02\xb8\xbb'
nonce = b'\x8f\xa5z\xb4mZ\x97\xe9'
cipher = AES.new(key,AES.MODE_CTR,nonce=nonce)
print(cipher.decrypt(c))
# b'hitcon{doing_SSS_in_integers_is_not_good_:(}'
Secret
题目:
prob.py
import random, os
from Crypto.Util.number import getPrime, bytes_to_long
p = getPrime(1024)
q = getPrime(1024)
n = p * q
flag = open('flag','rb').read()
pad_length = 256 - len(flag)
m = bytes_to_long(os.urandom(pad_length) + flag)
assert(m < n)
es = [random.randint(1, 2**512) for _ in range(64)]
cs = [pow(m, p + e, n) for e in es]
print(es)
print(cs)
分析:
N1CTF的dlp plus。先假设我们在有n的情况下能做什么,把cs里c1和c2的逆相乘,就能把p消除,只剩下常数指数,那么共模攻击是可以实现的。问题在于如何求n,基本上思路类似N1CTF的dlp,背包格规约。但这里直接对es规约出来得到的组合系数只能保证让e的线性组合为0,而p是还存在的,即得到\(\small m^{k\cdot p}\),但规约的结果有很多组,有\(\small m^{22p}\;m^{-22p}\;m^{-p}\;m^{-81p}\;m^{82p}\),那么我们只需要将指数刚好为相反数的相乘就得到\(\small m^0=1\)了,后面就是一样的做法。
exp:
es = [5079863274432613129652097264418996777847111634334997559197124983402447941465297015159231461748389793672000998292245927837845280518444183316572514431428012, 8903503011589875519020082311141303298577328899379557718226521775241284738826597181944326981363953007372933082363342602211349916840544865094550123031022700, 810078503113700404115612949501346868450070733271529170185798157369214946817681783208686089533635163730354884890418573874511294837427707136315613429419362, 11998346594087952543093777398698083101377631708112235206715618248409901396939250841629826292424887121270784898080691564291358237265847609657325852869346144, 2955312571204942362703042302258009024276741063115913106854968498100953947088019169684832323569137066981700793844230839986610619801546530789027883788517143, 11405714913452161309626243937496964898978177595678344229401866252609197764006011027498025066526049167441577042500236035198263901190898860845679070763873522, 5202698413748933882280889494475761605389575211229503890450480264820804634979316063457799162128406305182044884965409134684358548614269834445343189997485427, 5657999605333685815169204879447442322390476629046240974562616418730076667681353665710037822370413942194015755061290856962554579968111703703808127931384085, 6399007732510610215714108501924567632175065216839318864802885166764687927307434376125986399488157502786491164716019734776812429964665278461205109746917850, 10026326436529072463148485070400295317355017960329044514800778016845066528225850514818975438769142571150445122956487246774644601991649280692431867712418219, 12005856506867046441581048432445566020842491244470366079076602625602380693669538975213153359860286029022690228432181277866088100771734085992230316710705932, 10509442367922318061842595637429122814246472159876176250357400320363439326870659310875257439809240676732864199470263253077766595063778322273579956604258961, 166377138308687247747635582482289514293411024683083488359565325172681650722894828186801019028057141303994252410115621200415252485059436110432591262871247, 2105780378453614718983798727339131922802135053974909014096810140159435889598614679341532441780926903596334442638475608525939492037503660558054547833112830, 11677909339933959328950323513522773534091527644855569779814940852225705294912055220393155429257635488679445503904187272630167276630167854914545096618509394, 10265091562847896613436164800522252270029946518367424564431941427406758622443916422288543111195000975907579293859025701501486746251993134812097647130919819, 12891172085430051795558343186756432237478585685285888264503065273846622241811687539080571683575531608529054116801345319430227222186539781214178837380689937, 1140070072511802240375137631015099308243388035212775224768241918520097274121318137648351232160055128882841376337736795004819042928398532117807714779151947, 1630396253262738899446795017575636416651275942086001405395540670833142656634147358714744033339155052682386589799284617538519456628099822793639270582534001, 11664204007120796891792946501603383361201434143812157606626513190015555843292506541062897865863456400645830906536878503756121060840029072773681888687818192, 12953338504481193461122573174033906422583932721726767116265344346638348075562685046239924002259957380923248744291814927144839391809271273368578176789835562, 8412121751244408581489518904909980952317673205460125697378185861465728214757146920613058610748196488502226722260727855287624009948975816386491828237425477, 12651514204083473548909227796476857256905152321069110476147773450363095748896155569530802583875165954949185563820956284247016639138989802276815428726819836, 6975089010799054089964735627929102196942378751858175766821132100983565095674340572712975659930064178521012084797037281960945957854862556717436614601481293, 7814907109335276110461089930387154883687982085702344101369784149105969012654694719452822416479484946427657273791759562921274192592759481914257598388333622, 8884607868146981456632880701143397516760114274447121094012066740877620397972683056762493749329590934522967845933211513879829342214986756594802584884157349, 10929551535590763299012746322698292570849361232219970134182464952173531486553182453388717176427424675922971508360042565847530314593934661349110796629199365, 5694057044176469199508761592187745493195268716147130763446320096086518272768160602309610820934401488257203830865790354650013558644582813000919880470275700, 2114745449337577194729221105620254541915594563436529758178497663445098031340820050955690953237833815266028765284079577998108707768083861705943396167882442, 231441365353436866084007699568995700576816457908588298915420924086698235994498541953681075389217734610174282727805078104633013169714098772282780002070856, 13239007012045013430194850759899700784688149205140155930053358194654925277078073093068540786473990945208371858677844048995435511650041552301549406567235319, 12680081118914146504671398759372731237719453387802875547245817892348679019076154879329027405667510756043469239737251985274585099670725120830916084814053911, 9483491316816706071664293364138885890308327998410221369532596356300519441367104846326869182094135750976277769875118999020434213915754039372107919403088310, 11039200010205769655289663258663389918729076817434144454722382236522376751175010383701401982634631712342701945386223687194359026384798436387881693810220706, 9052040670951598645297144376844945439015259439072613354943358050631507155078630464516962003389675186097446236018726148628123179790633322049091993068259657, 8091186962224505980406641693775978669149957962669881072616949832580564669979840574884065537137790097302525278542211590891444125879967874009550369242103702, 8306699036754332947706715424832315074352749586745231934510417641672153738312361393740102791269140525336140836066358120400828731184957578610818207046455426, 1466313794473948277309517150596983839163150353101365541465229695746434417524182709079067880978258890306981390953904005653927366478806842643012653006402661, 12571793360822117850419077735602678429810199743396515248903297460723143127033426388383466862385416103769810789588472625779080240334522465289702743069310694, 2158076728014736743755566735010267099539658396688225624394003538637736687637217150192840514677751001810821725610238313043197409268362725765272027746026024, 11132027345218738779743450978073013197563742238675283750060935403962038656178388591950806590126283210022067664081328913303035238391159639563092095719031881, 12987410143250153848653856756418609003288516933418473598813681158481671898962904339530962420890186795039269421982396999423084824322306786776774116884437290, 13403379496489308982445686309097785258953302776121956147130519200352039974601372665574037457949812132249298495781232924094006416303300878657245100224154171, 9967276015101098827826178738176037345594367878103575483312618526546989123123657901376062209636424649010796995748103177886430569717654972940584360610923127, 6356688171702938004179216899142755797450936003881305030328669134685539239243689682581300832398685232779920349883017946991885312630250033951799906319181340, 12057921539869979656060618692822667520262806033023792533868850902469818093426675270752893785379751616837787452407981339224192817826352297459371831881777358, 3525863852947069014852514208434414234023980477834408137066615439290431997571597827999970744362312745888091236593282658567106969524811115361932473618217771, 6344712592985416560423178464086320199621232433208898804172931411965554109977125399245805430078669639319941437278084286809987460755627350063793089910854606, 11683857679297512831429424700319081617791684927417261288061693554069044991809824854913621398629576396444917633967400261961104769787428313633651634622797769, 7792480308251619956648434866603875439726970530104327934508226730818936063705611642757335019437055611618385862019162037405532408274146334593464615813583597, 8422480111336491990630059969437646385700192011634768568173908805534516593978882601947453527023995406134860303242191570815166715091495384793749128971611406, 10502683498594573499891598017078597914718487203828172092088634585889612060090137819993910858172300184618703366842488817707382904016813641625863876575006997, 5940751803709930035237511235396768688216765343518733285505284394863214288760303579711257414455423056403313307422101218793050186145714927867677120025919199, 10716927245988327805129531613003840523253032360837264295995978017923458852022355938381935329309747776938237058969541058503614546311924406072107555517514044, 8089396324717123841838443361001864980734651059303501334825432430140285924733118517009381249576088043865241411967739663946648140936900903275701328794099300, 803375845708994030293324395768607058384512071816847430064840663221991169612122569195439530834798473215581725869394938912144003553357448743574719702979164, 2417980818305878188677126070765530925891701566674704423338103174407240773399103138534790960735538671618883312867600207527982495253572693120248015889671421, 8649733459238960982083252223848553029726952828009833492023337866934779838698842819321101275541924311698657797395009869306722098092209821256837967050332612, 208330060900654859925260071826411648609337673909778553242241397598287718888300119510790695849054113984922401115541232542950480349552769790988493994329066, 10322081054443083920153764829235971283085950517689600004006475295735929425119385980645721105626536569129848759401358706030971117982739337019614614924928233, 4716147416396168714154228299398396547749843674335209925696461016971822651874425334549720688093794710586427059416976537120179659507732947468837442955419968, 9009206013337328202732736177606311909716074596876257537316107532091043281025117394712046971444185514966640900328577265952181248688718284969072370794188666, 13322237085168146757182487336447638611976232798680090095666521096834982945995397227113061858095860924873741796223064409446533413009409867440106215276572745, 167335195265334273987099562312455385859589597300266850130298304438323847273686727155876528781589029913492792260023711139335024898307895729258931805737489]
cs = [1340428282304364342582665165194748707635813797531561083383406608515377143449795866062844295415776309167525958657460434296122345273680276529608968292918251068313214729690331782862758732554242318318011202746667455940986323222954543304373634413205440872809945630087001577981704222687702689005616030207304297463356114682806664548567259832635632127617547358935861899749511259089149539893862561133000512544726484111118296875383264559102357162781528463609339347937641458145858288458571983766841817157512643073669481012576160481323199457521682009798578104867153483836273012157821969941250977961656905573210326095180119085850, 4559491800282685031373383914483081855710917028475523406886092297712442827052155227578232897503157454990891465371576314240095633773069474152711775770512002056402815542666753237099504453362656282068319751512956734058271239235762701439823772327169372200855674499192720036526031806752630602903779931405746099525628423421359859064016326306665873599448273422668923755632784654715266759587548479031022770383086347333534319750840601656203170312156404548880303053197514211719539337445462967344340934778241679807283272286501563193187297158298083943139600043411076059620686557983102922388838555592736620455320374470975749225014, 17031516082322946074508089725822199222097545883201617283685408719484264428110457900142757738687494812109472697087939413886608501156300972175084024814153733681104374474575266039998770167944630790472160764404023462639881206733248304620978797480564701814429033865119898024881028604176304082667480190721220539612264479899628274697883922072850710863973779838597428079876772782625219102915397129802590656443679549995434383662918653221927450075818670460382862947633019698613227661613151679687641347997337952580492335250800715572679882292728206883833927367795267175376291596099603064985252763794864090381749198967024770866179, 3694724655521120956780786981595209817448023110615940436040966151385289878328943137211899731954991418151017163043032325818489322082283112102168329026541181934311641220560937932664355274225324647847913668895835653576004574641296319047199553573479130243917503363838321043830682091212921451326599743357073700635875306126444022738903666110966007767324488337904479179562704193653304331015438700014525795808187029881492540429448244617182602958015735939517377185899746596064939879352874100375480232538998565568347761032547480991919525304285539410546343014331914147279542289703294164403424287867329377365312889592485818945621, 9027100562163049207724492610972184532279447867696111215297876729524514578460782264465178548272521289266338164307601883845369916527966726111544601493078803518547085271897659040042920411772161469946645928436410956693581646659305742583366449195082224131989957456075418212157482736836854235293710405211468343830065310969312550771668811019498206794734765220487589854989460444581856005282672095279655384930588867943876984476816227172331827532458822898991956288440949331253257263192025291624606117284648522335522931893864480154325395096493496955510445746729049583031323646992833379535241084770321154877703647495952592484817, 14211546299797380054687747335829322609227571481894038188473378487919957091929930661244664726308048855142332026323246719732891398507091050164749225516160247453894604721508269393000965547439405871605942299535096186784124680058327558231481226268738944346923116717844406659733594811158055280163861217281408963901519070099047264225606750500693700654736907634917397155429689060841045873900608891928686645784931132268055618027218570463003358511364584464654258491222435951782481333800145113716654039306097226662505403820400989709994784764870615358547005130846947772730498068942342319037115361378276371857208188905016780400706, 11500312731143761673574879195125152193992124003833490519551296940083990094771671558524865643965093193850239474463305892954418803531479765143491897541081264293971351028658723763279925641124224043142082654671043614781142080833354052757844808255868635017826876839835921616283738016328869865286818981934707344847279211739845425059190912633447653290305910552698589094498259266075272411065408494311347022078336934055608536226793609143962279914164481400776503857796856116245938417446533368820933582932753072658433734519281283751080086905392625531977315344433628692463542224526860492119297848929295346074568302979289854602464, 9046868396950587447280018392089796627771301809910284859639727543260972843504614611911871027161012751768012862048329664833191919985443118257357212801097181162832820364920527466332803042811067062543207929551552293272943281964720087739888920808760422810720628511179913600621810344492672354864325849572045661171836646604095786975372766970532295769332080977189156718569205011302717577041796123166376199000536074722974355083244173937734230002749479237169509283717376017522807899600076026514198502996001272651183982577620056815981323282587224783904450760279508721755271743768107512478057718439668091619915028146574102075793, 14631867094987982933815393176965869457981016903518102224949303148416827510976662995395220073684409143126828476914962375182335108199292851174278028692214484078857255589883661665469791401299232382502994925624922025333999349195284835042225515241157805995366927931824812101708247844793305539436871159657658725570535305001450959581386665261640776623632838012255346475010577590082954476601080352592428132993371368277519948607589840878769396711259178319402591649220447454468080232285987619114517149009333446199308600052686892767002717284347846221044158368994447841089098096951642885223158971874585095851336668144132505659993, 5599810461536102452406194520411422606593905287895050632592302269952520888130781931163136557331453958641064688590620176850335466255435613919861120546713222902954779079869434817770299288004049161626370957354120569366815807706156492949562789331529440841718386855879121476538783166531892650855331655929180079184956404891353741254489006367618476468819048554975749242549728821598700012054269606969100585616123629318517208105060390805826468326386126771643830655848505503797043657261087302488316332453284747200270180880576817241041684637497275482545736622070992443066884028103173895599741604326372962206946167612150671627300, 8982773382133267864552453960999017571870614607211617106526031149679726665648109484590090334212355876232783558881860547828093963491292980039459610991613278895434144079615846075804673235302138909972714143973079375508372184910906893286782342725016210609261833852562512216006182844575876793348727370026890251611654510819058175748552901686002234391965359724726820622958221447294337190169554173373308335793667853901395900459799569062564944340667088822685902826983007050811140658757348184970013729905460168438636745101280870101530849866128609637644997805521792758531622634601243512609162235962458598843516007378885131070368, 4776714037827754377267620098928144906342242801705050317672464867593162071811785251459168192745326768131021370178054239355607751165519204646545374618914898671232367991590988572103690506647785285646543661500489067315028264506783235162057901291705131483167672660639765834204415161531001579375984775883821278324668771921659190308280657418220051598614511027675838906135199108617277879466291726356308534577025457656359973766556208006477058168347655582156582209333386218191297491975076190071490054064729724645567908642137924838498823689164958175542448237728492877213981298871854567480149891215134861610463708620733723754390, 12955996545112644740917803866248369882937630524241090686422582826252381963521275910300210634728556905621094888477668700310904304391876625487025689322456576766089997626616681352495462412331913712456289324223074497358205915609916082394137187967148644539369318800053690747965337030638127825144588949463447737270746905347499327148251416459938711516833171323223823316473987217130775624012175220351542763634204289561484275871164919923020791140752088080261117433329492164326655572470598858223563007160456881616406143569573171841783319223101831695683852869718632090381685883740919357766216202610991378093314839253530288103206, 16901016736199862091793794814255540931299048112622694456487780121613552402958648605258086553950690042815945756145868970156469978197654069147872188522834581570050093546520460771627412487785712292148666080957149405889622087901948729500191031659280390567976958210359952764675265768231662381059747549465437784503412571333637978859041246487865240295637162206471776881851699650993050617454460891295540284045548444601892899945039528016529111211088915175646118427377913466428304423727535946125474776132370966346036843764760459524907615766671964336828723349435797418493281181205408274567376364860840238043139559495691426991290, 628594822240131211142367954593899735116648972762470364057743893228782026645587831337238803449861303862942572302920757501201800076068743316950092213943034393279348396829283729962664391203807974500545160573470003418189178146823163208726262456728294464439875417626625907303169050197821493969212357198547729953416951427482214476844317238819226965608519625827384088190237200870538308920869156531640895937378867668135016529262119722673097338031206673632314616546922015416419687699986701480730334141960299843757660319468466662586255837844053535126173329388608666839066356049240945629863404764810815376949831344858547885557, 4693852674935499214836852256353955826813551090140796589047406822639358285230654121988095186959533907374160971506840710200662704183090087059932703074990064381342230277971232084632728790784835176097102813181930702626989922854505537881224479221811691643982477591509091470952787560884993189567128841729559705479088057390142774638662964958882083517865266881409205906009241875028552287199326988841123823501594770259534741474527371887331138212070139041334099990817778535408398862575304652025985799005588062694680549700020658873060040637400192069396857438709572174520703295247953002996112392660198897571424363322239165568663, 6551211919277628735513153921466430282539607401995963221587827960616318763199470632202691178343122002680154701339366896586769036964459538123967454045153700461656448084445209834657174977857443805737594976830636925223968315276899510735728755775873798356660503200350934823151227987214708415154599356338964105903553655496668607616201435529111715834450743821434250352458003241234690201828485690936396586533672468260678207693852178236144841302789345846607968939658583460888594530680277339965422533305648554462087897105680260979715915979285652227504415080999280747403033588278056896810300901285822800506588462416119431318853, 2771687088557810024619598258874619064833101538329762188090344538708400409828607871265718970303648970813383151498643491811125867550945171581660821704878943751032306446150424161708601165175671753701045606241610425075347501358764099441179129993037375704732602299419152963700137248139425275347689231650696071182722098006198939220688852266454832105188178018088934431347261842909649653723917388230117419720648134827316261910503911261568700336368664723223059808747750789653690897290468206625663032117551557597900487630446782475705376347771258476480004331311824444900105921549691395452519959723495805818459726906514297777183, 14410453705443544583844987735546532975525637315633782413099087154228526825359126140034972574260238018057699491087341611729336578926702379566436138469229312145827699035524711503934094379209930508142003308676167028952114272063618632205552196066295425887241611793575862158413539048828614726400289527911527145200550925081663034260024102015693898867611049019999957516006730505516302124560799891409576324031898853723635240080262721745664176554312800734850473545894958802021915355616086871215158180763986548302207974637997744927308664074921479975384493661122442107438682671230335456565779352770766760249417895377927584760926, 10446624851648419972252062261057733216144480623940757145999978698764332711554019250787662803039478615556730313844391447630310193927221307745888438506833593102503036142199129334898276552105720907232748816506776502870959671942819077249165547003131656655528855456945934706825041909492585755289885992746541903253726640015194979680594752502879084322400026056697922908404127655519517457792649648225569738467290650832601586273641261173065399903993051224388178681145138676428774652242749496343867312257338774962338700540278001117754077522136331395009562823300188826311719552467178990283801346005338754084567244436612272960974, 16690941453837828142672797826999528793572058939449626000016160634524847664981364572134530175715377075340955464979602572365909154054659084854364971640312556939657670327041153706196646306989832597065568310974436806653023435896488846033392688924250427966043310046269100527603947915943050133856811404585168205944558165453703431527624506334595045432506934627308020816086352060789500148074036129987141915081067491781193918576923349272144399526024790810392003819056087551693099439565144457445092404856674486557317031234140333788168367691688139043737717078949005514962010399921685317365431804878419028252309372231183965755599, 7351734790128690115760973703093812793072519827632832548072447195807902007480471016180127731301657745440385251537029006926632333888026239002344299730015524748788826686019615969437401225583133406499322689807413056713463098068667355385070847532369184198834207598352669656544159215683462196647737725199044824798073282678837171398365168212586338961890749107714904467296045469714271652112677906299834985415220309151596948564450708865593759133983653535527640733983728734214960531069941744742049444260235908455210325488557801948439335377449152560195683104434879100454941267069176600899676815001105544242471516911330449199493, 11852814053749182402572736748536626919399020564200900675586405027085320287100583900261556583965513307690019054778232441549997262525693266662818314668386265694006016187995755098156541780435539124457944899284605866848248952874146972343040283811454320281250441979737916610057913465323643402204843172935837485578326767870803637372791704314926025685682380130958935838448427950849265244350977714916287411310563094021183623076044366985847897264118929567232739186530626426222745228613819626912242012136378511351453840684390253231521607399296553754246401292359452395337495504543482120126173703670259141213609819575572800252360, 11680515258346811997068098854347364535490357219860825311895792496526422286111520824459113812597757651594512376214223227358245175755737136101087925089777262789925343054352251682360592224585101797544982606136498072758963128587795859121028452641129718304358849668024630074112495913796184572292662005419927159235970411359716968681332962196875306020958442122441036243160608384719188600274630756893869056204751939178380547130318251929812650749245897013099218155431802117401100568063382492523483470523642643526391772634038890094454671698833947832932880380383411894491774297856064992939855112202248875717434777826902138116360, 6599467407595393709976641549001058623470182696430018800062404166263871725249805658280224128778557569506127381868940073703390738703035603446680552827790766866676143743555132533159781234141622053952808797212014640503485459347240832741242576303113184692923825731069428793576947003103397304334027784423940898801842901300885449600496916258779200997975423290447140441742636608840442212988559768090413214007234760592321302413102246411007013932605946927555026506862066243643982819355807217239027897608872405242299373764432703651525748593277763533735890728570418041843090052814953242173431603082822626245842121128189905177255, 12649335520238226144146544247972825527599439320056662024333296570746837138900992170557211119508711622681992438639803063397905215969396668372616413128626515143400935465360120302273752480791983782773216615763063823535164246612789820339138812936318345293165888853776534903885615098996987020059528861479439042854358821863728432420135702255950791821420253656072262247397399669516082375304992560095395047654157561465359724902030530599992914513765552028040663935332637973788963104057172098953509886719579154899787397798248996415787995975050969030604105637892997866991445977377789740685154243809034915192326152061582888245852, 4341308989153335039015617605325454267746873439937702159447233111938201218249077345441598479302608622085118025673884628420317423258845317888914757433339688871195588107795984448917491868819134932781269272123301627906364248442780189715016357504753039452413048865838875081229811150066916956310683989066846512249436245977683975557507693577622868313920102861510375014322557282873398486121331456340891173914052162651230900032191164994715989625611148660571334745395621275743464750281460038787072702545836560532779983642421298806843584616892264170651660720915103927525089791168495959469429474807617128439204700681930145969130, 8624251109085797331633582372105795800900321936460171221297737409562221066325787169294984717591881109290282642763366899324256951141075914582675902305308545042812092670322130716020784299871352231878111195102199232450360640313104620246444572215742805665235046299854090927782954094150034249122912084852288118826211506742668073507483190232405041213599914166929190765759099623445170343760294838071463854987916704277678493880575033945659310567274930839846322421596543303580320669561192432714081099946770842542134545209160442831095054628189930039532876277358925678517212087047630293500924847055044897758058938577630260261096, 6796353291996395502528225719746265859215028724193381531163695895154926727081600942262501953480475775402788502985249685408322405420902683362298726853610074142374210914178831239630133251876172872592829369404610256709505238747777295848025891726791042384464161147870611635499821511785366396631844378547400760103040352991719787769737309579714334031953554766072839177627882903994546597123766219726318299227049816520811153718445308744814178607010485214938439124267330815710021275082620902555141959150917887099691847638403016482874685773291407831143496798480997870143968207841596975537139592212030995838662043351659889221055, 1862557227805408345182455277552676698804922770417232938095916971199412394284421908871420553390083538888299928127098562083887258322744718674796315401556000678765338489671235172474865286293982761012963555207610137000012000765693447768325830834442713515808909177531309594258082574036543128145395050760663559604421952022202726607273573695128683161910989855819506700379369103369037647566608161214301822473983950588485993838991605817439143760177735477197291690319853973194812349990313763686872961459366555705966047759569909537935566067750795787771713431143053395297699857115964615588017699246727201689257717502063199583735, 2964439432493421500557997987371606719650769309766711648321694952686310075496885862615169341935282517426380377051303968953995974940082949874127239987231831940647719142786249812854066683981247406741393972601731662110917451453984701893248611292982349440820021164634955330621971684621455565146244610720654062264631903555010606278729814422789973002615464488961507434889337828822445115969270258122118858203527309843659640067416367352548861614316708617427695891187365488238550590500441530801796959694069570915377891541487666975253770403560792446273225234935887251393332767458431595557673569431084076433828023508176578020280, 8137732477938330805162692953697090554049186466785340438216308284309862676875300842856464819325085111984654527079843310783856982229362065968212636808048736270292787981753637453745334857488902926745560894821290665653358850076862485554573529334367164905328319395951459748822042764069583302172262096742528181003995565335260380800739178598259075992900588192326469784908690423681201353548160207250938344722777293102591362479410059119302158864953056700878300792858403328966176157758772041007130353844382107995751947936627574865138518282925902661871019784105192683691188401701814611565743929316441487296628023759841618739552, 9789812162264105592023574147236501833445698251390297325760064782499936988586177065819438818207280636934775811504299291640809883811422161096932127404568073778180079394166705259113891520989885023993186440911738375537477706728054686062139582912244425669639866055935007594712700795075215828020052693387819348436153734281586864005178050791497933234060765174488078944483826023940039201152961778085722560914399920997170849214997496088773173536761634958229357652562005479926413017693215776769310420882459095645374564148800988363446612651709555390025978408432558345212274287464383030228787363109096639685337137039829741901733, 10728344070744355165963763629751892867625922297973987741677007276299141015008626643399797387127616873409919181181045327456532611698193045179055607992319432880176042288982511579772376060162822155413762150683195047058114482979347481777846891612865837721519561264730601052785970734273476944858464141330339062573977358029587569310892417087462149587822320770909443388668286701491685739375537594610581043180715576915404762099796808284297813741425912057281865180899561043894979657989775075836619566009590877473384711971590240420182966421086427911060621397874130196018467644098528871866931765983581410347538910751557456073517, 13676042345880328741153385092862875501789847934305372673047965702299052353569215622109400455709194151261215953972335075060661494763583663241218637637334040893888392559913876596055318613952466293600174072659103129004902085375304477509742420003651193649010875977016011287360093057136266898945898114964892290177564908254900722146837039954868930341487614106690964660307912129757559054491195199988360986337215945790537504052663376981206043756764792895360406554448573838011844198272055198731294085132472550151106773274958674188000433689353829873137210170533764942694482857727959566135215916137444319578839175861729300288969, 11264859000548222296530227463739414046997320962889027070656247205680862406102698646307063743806374273386678867336641686660939870096865004003910695770587183733765594137477145806302897090040541995237889145886727169604252745721877650238223988565337420085920619119316553725572765168064008485500099079658527951119872883396193254107569749278217700469479304632888675720643087007481314379451547808068160875621230044739619241663573277867840195367042239669365339626171920542561508134785749479355911911631807918921043342743648192828802293236723904644706280612379712264207664901108742816059057218517537392573569853079053476576856, 741520750298655811785744508058602658478364777832875326316345487809617421367545287704848004763266257509689474534269387914500482300952683533332819686268767966688052947657373579421227625615230749191935136175773709081491440204212872634955185950027329875071410052442770159744185676900026492065907446250361324550862308659476629036495381037848342204837684088859898018032353015970025408843347116124892992708043975881215727351372562935541158110606985830503992381935765202411330012971372488657391631152051507105501837992062694998515572028435490659638526549406150083731719393833152204382252453626814457087517700488998329684058, 8701051717985462654772756354978379235488506680548754045760956792296944349375342126783468045740800370410939754936420719869851112530587047062664983865835993766051124831693609283767780956599532449141787657270076124086189943065195553723948014729702238400613148847778172848033004252099414308314615259363626333079237881210578809555794660062114290278881132498464269742689282084146444179236605553146025626720987942569702427248607261556010699323643117057216756998150646027146866834677743723643257699555134864397437064075191662444596994829861317481127737045404026016086288851153795653348944688829015906886165222667980413072108, 16667918993121117970967490442839519026892961805539264262094567728758453922119536618302493178077690717972315611042558838731585392633232417467939233343267723069526817699817929485575571588933771487429131750268218279717865422941603159903620912513330969652946643960442976380686334111740775060726873316504032193588331614033924836676369705574462127060868719236270129031180938017844887788490714221343188057732313295242713687557573200168665661123588246431633068445230793697572074955704597924861090873708089099853894085021302185683370285719406259158371272999780265401347992752830962763054550165420768416107820678976711115900670, 7057137150316132356670238358518014891162772701433156375896417091051366937084234102289215115365969970740724124789934863269388043904182730963867164179276327232079493995456833134330072436854441427261259194256217339612065160185717141098287068742006024940062939669584963239097285393984339512723989974309446694486908704929205556974228507983474379632659058082154124890292819336394576567612675714853435071387591165988091117534790557616750730596366853807006394674166745276132300625473717234442144838312472841371690860790349272408461380385506250494241900902734197734289763984666950676408378390007903955492471714623217782267473, 6999709647383553594402711878105669420049719851006009368704448264591136868672661372823025795588979980722652694417666376255265867848367320367221965388093305905671063628412808940284141950706499100126121339153686440891883994800101425485984899467231598113770424155579365078046812227720111867003570433745060881589950673519861488061859267688233836414986868910615819931963645226927920284644503719541860030364344646954445052526926162954279140258578461968757919630381141495862570543044505641907576357375541333757808847773229179657960520945572988430589579839014638798184455475176452427963270388302260663251483852384595351502254, 17526332517871544141944360849713847854890337163212699685623771668944971751721067719518174835086071748341151446303193115121718128371015015659383331010848350971651869185118244813375657657012513863446059098566111993591608951873910422090282836389413736803629878703352750798562782364296423501222818324434691560495350592244489825910423691779657241604850803404395538089970063474213123858020952205999478078409627067003593918338330499042496299760866698925513416076020823922125104169104784676338723863793514912464968876905708780138974179037851209860367937724961318902885594178389488470587123406692975903244836157888903240544231, 14941581006080100807934418609630951207899600545264236055579515772608635575205359960884611215824415930114815764626691245414879941517385249463420459908935307526996683064042553428245568706806620699867455651430885410710081631328366446800902430396820525270462743099115526846365500122314971031628305702284660625569111863721520273479797226857528663126653121897657406144521852419096183957575418129966558565786813183453031198493646524872568372327924542102131745863049570936149797302177562911348328490516844293173955567455227162273214870736419066638668477888646469755615899120591817966766553674302394894848966461759337719604525, 2463628099518836823475475958421251447822083740803359992364876891698624399146055751960980951498499604249905998641406552555182351975309576587141421664713087174382125354320539152453500067206960963721107187759023459150206037163187474944804349854144893586781951596262074064969399810943049227099224208183641336903082248333445722683060695422684461794953979249179173745626188479815597669528477615093876961341721900233189254211239162767158568553820448099798267150672206522987018954148171097321203850147400689551226670490143914303471592254089420629125779288646685788280751286802753856632726519166812382817904160458030403135179, 13922247690360432078575878151680200359657873754696918354033930089723349987965055546844177516266809730077389237200681294497738849927829301073568397448716074461541862483193843225629574082269942313522944705329410462185265391174170423607447886795606989204694106480337200811229745268039897005289087913150527512677862569236804176357676987695301639201068656950299797523891174763514704256634488360055397689519180185694225851615432625938736990084365481656363416046741422554795959047197422746584955931869910113611764504925784724657229257975449421073507670378806319688811653903175015679721283353753589719347010163974538403000905, 4532576077186800629034723725138553964965315042718231595215594559861507663285739099458764610313071748913763178284701824131871400172898227533538383998906126668620558511267187564894069886806052888588656732753394241051048721065986407634535742036160033686828469181006652865012416240639934785105616294933611371557872789472563164821380864281404814290718388324879916341725822216864567907101316524830879038757826127168423761665643493391078323042832743316166390868340247856488890296582225035860618132541745309094465518328991574318215386365519838239644681389958501569591586999628913024353465234731289032145499732793804292321154, 1773310816308869801306245689198861018329267049661126240530569711114200332508659525775967817500438989926361464067559651420278345735621977380847626181105464953708298323517651003014877787620224911421600827777419421078056250637055417183737698525242108934300331500584085349050988076055971220703841155873169914816843700950992931988971061240213683201288913864577137934449087918846857790114629861834551844831436581944542382406292665279966255990373394493948365746974182927341420920658656251801692484926604982751515845383750200890789969171310976724179019711273766080135587501024096750048547322734697395336280939176304279295014, 15160350954142310804469237284078562674619832140044124553793117172212332148758699678918107952728249803363001364735424256241266771595234218069357659369280883911931246477897954751207672361926906308286451071542736549372777604256084939140052029933134081041019788066621507186362465906144143208288781320935694607665359804110539334395291207346079461035634469292689078972680784434755967947816382393582434828657910201739387699943119525178931323932841561978005276746747135561083679948883774242473917519194705730441900884525119430072786820281618839005136252551365551781894126063085956019515391923377737579796619185054466274010750, 130070826561887523241483063452498806602407504598915655153364520976896806507493038368640288936888150111976267389031117023412211485913532077259499326748723601981599198523877206489637768305901195242085083889304112007223961127517574740416349633634915742442174371019604437304782277715005613557830453510311732868102713472996388676535341523953996377928876859364531690399467796853163169157553216121699280689668714043000834358073516003927744900271788179415813185049606836678342040009231461635746869416704720008270933862870533772172210080081465970999425665935093075240702479719541138934491889950955244122807568843144425832801, 4311080055288888511118858285586125789176570143635606247754145028915212516401036969821976722849184795761852450577577316524536295990072805386152449383878155948515689231703477837628229433044081317016719502896398479479236198892436345857656929731187173943539245590345134051506371122418839526761028976214865142366117280457998391119505271610632597463738878836987631120393255513998804860490905482184478275661823776390475718611711661338561463548517234033964629994332668089493626683859062874554236437953072879388685096751748010927326396319843554669754427534761487382756208112980655389360049431419579923187029033673975473486977, 819835734396424700462290667950367242068904507590741698140089565763386200787396461622434967138777372332741607138556865456980028955964373190050992145746819559013011363507696568852369842319870916299177061108296237366345375889708324877135058697889717588417766187349873069089486470661063531620007802164027301946130037046640307467122446879418086475638012061223241470335354634554632179298781215109303472643768980696061488393541897688951977616221843390434762977431955519965478568502503803943625939054374454629943017469211188681996977975220476343443032748666961338645691781617868040813200965429256161471340243407231520585680, 16817743338134296253608832732906771459524001696276552141177146276350056621145212649429915147872184815205143277663103897230425076891788504083912767037091012099282490220647217470853148693009471996810527138262311364092155941572737379104967015937410795591452939017752237280864615781601926908766065951811510986124136536393053189656165950072162977334176185758553324119340392316302412299146857810686218488217438356569389397951255539795790949095620157296891945676121714750434799500356262587654602934097735630316264184625565237408148541128559012466730187365329026979560356977667975823189076858835559200287186910494012706958302, 15527419058019659926627088799239789369549926948881551281355575350916696719952097976468650279986967113576860350695735478653393093071375811306250090669439710571430222332220326716941137250551436670673919901958566119067816626932726835498211184280797235203002927493825340435851525929054920708507058453393166676055177761505174808756041272397604698329801185035170160641594735150973116914696736348614767464254627239620902026274658251668558135325309472330970241765799471991571316342633734864237667826757707347523959200982417525508458316792445488306619995692513706522924896292358784475919304873066036604608601809195237308360645, 10863402509591803490308295457830799183402359985936262425624604427734860774283695722761628090446825481512087640630795293426100224477318675548022707857287442688747333611673420112102321622706011230633310885388074102377440456861668510352446572184532108909495564501078008880583538624454833201676030858694203291918340621746010409440408286730684683189592217292588014949562177154410978511193727685046110992220947331815324013519070445972357399165207249362641341591748779110862973934085431851181188145414860076400320540071127499548840429771258369397663550697666259913077831004099471633974917570594485287325446894036358469807660, 466698684349090459957684968138942751755411281675505618734927753984005315144047946984567857225821196211945934559938787437578302318861329951143439831436660377909767335970602361980371246904470589405395647585407673056093117725620197859731759088438748335089503262698396277691380125759727310456849490379388145657809114037079057797982301411455270400821497992139589989170306133825977893302529428926437823663154279982545646939628629970905576605274717835377233388012787615083223539532923821828893858490279628414639573213639693019493778479317268963906694647352195203231820621311569012708863667854760357569796659792552590218023, 1023797781719923464708970758798417708123819552483953105092059246348295161225960710665063485772927432492226112935157740266189666393836897605340835545598140974286850209559505783787938453243473839679568557262109722400700477687270908875126213863624871043236692749078187343756393031762675454359288197405325995838662920671651792758133610958010576693096945933908284163191977405244448817271226571597667386334006931752073116295177758765947508153049110783513024851368572104408492244072657284821101284872413682396816528742715332611550876686000055284460890610663259092482647435854741537285734651650556607124186963134598151277681, 16564343071247906492977067831028739067835584939773748290960930795361697545249586100745145753499518782888498183806950296606298726663386744217463104437453695217807536861749024811731100054586599310081314938051294644243822808024751817949926560878423427532930355272448166081398435644019309099906032698349442095868136285908161176383470893407378408379246648157175860365687960691651849027880910276349407812857041031046056430229956155034383670527134742605855517198182374121017922619831003422398593967061372225244315489227904397672873003773478882681711944342222405085256563966830317559688962313023861733813781258587626514033984, 3397418129025038108538183517048162803911635199820335431967671837174170534277118605731582586400528212018109684982907442370723609340384741664396459820586565286342152030337187361736218432270419900628771286247735128790654352156221133458831581286256488397306599083632665953991565025675960715225602652393552353898050575226404209855704718568705524962009978814612958828521047544823132917323510174841517611059157052808241880930182690058696405002403079625532335203175068545779044346307388982286924035688216105915045128526732334090425562441798213150046463677777429703410480433291645902723557918699514732817105955799764089310395, 13227661875650696581248094947152739775756925405001276195382845618590760550782231253466059166154730633131179118366545326045788710914665129587926798689966754246438284777233768381210374703956687023840305030759295626831261621221317079436970977916358663697083930969075333226581022918303972736454359109092986216632166249070324976475717538453065779336019041983167080072119959467474318159002281066737431178230069763018513094519232710923340982090094179181715757439299233762153022126001828634503881546648038505344045561343740155025554901477758872280836146040171501500569853509502336582015723954737530480673263410132438999894039, 11157462926302349281053529114864453205171155514599647991723650862537467315175298729471318929973919517992597463828654512565255494658274079288831171561559264971779483583198885149337812640553739006464294100410415720353967362153304977781041263841440335279618062050560647886426325086064376994570548008234557815040061493180834892666201302363337205115287845657601631973755445011764444494774406976655573161709056423289002805508164618420843810463326606007196354147454232185196031537791484052684898844450788438269233491534366205115702245543861530325153132174554428098049697733289859757034286830156507435817416331255274613068575, 121828591347926735655000905089920706443920412907399011248468200892307029913394657348465131780116530692059181583306718939137596976273372742373909314352155798778231921100038222805444327300020483200756815905618185353233578154893900661065453494679516256545644433061657523566218958383010531066751623316756714462514736692626528352294149701484785834486099104393225594477875013270041289136793230353205661421762408305399554411552164645913460848266125844408854097368065447250457214131340972727253943723718664979894046985392753791761501622819890429445687963931230027927083243496507079114325429424841756659703692000828152830642, 5752569670171843417105401140396310678210762887036873912974756270558536195240408919309531872667252179193084315247138380745694773286394075457487092566410485336281132228127041838465410880616989193276097871837455686615288947050161409111901720902237676812608339857898171495040262789086329829385035711535739922107238036364599165577060443521713480058545885630462874503330353157586555348806185939937610495873311320328271211411938987301325340844973281115913257951232182209572811349297804843241057863307938817063467973009175505936124348587072988672513652898141957878107746408720552036363231081774483585024291253478908090378031, 10129050211569384821406826470902625501449375438437827278533134671912911700072221649396723633035939480561978552074493538330318432942088357479234036893175255582031663638338653119234445075086151142902088246791010794332996604967971581528115007622176516111648010433614321487678719773496077911228903237264863984369688183156030899555411789472502505783854290840732598244348899559727433268941448204683187217224440639293944301644251746648905768668710991380800093977543873603430717807937251904067929552820726044451826117852688386963966360433740585891441042545690280866325527679689476275330957437495485046352942335538955252856494, 14156092775543173800443155811590285224144136159370658437684238669046797370963898194614195221892120010965473015919455414873017664738690459742247549358066198302319061290475510064880311251236221857618886328254670063109990408440235044077787253791681454987420392643686669672737501894371826049155661344811292313730585186463779262938463412163188028348767499060974999208919168902347939923390144774787972034539973584920390193978427788123393825457671538237727081387228403014681975281399306807097341107603245650713460943858462798476907605979844152050022541292210649922137365313523452596618209138244406937756666894121398437493830]
M = matrix(ZZ, es).T.augment(matrix.identity(len(es)))
# 每一行的第0列乘上一个较大的k,其他列不变
M[:,0] *= 2^100
solv = M.LLL()
s = []
for i in solv:
print(i)
print(sum(i))
s.append(sum(i))
print(s)
coes_1 = [88, 38, 162, -14, 153, -140, -43, -165, -122, -67, 155, 424, -19, -8, 390, -73, 215, 213, 19, -225, -90, -107, 66, 50, -58, -218, -37, 141, -209, -91, -180, -198, 167, -77, 149, 93, -95, 3, 74, 132, -169, 148, -88, -45, 279, 6, -85, -166, 60, -108, -37, 65, -46, -216, -124, -121, 128, 14, -79, 124, -162, 138, -13, 0]
coes22 = [-82, -38, 204, -154, -360, 48, 220, -110, -38, -87, -84, -138, 184, 38, 43, 85, -36, -302, -342, -41, 162, 7, 48, -69, 154, 178, -2, 132, 12, -47, 121, 177, -55, 177, -241, -16, -83, 161, 116, 218, 14, -60, -88, -107, -227, -148, 177, 263, -15, 14, 94, -6, 33, -107, 2, -4, 37, 156, 60, -219, -108, 173, -3, -69]
coes_22 = [185, 118, -333, -152, 66, -59, -89, -27, -17, 136, -54, -156, 24, 176, 238, 102, -39, -45, -106, 36, 51, 85, -115, 121, -26, 134, 32, -198, 104, -3, -84, 39, -30, -105, -203, 122, -117, 242, -288, -166, 251, 208, 133, -69, 182, -106, 188, -49, -307, 113, -205, 29, 21, 50, 94, -106, 77, -61, -140, 169, -55, -3, -35, 0]
coes_81 = [-23, 20, -17, -12, 72, -29, -228, -79, 4, 43, 26, 235, 17, 17, 164, -10, -35, -185, 158, 0, -116, -148, -74, 78, 2, -145, 178, 69, 11, -47, -51, -154, -267, 264, 260, -209, -3, 60, 163, 23, -217, -2, -78, 49, 31, -133, 40, -159, -44, 74, 322, 3, -132, 75, -74, -173, 141, 95, 49, 43, -89, 57, 9, 0]
coes82 = [-176, -43, 95, -30, -69, -27, -122, -87, 239, 111, -29, -122, 66, -2, 7, -37, -107, 114, 193, 119, -161, 51, 180, 93, 102, -237, 34, 104, -150, -79, -161, -168, -85, 162, 400, -210, 200, -38, 185, 90, -171, -326, 18, 122, -81, 18, -117, -1, 33, -7, -74, -24, -106, 341, 59, 105, -24, 121, -300, 21, 41, 22, -39, 46]
c1 = 1
c2 = 1
c3 = 1
c4 = 1
c5 = 1
for i in range(len(cs)):
c1 = c1 * cs[i] ^ coes_81[i]
c2 = c2 * cs[i] ^ coes82[i]
c3 = c3 * cs[i] ^ coes_1[i]
c4 = c4 * cs[i] ^ coes_22[i]
c5 = c5 * cs[i] ^ coes22[i]
a = c1 * c2 * c3
b = c4 * c5
n = gcd(a.numer() - a.denom(), b.numer() - b.denom())
print(n)
#17724789252315807248927730667204930958297858773674832260928199237060866435185638955096592748220649030149566091217826522043129307162493793671996812004000118081710563332939308211259089195461643467445875873771237895923913260591027067630542357457387530104697423520079182068902045528622287770023563712446893601808377717276767453135950949329740598173138072819431625017048326434046147044619183254356138909174424066275565264916713884294982101291708384255124605118760943142140108951391604922691454403740373626767491041574402086547023530218679378259419245611411249759537391050751834703499864363713578006540759995141466969230839
from Crypto.Util.number import *
from gmpy2 import *
def gongmogongji(n, c1, c2, e1, e2):
def egcd(a, b):
if b == 0:
return a, 0
else:
x, y = egcd(b, a % b)
return y, x - (a // b) * y
s = egcd(e1, e2)
s1 = s[0]
s2 = s[1]
# 求模反元素
if s1 < 0:
s1 = - s1
c1 = invert(c1, n)
elif s2 < 0:
s2 = - s2
c2 = invert(c2, n)
m = pow(c1, s1, n) * pow(c2, s2, n) % n
return m
n = 17724789252315807248927730667204930958297858773674832260928199237060866435185638955096592748220649030149566091217826522043129307162493793671996812004000118081710563332939308211259089195461643467445875873771237895923913260591027067630542357457387530104697423520079182068902045528622287770023563712446893601808377717276767453135950949329740598173138072819431625017048326434046147044619183254356138909174424066275565264916713884294982101291708384255124605118760943142140108951391604922691454403740373626767491041574402086547023530218679378259419245611411249759537391050751834703499864363713578006540759995141466969230839
c1 = cs[3] * invert(cs[4],n)%n
e1 = es[3] - es[4]
c2 = cs[1] * invert(cs[2],n)%n
e2 = es[1] - es[2]
print(e1)
print(e2)
print(gcd(e1,e2))
m = gongmogongji(n,c1,c2,e1,e2)
print(long_to_bytes(m))
superprime
题目:
chall.py
from Crypto.Util.number import getPrime, isPrime, bytes_to_long
def getSuperPrime(nbits):
while True:
p = getPrime(nbits)
pp = bytes_to_long(str(p).encode())
if isPrime(pp):
return p, pp
p1, q1 = getSuperPrime(512)
p2, q2 = getSuperPrime(512)
p3, q3 = getSuperPrime(512)
p4, q4 = getSuperPrime(512)
p5, q5 = getSuperPrime(512)
n1 = p1 * q1
n2 = p2 * p3
n3 = q2 * q3
n4 = p4 * q5
n5 = p5 * q4
e = 65537
c = bytes_to_long(open("flag.txt", "rb").read().strip())
for n in sorted([n1, n2, n3, n4, n5]):
c = pow(c, e, n)
print(f"{n1 = }")
print(f"{n2 = }")
print(f"{n3 = }")
print(f"{n4 = }")
print(f"{n5 = }")
print(f"{e = }")
print(f"{c = }")
分析:
题目核心在于p = getPrime(nbits) pp = bytes_to_long(str(p).encode())
,即利用p生成了一个新的质数pp,可以令这个映射关系为\(\small pp=f(p)\)。对于n1,可以看作\(\small n_1=p_1f(p_1)\),整体是严格单调递增的,那么二分法搜索判断即可分解。对于n4,n5,由于\(\small n_4=p_4f(p_5),n_5=p_5f(p_4)\),合并一下有\(\small n_4=p_4f(n_5/f(p_4))\),f的变化速率是比自变量的变化速率快很多的,所以如果p4的比特数稳定的话,这个函数整体变化是单调递增的,那么仍然可以用二分搜索进行分解。关于n2,n3,可以考虑剪枝搜索算法,具体如下:
分解完毕以后逆序解RSA即可。
exp:
# python的赋值语句用eval不行
exec(open('superprime.txt','r').read())
def f(p):
return bytes_to_long(str(p).encode())
# 二分法搜索
def factor1(n):
l = 2 ^ 511
r = 2 ^ 512
m = 0
while l < r:
m = (l + r) // 2
mm = bytes_to_long(str(m).encode())
if m * mm == n:
break
elif m * mm > n:
r = m
else:
l = m
return m, n // m
s1 = 0
for i in range(155):
s1 += 48 * 256 ^ i
s2 = 0
for i in range(154):
s2 += 48 * 256 ^ i
t1 = 0
t2 = 0
def factor2(t1, t2, s1, s2, i=1):
if s1 * s2 == n3:
print(s1, s2)
else:
for m1 in range(10):
for m2 in range(10):
if (256 ^ (i - 1) * m1 + s1) * (256 ^ (i - 1) * m2 + s2) % (256 ^ i) == (n3 % (256 ^ i)) and (m1 * 10 ^ (i - 1) + t1) * (m2 * 10 ^ (i - 1) + t2) % (10 ^ i) == (n2 % (10 ^ i)):
factor2(t1 + m1 * 10 ^ (i - 1), t2 + m2 * 10 ^ (i - 1), s1 + 256 ^ (i - 1) * m1, s2 + 256 ^ (i - 1) * m2,i + 1)
def factor3(n1, n2):
def try_factor(l, r):
while l < r:
m = (l + r) // 2
if gcd(n1,m) > 1:
print(m)
if m * f(n2 // f(m)) > n1:
# 一般为m就行,没结果的时候可以试着加减1
r = m - 1
else:
l = m + 1
for i in range(16):
# brute force top 4 bits of p1
# because len(str(p1)) must be constant to have monotonic property
l = i << 508
r = l + (1 << 508)
try_factor(l, r)
def decrypt(c, p, q):
n = p * q
d = inverse_mod(e,(p-1)*(q-1))
return pow(c, d, n)
p1,q1 = factor1(n1)
assert p1 * q1 == n1
factor2(t1,t2,s1,s2)
q2 = 3637614835597688283811417087451284735795723790907404269598102567844323884268458831660382863895122427922344137308051772571787667106920348754312958580649067039352206952350851620944738489878777590555129193542297958160664605061629454033040783847224918471035675969664919877726877869514540502471336353104729922441764993392231792420645815412664583902384583343063457953995717882417
q3 = 16240620626084129569635357960935943759269695390880055174494678796886574808475500548495232716180627242490107847091316139089796101281858955162533734479656410257303886772297342639191292527487307608348085739212472450769943235321492475607992447777362986084331955247963913144876481311298880062786552320641355475076857473420482439273670098547367649970130113697205788874617731121
p2,p3 = int(long_to_bytes(q2)),int(long_to_bytes(q3))
assert q2 * q3 == n3
assert p2 * p3 == n2
factor3(n4, n5)
p4 = 6759224678814800913204473280361658486772650199941114505283409645622497866148765146601841353932633241398607040792961131806556756943022446601137737571037341
q4 = n4//p4
p5 = f(p4)
q5 = n5 // p5
assert p4 * q4 == n4
assert p5 * q5 == n5
from Crypto.Util.number import *
n1 = 132240475872174910020944408159013384770525986234801028624784519134365862704105251340824787510945183963356820885920367304711310957365047441178683686926111455575911962257698539064559510444855775549001648292058855493337857073693460061212792795075263084221929517773754699732129582794061997056827998985829666251060653380798686353779510948629280009197715644814616657550158740378670095210797455828266323922570838468050733341304227070902756780052159113811360169205531739117518635829837403006788948761106892086004133969899267757339921
n2 = 95063555614573541810575593850289506856925979977609991181205616159125089261546784721154599484613262518469706157215924537125160406418217535531993036958388330505871763176297570429533467696205928686731756713059807727405313286020007347211892135226632724359291407913539632339885950358476265995466145680878334722001
n3 = 59077122528757446350604269162079270359932342538938986760275099248290981958441838384256597839386787448447136083450980256330743221155636885358548541847176342745397373638152767362253944731433134474562146358334422503033973244936835557423934491676324297243326613498319086748647812745223753746779568080090592100960499863677438403657325762852705171109382084916335379889394829715777901290096314487661584614712488781379507151355301063123233880909931925363322846957197537676660047824476129446066149857051131731840540157488590899311381370266592295206055792990886734933291304077440476730373491475852882163732120626849448728573574411786320772125534383707413572678316508826450778346723441956945169297689138799298561759843280317867927205551400065163199599457
n4 = 24589423756497058585126900932611669798817346035509889383925628660158156567930038333401661451846451875869437263666365776498658699865323180836374906288949824205543130261556051807217164348291174483234810669420041361857307271050079366739157441129916338485838528114129985080841445467007786565727910355311119650431197742495274527401569906785121880408809802492383216836691265423297722021017515667257863302820657924121913047547741420413553737917632809270380269758313556777803344394624408862183672919570479289614998783678080936272369083
n5 = 185885020243714550225131939334004568560534422416697599024696590344782893162219788079305752632863387855011040772104676488940707663157284194641170875157382507202789029285286466326803699701161968587945867047101502048926016515139728368809523009828247173096909917611001113266938209226483162533302629909322412013492978440863258135181226831155024690292336026753678424906151360739424148666951389956182136072508650529271179749569637083537783283360860102371562796635391549934474381821125255176073752645643893294533330184238070085333427
e = 65537
c = 44836759088389215801662306050375432910426695023654894661152471598197009644316944364461563733708795401026569460109604554622161444073404474265330567406370705019579756826106816505952084633979876247266812002057927154389274998399825703196810049647324831928277737068842860115202258059693760003397831075633707611377854322143735834890385706873765241863615950449707047454133596389612468366465634011925228326638487664313491916754929381088396403448356901628825906815317934440495749705736715790281606858736722493438754469493049523175471903946974639097168758949520143915621139415847104585816466890751841858540120267543411140490236193353524030168152197407408753865346510476692347085048554088639428645948051171829012753631844379643600528027854258899402371612
p=[8146548592442976266345996123132853490697005499246649457977706700220974227149533573761967281334961993159106889103915430835029497970085237349414587895387361,10685750878049478986600454022422733804784834227531623991827538970867377925593354382775253050419846972347584519245766235538419501021140939003899401773087821,3637614835597688283811417087451284735795723790907404269598102567844323884268458831660382863895122427922344137308051772571787667106920348754312958580649067039352206952350851620944738489878777590555129193542297958160664605061629454033040783847224918471035675969664919877726877869514540502471336353104729922441764993392231792420645815412664583902384583343063457953995717882417,6759224678814800913204473280361658486772650199941114505283409645622497866148765146601841353932633241398607040792961131806556756943022446601137737571037341,11868750061342011267437975338788313730068511026231254554820987614699325962867540061083226545014725808842166519144882448332395484715124334891963558447955747]
n=[]
n.append((n2,p[1],n2//p[1]))
n.append((n1,p[0],n1//p[0]))
n.append((n5,p[4],n5//p[4]))
n.append((n4,p[3],n4//p[3]))
n.append((n3,p[2],n3//p[2]))
n=n[::-1]
for i in range(len(n)):
p,q=n[i][1],n[i][2]
phi=(p-1)*(q-1)
d=inverse(e,phi)
c=pow(c,d,p*q)
print(long_to_bytes(c))