n = 114101396033690088275999670914803472451228154227614098210572767821433470213124900655723605426526569384342101959232900145334500170690603208327913698128445002527020347955300595384752458477749198178791196660625870659540794807018881780680683388008090434114437818447523471527878292741702348454486217652394664664641 N = 1159977299277711167607914893426674454199208605107323826176606074354449015203832606569051328721360397610665453513201486235549374869954501563523028914285006850687275382822302821825953121223999268058107278346499657597050468069712686559045712946025472616754027552629008516489090871415609098178522863027127254404804829735621706042266140637592206366042515190385496909533329383212542170504864473944657824502882014292528444918055958758310544435120502872883857209880723535754528096143707324179005292445100655695427777453144657819474805882956064292780031599790769618615908501966912635232746588639924772530057835864082951499028 dP = 33967356791272818610254738927769774016289590226681637441101504040121743937150259930712897925893431093938385216227201268238374281750681609796883676743311872905933219290266120756315613501614208779063819499785817502677885240656957036398336462000771885589364702443157120609506628895933862241269347200444629283263 e=65537
for k inrange(1,e): if (e*dP-1)%k==0and N%((e*dP-1)//k+1)==0: P=(e*dP-1)//k+1 Q=N//P print(f'{P=}') print(f'{Q=}')
from Crypto.Util.number import * from math import gcd from math import isqrt from random import randrange
n = 8836130216343708623415307573630337110573363595188748983290313549413242332143945452914800845282478216810685733227137911630239808895196748125078747600505626165666334675100147790578546682128517668100858766784733351894480181877144793496927464058323582165412552970999921215333509253052644024478417393146000490808639363681195799826541558906527985336104761974023394438549055804234997654701266967731137282297623426318212701157416397999108259257077847307874122736921265599854976855949680133804464839768470200425669609996841568545945133611190979810786943246285103031363790663362165522662820344917056587244701635831061853354597 phi = 8836130216343708623415307573630337110573363595188748983290313549413242332143945452914800845282478216810685733227137911630239808895196748125078747600505622503351461565956106005118029537938273153581675065762015952483687057805462728186901563990429998916382820576211887477098611684072561849314986341226981300596338314989867731725668312057134075244816223120038573374383949718714549930261073576391501671722900294331289082826058292599838631513746370889828026039555245672195833927609280773258978856664434349221972568651378808050580665443131001632395175205804045958846124475183825589672204752895252723130454951830966138888560 c1 = 78327207863361017953496121356221173288422862370301396867341957979087627011991738176024643637029313969241151622985226595093079857523487726626882109114134910056673489916408854152274726721451884257677533593174371742411008169082367666168983943358876017521749198218529804830864940274185360506199116451280975188409 N = 157202814866563156513184271957553223260772141845129283711146204376449001653397810781717934720804041916333174673656579086498762693983380365527400604554663873045166444369504886603233275868192688995284322277504050322927511160583280269073338415758019142878016084536129741435221345599028001581385308324407324725353 c2 = 63355788175487221030596314921407476078592001060627033831694843409637965350474955727383434406640075122932939559532216639739294413008164038257338675094324172634789610307227365830016457714456293397466445820352804725466971828172010276387616894829328491068298742711984800900411277550023220538443014162710037992032 c3 = 9266334096866207047544089419994475379619964393206968260875878305040712629590906330073542575719856965053269812924808810766674072615270535207284077081944428011398767330973702305174973148018082513467080087706443512285098600431136743009829009567065760786940706627087366702015319792328141978938111501345426931078 e = 65537
deffactorize_multi_prime(N, phi): """ Recovers the prime factors from a modulus if Euler's totient is known. This method works for a modulus consisting of any number of primes, but is considerably be slower than factorize. More information: Hinek M. J., Low M. K., Teske E., "On Some Attacks on Multi-prime RSA" (Section 3) :param N: the modulus :param phi: Euler's totient, the order of the multiplicative group modulo N :return: a tuple containing the prime factors """ prime_factors = set() factors = [N] whilelen(factors) > 0: # Element to factorize. N = factors[0]
w = randrange(2, N - 1) i = 1 while phi % (2 ** i) == 0: sqrt_1 = pow(w, phi // (2 ** i), N) if sqrt_1 > 1and sqrt_1 != N - 1: # We can remove the element to factorize now, because we have a factorization. factors = factors[1:]
p = gcd(N, sqrt_1 + 1) q = N // p
if isPrime(p): prime_factors.add(p) elif p > 1: factors.append(p)
if isPrime(q): prime_factors.add(q) elif q > 1: factors.append(q)
n = 369520637995317866367336688225182965061898803879373674073832046072914710171302486913303917853881549637806426191970292829598855375370563396182543413674021955181862907847280705741114636854238746612618069619482248639049407507041667720977392421249242597197448360531895206645794505182208390084734779667749657408715621 c = 324131338592233305486487416176106472248153652884280898177125443926549710357763331715045582842045967830200123100144721322509500306940560917086108978796500145618443920020112366546853892387011738997522207752873944151628204886591075864677988865335625452099668804529484866900390927644093597772065285222172136374562043 e = 0x10001
defguess_number_4(): defextract_number(y): y = y ^ y >> 11 y = y ^ y << 7 & 2636928640 y = y ^ y << 15 & 4022730752 y = y ^ y >> 18 return y&0xffffffff
number = random.getrandbits(32) print("extract number = "+ str(extract_number(number))) guess = int(str(input("Guess be extracted number:"))) if guess != number: print("Wrong Number! Guess again.") exit(0)
print("Welcome to the Mersenne Twister basic challenge. Please try to solve 20 challenges in 60 seconds.") signal.alarm(60)
for i inrange(20): print("Round: "+str(i+1)) random.choice([guess_number_1,guess_number_2,guess_number_3,guess_number_4])() print("Good job!")
flag = open('/flag').read() print("Congratulations on passing the challenge. This is your flag: " + str(flag))
from pwn import * from Crypto.Util.number import * from extend_mt19937_predictor import ExtendMT19937Predictor
context.log_level = 'debug'
sh=remote('node2.yuzhian.com.cn',32881) #sh=process(['python3','task.py']) l64 = lambda :u64(sh.recvuntil("\x7f")[-6:].ljust(8,"\x00")) l32 = lambda :u32(sh.recvuntil("\xf7")[-4:].ljust(4,"\x00")) sla = lambda a,b :sh.sendlineafter(str(a),str(b)) sa = lambda a,b :sh.sendafter(str(a),str(b)) lg = lambda name,data : sh.success(name + ": 0x%x" % data) se = lambda payload: sh.send(payload) rl = lambda : sh.recvline() rv = lambda n : sh.recv(n) sl = lambda payload: sh.sendline(payload) ru = lambda a :sh.recvuntil(str(a)) rud = lambda a :sh.recvuntil(str(a),drop=True)
defsolve1(rands): pre = ExtendMT19937Predictor() for num in rands: pre.setrandbits(num,96) guess=pre.predict_getrandbits(96) sla('Guess after number:',str(guess))
defsolve2(rands): pre = ExtendMT19937Predictor() for num in rands: pre.setrandbits(num,32) for _ in rands: pre.backtrack_getrandbits(32) guess=pre.backtrack_getrandbits(96) sla('Guess pre number:',str(guess))
defsolve3(num): mod=2**32 inv=inverse(1812433253,mod) mt=num for i inrange(623,0,-1): mt=((mt-i)*inv)%mod mt=mt^mt>>30 sla('Guess seed number:',str(mt))
defsolve4(num): defuntemper(y): y ^= (y >> 18) y ^= (y << 15) & 0xefc60000 y ^= ((y << 7) & 0x9d2c5680) ^ ((y << 14) & 0x94284000) ^ ((y << 21) & 0x14200000) ^ ((y << 28) & 0x10000000) y ^= (y >> 11) ^ (y >> 22) return y sla('Guess be extracted number:',str(untemper(num)))
seed = H(secret) f = R( [bytes_to_long(secret)] + [bytes_to_long(H(seed)) for _ inrange(n - 1)] ) x = [getRandomRange(2, p - 1) for _ inrange(n)] y = [ZZ(f(xi)^2 + getPrime(256)) for xi in x]
enc_key_block=[ enc_key[m*i:m*(i+1)] for i inrange(len(enc_key)//m)] key='' for block in enc_key_block: enc_num=vector(Zn,[f1nd(x) for x in block]) m_num=enc_num*mat^-1 key+=''.join([ dic[m] for m in m_num]) print(key) #W3ar3N0wayBackz key=key[:14] _enkey=[f1nd(i) for i in key]
tmp='' for i,c inenumerate(ct): if c in dic: tmp+=dic[(f1nd(c)-_enkey[i%len(_enkey)])%64] else: tmp+=c print(tmp) flag=' '.join(map(lambda _:_[::-1],re.split("[ { _ } ]" , tmp.swapcase()))) flag=flag.replace(' ','_') flag='%s{%s}'%(flag[:5],flag[6:-1]) print(flag) #NKCTF{ClaSsic_c0de_d0l1s_aRe_r3a1ly_int3reSting}
complex_matrix
题目源码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
from Crypto.Util.number import * import gmpy2 as gy flag = ''
k = 400 p, q = getPrime(741), getPrime(741) N = p * q phi = (p-1) * (q-1) _flag = bytes_to_long(flag) p, q = getPrime(1024), getPrime(1024) d_array = [getPrime(k) for _ inrange(4)] e_array = [inverse(i, phi) for i in d_array] c = pow(_flag, 65537, N) print('N:',N) print('e:',e_array) print('c:',c) #N: 71841248095369087024928175623295380241516644434969868335504061065977014103487197287619667598363486210886674500469383623511906399909335989202774281795855975972913438448899231650449810696539722877903606541112937729384851506921675290984316325565141178015123381439392534417225128922398194700511937668809140024838070124095703585627058463137549632965723304713166804084673075651182998654091113119667582720831809458721072371364839503563819080226784026253 #e: [65128799196671634905309494529154568614228788035735808211836905142007976099865571126946706559109393187772126407982007858423859147772762638898854472065889939549916077695303157760259717113616428849798058080633047516455513870697383339784816006154279428812359241282979297285283850338964993773227397528608557211742425548651971558377656644211835094019462699301650412862894391885325969143805924684662849869947172175608502179438901337558870349697233790535, 58756559706647121529575085912021603170286163639572075337348109911506627489265537716060463072086480156516641723700802217411122982693536541892986623158818442274840863016647800896033363360822503445344748132842451806511693779600370832206455202293028402486647422212959763287987847280322100701242139127654031151565924132562837893975505159702015125483479126108892709063135006366792197127007229210558758401679638300464111782814561428899998471531067163715, 34828685390969672139784723764579499920301439564705391196519314224159563070870933754477650614819514127121146216049444888554338415587165719098661141454627820126445291802801256297252654045398330613075575527685542980264993711077876535643646746742646371967302159565887123638001580042027272379341650995728849759541960087953160211696369079708787543303742132161742979856720539914370868829868891655221361545648778590685232034703220732697083024449894197969, 26717968456600556973167180286909817773394160817933525240720067057464671317174201540556176814203780603153696663101158205367554829261808020426363683474848952397963507069306452835776851274959389849223566030857588019845781623271395012194869024566879791449466064832273531795430185178486425688475688634844530106740480643866537205900809400383304665727460014210405339697947582657505028211149470787536144302545259243549176816653560626044921521516818788487] #c: 39297018404565022956251803918747154798377576057123078716166221329195959669756819453426741569480551313085435037629493881038383709458043802420338889323233368852331387845200216275712388921820794980987541224782392553528127093154957890356084331463340193478391679540506421250562554424770350351514435220782124981277580072039637811543914983033300225131364246910828188727043248991987332274929827173923543187017105236008487756190002204169623313222748976369
尝试了一下单组数据使用boneh durfee attack,发现行不通。然后发现是muti
public exponent with small private exponent and common
modulus,针对该问题的攻击由Aono提出,paper在此。