2020-網鼎杯部分writup-3

1.simple

根據下載題目提示,這可能是一個仿射編碼,根據仿射密碼求解

import gmpy2
miwen="kgws{m8u8cm65-ue9k-44k5-8361-we225m76eeww}"
minwen=""
k=8
b=22

for i in miwen:
    if ord(i)>=ord('a') and ord(i)<=ord('z'):
        miwenint=ord(i)-ord('a')
        for j in xrange(26):
            if pow(123456*j+321564,1,26)==miwenint:
                minwen=minwen+chr(ord('a')+j)
                break
    else:
        minwen=minwen+i
print minwen

2.RUA

根據下載題目名稱提示這是一個RSA加密,題目中給了三組,所以我們猜測使用中國剩餘定理組合成一組式子。然後爆破e。

import gmpy2
def crt(ll):
    N=1
    for i in ll:
        N=N*i[1]
    su=0
    for i in ll:
        Mi=N/i[1]
        Miphi=gmpy2.invert(Mi,i[1])
        su=(su+Mi*Miphi*i[0])%N
    return (su,N)
c1=8024667293310019199660855174436055144348010556139300886990767145319919733369837206849070207955417356957254331839203914525519504562595117422955140319552013305532068903324132309109484106720045613714716627620318471048195232209672212970269569790677144450501305289670783572919282909796765124242287108717189750662740283813981242918671472893126494796140877412502365037187659905034193901633516360208987731322599974612602945866477752340080783296268396044532883548423045471565356810753599618810964317690395898263698123505876052304469769153374038403491084285836952034950978098249299597775306141671935146933958644456499200221696
n1=18856599160001833299560082802925753595735945621023660831294740454109973698430284916320395522883536507135735383517926050963512440162483065097256884040938259092582892259657340825971260278387406398529168309426241530551396056450450728728601248269612166083300938497235910244979946020059799495231539400114422748104072550004260736766137354572252872437140063474603268146956570787143010441293268321641092743010805639953103578977668248726500636191043930770036787317928372179939360510179438436665591755940224156131460271763912868322774604558314812111335691108887319827579162188169744014973478052491398688611046800951698773893393
c2=17388575106047489057419896548519877785989670179021521580945768965101106268068805843720622749203590810185213416901978773748832854888898576822477243682874784689127705334243899967896321836688567602323551986980634884700045627950473546069670440078998428940082620044462222475031805594211784370238038168894827559017562364252406425134530719911057780692073760058203345936344269833206906999625580911856011564697811258009937314511410514416706482571471852503756675411177080916350899445106002226392895645443215522671155311715637759618276305217468892076287376401516124640727839779731609203202530346427613422430202271506248285086956
n2=21996468204721630460566169654781925102402634427772676287751800587544894952838038401189546149401344752771866376882226876072201426041697882026653772987648569053238451992877808811034545463363146057879646485465730317977739706776287970278094261290398668538232727000322458605289913900919015380904209692398479885177984131014170652915222062267448446642158394150657058846328033404309210836219241651882903083719822769947131283541299760283547938795574020478852839044803553093825730447126796668238131579735916546235889726257184058908852902241422169929720898025622336508382492878690496154797198800699611812166851455110635853297883
c3=5170826942130658374627267470548549396328896108666717036999395626588154882531377393671593939192779292151584678688653835775920356845071292462816417186595460417761844407911946323815187102170021222644920874070699813549492713967666736815947822200867353461264579419205756500926218294604616696969184793377381622818381733352202456524002876336304465082656612634304327627259494264840838687207529676882041997761204004549052900816658341867989593333356630311753611684503882509990853456022056473296726728969894815574884063807804354952314391764618179147583447848871220103094864884798102542377747761263052887894135796051521881179607
n3=22182114562385985868993176463839749402849876738564142471647983947408274900941377521795379832791801082248237432130658027011388009638587979450937703029168222842849801985646044116463703409531938580410511097238939431284352109949200312466658018635489121157805030775386698514705824737070792739967925773549468095396944503293347398507980924747059180705269064441084577177316227162712249300900490014519213102070911105044792363935553422311683947941027846793608299170467483012199132849683112640658915359398437290872795783350944147546342693285520002760411554647284259473777888584007026980376463757296179071968120796742375210877789
ll=[(c1,n1),(c2,n2),(c3,n3)]
jie=crt(ll)
assert jie[1]==n1*n2*n3
assert jie[0]%n1==c1
assert jie[0]%n2==c2
assert jie[0]%n3==c3
for i in xrange(2,100000000):
    hahaha=gmpy2.iroot(jie[0],i)
    if hahaha[1]:
        print hex(hahaha[0])[2:].decode("hex")
        break

3.guess_game

我們很容易看出,後面是一個lfsr算法。我們需要得知算法開始輸出的幾組數據並藉助BM算法破解lfsr。但是我們發現題目中(500,10)這種情況無法直接進到。根據題目中顯示我們可以知道d_{n}=(a*d^{n-1}+c)modb的前6組d,我們需要根據前6組d獲得第7組d,使我們進入(500,10)這種情況。我們對式子倆倆做差多的diff_{n}=(a*diff^{n-1})modb。對之後的式子倆倆做乘積,可以後的a*diff_{n}*diff_{n}=(a*diff^{n-1}*diff_{n+1})modb。我們又已知a,b使素數。所以(diff_{n-1}*diff_{n+1} - diff_{n}*diff_{n})modb=0。所以diff_{n-1}*diff_{n+1} - diff_{n}*diff_{n}有因子b,我們多算幾組並計算最小公約數以或得到b.b得知後,a,c可以較簡單得到算出。後面的BM算法可以參看ctf-wiki

import gmpy2
data=[10560285172026979789,7091424991536965424,6809696842726163240,5765862432211137569,7039323662218201419,12300172601551213011]
def inc_func(s,mod,mul):
	inc=(s[1]-s[0]*mul)%mod
	return mod,mul,inc
def mul_func(s,mod):
	mul=(s[2]-s[1])*gmpy2.invert(s[1]-s[0],mod)%mod
	return inc_func(s,mod,mul)
def mod_func(s):
	diffs=[s1-s0 for s0,s1 in zip(s,s[1:])]
	zeros=[t2*t0-t1*t1 for t0,t1,t2 in zip(diffs,diffs[1:],diffs[2:])]
	mod=abs(reduce(gmpy2.gcd,zeros))
	return mul_func(s,mod)

mod,mul,inc=mod_func(data)
print mod,mul,inc
print (data[0]*mul+inc)%mod==data[1]
print (data[-1]*mul+inc)%mod

求解a,b,v

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章