buuctf學習筆記


crypto

18.信息化時代的步伐

得到一串數字606046152623600817831216121621196386
這是中文電碼,用在線網站解密下

flag{計算機要從娃娃抓起}

19.RSA1

c≡m^emodn
m≡c^dmodn
ϕ(n)=(p−1)∗(q−1)
d∗e≡1modϕ(n)
dp≡dmod(p−1)
dq≡dmod(q−1)
因為n=pq,所以m1=c^dmodp,m2=c^dmodq
求明文m即為求這兩個同余式的解,應該使用中國剩余定理解答
假設d=k(p-1)+dp
即m1=c^(k(p-1)+dp)modp
又因為c^(p-1)modp≡1
所以m1≡c^dpmodp
同理m2≡c^dqmodq

代碼如下:

import gmpy2
n1=8637633767257008567099653486541091171320491509433615447539162437911244175885667806398411790524083553445158113502227745206205327690939504032994699902053229 
n2=12640674973996472769176047937170883420927050821480010581593137135372473880595613737337630629752577346147039284030082593490776630572584959954205336880228469 
dp=6500795702216834621109042351193261530650043841056252930930949663358625016881832840728066026150264693076109354874099841380454881716097778307268116910582929 
dq=783472263673553449019532580386470672380574033551303889137911760438881683674556098098256795673512201963002175438762767516968043599582527539160811120550041 
c=24722305403887382073567316467649080662631552905960229399079107995602154418176056335800638887527614164073530437657085079676157350205351945222989351316076486573599576041978339872265925062764318536089007310270278526159678937431903862892400747915525118983959970607934142974736675784325993445942031372107342103852
M = n1*n2

m1 = n2

m2 = n1

c1 = gmpy2.powmod(c,dp,n1)
c2 = gmpy2.powmod(c,dq,n2)

t1 = c1*m1*gmpy2.invert(m1,n1)

t2 = c2*m2*gmpy2.invert(m2,n2)


x = (t1+t2) % M

flag1= hex(x)[2:]
print(flag1)
print(bytes.fromhex(hex(x)[2:])) 

20.凱撒?替換?呵呵!

密文為:MTHJ{CUBCGXGUGXWREXIPOYAOEYFIGXWRXCHTKHFCOHCFDUCGTXZOHIXOEOWMEHZO}

在這個網站奇怪的上單暴力破解

'substitution cipher decryption is always easy just like a piece of cake'.replace(' ','').lower()

flag{substitutioncipherdecryptionisalwayseasyjustlikeapieceofcake}

21.old-fashion

密文:Os drnuzearyuwn, y jtkjzoztzoes douwlr oj y ilzwex eq lsdexosa kn pwodw tsozj eq ufyoszlbz yrl rlufydlx pozw douwlrzlbz, ydderxosa ze y rlatfyr jnjzli; mjy gfbmw vla xy wbfnsy symmyew (mjy vrwm qrvvrf), hlbew rd symmyew, mebhsymw rd symmyew, vbomgeyw rd mjy lxrzy, lfk wr dremj. Mjy eyqybzye kyqbhjyew mjy myom xa hyedrevbfn lf bfzyewy wgxwmbmgmbrf. Wr mjy dsln bw f1_2jyf-k3_jg1-vb-vl_l

在這個網站奇怪的上單暴力破解

flag{n1_2hen-d3_hu1-mi-ma_a}

22.權限獲得第一步

密文:Administrator:500:806EDC27AA52E314AAD3B435B51404EE:F4AD50F57683D4260DFD48AA351A17A8:::
密文符合Windows NTLM Hash的形式,考慮對其后32為進行處理
F4AD50F57683D4260DFD48AA351A17A8MD5解密

萌萌噠的八戒

豬圈解密工具

flag{whenthepigwanttoeat}

23.世上無難事

密文:VIZZB IFIUOJBWO NVXAP OBC XZZ UKHVN IFIUOJBWO HB XVIXW XAW VXFI X QIXN VBD KQ IFIUOJBWO WBKAH NBWXO VBD XJBCN NKG QLKEIU DI XUI VIUI DKNV QNCWIANQ XN DXPIMKIZW VKHV QEVBBZ KA XUZKAHNBA FKUHKAKX XAW DI VXFI HBN QNCWIANQ NCAKAH KA MUBG XZZ XEUBQQ XGIUKEX MUBG PKAWIUHXUNIA NVUBCHV 12NV HUXWI XAW DI XUI SCQN QB HZXW NVXN XZZ EBCZW SBKA CQ NBWXO XAW DI DXAN NB NVXAP DXPIMKIZW MBU JIKAH QCEV XA BCNQNXAWKAH VBQN HKFI OBCUQIZFIQ X JKH UBCAW BM XLLZXCQI XAW NVI PIO KQ 640I11012805M211J0XJ24MM02X1IW09

在這個網站奇怪的上單暴力破解

在python中轉為小寫
'flag{640E11012805F211B0AB24FF02A1ED09}'.lower()
flag{640e11012805f211b0ab24ff02a1ed09}

24.RSA3(共模攻擊)

題目:
c1=22322035275663237041646893770451933509324701913484303338076210603542612758956262869640822486470121149424485571361007421293675516338822195280313794991136048140918842471219840263536338886250492682739436410013436651161720725855484866690084788721349555662019879081501113222996123305533009325964377798892703161521852805956811219563883312896330156298621674684353919547558127920925706842808914762199011054955816534977675267395009575347820387073483928425066536361482774892370969520740304287456555508933372782327506569010772537497541764311429052216291198932092617792645253901478910801592878203564861118912045464959832566051361
n=22708078815885011462462049064339185898712439277226831073457888403129378547350292420267016551819052430779004755846649044001024141485283286483130702616057274698473611149508798869706347501931583117632710700787228016480127677393649929530416598686027354216422565934459015161927613607902831542857977859612596282353679327773303727004407262197231586324599181983572622404590354084541788062262164510140605868122410388090174420147752408554129789760902300898046273909007852818474030770699647647363015102118956737673941354217692696044969695308506436573142565573487583507037356944848039864382339216266670673567488871508925311154801
e1=11187289
c2=18702010045187015556548691642394982835669262147230212731309938675226458555210425972429418449273410535387985931036711854265623905066805665751803269106880746769003478900791099590239513925449748814075904017471585572848473556490565450062664706449128415834787961947266259789785962922238701134079720414228414066193071495304612341052987455615930023536823801499269773357186087452747500840640419365011554421183037505653461286732740983702740822671148045619497667184586123657285604061875653909567822328914065337797733444640351518775487649819978262363617265797982843179630888729407238496650987720428708217115257989007867331698397
e2=9647291
因為e1,e2的最大公約數為1,這個可以通過gmpy2.gcd(e1,e2)驗證
因此:存在e1*s1+e2*s2=1
m = c1^d1 mod n
m = c2^d2 mod n
c1^s1 mod n=m^(e1*s1) mod n
c2^s2 mod n=m^(e2*s2) mod n
c1^s1*c2^s2 mod n=m^(e1*s1+e2*s2) mod n
c1^s1*c2^s2  =m mod n
因此只需要找到s1,s2即可求出明文m
import gmpy2
import binascii

def main():
    n = 22708078815885011462462049064339185898712439277226831073457888403129378547350292420267016551819052430779004755846649044001024141485283286483130702616057274698473611149508798869706347501931583117632710700787228016480127677393649929530416598686027354216422565934459015161927613607902831542857977859612596282353679327773303727004407262197231586324599181983572622404590354084541788062262164510140605868122410388090174420147752408554129789760902300898046273909007852818474030770699647647363015102118956737673941354217692696044969695308506436573142565573487583507037356944848039864382339216266670673567488871508925311154801
    c1 = 22322035275663237041646893770451933509324701913484303338076210603542612758956262869640822486470121149424485571361007421293675516338822195280313794991136048140918842471219840263536338886250492682739436410013436651161720725855484866690084788721349555662019879081501113222996123305533009325964377798892703161521852805956811219563883312896330156298621674684353919547558127920925706842808914762199011054955816534977675267395009575347820387073483928425066536361482774892370969520740304287456555508933372782327506569010772537497541764311429052216291198932092617792645253901478910801592878203564861118912045464959832566051361
    c2 = 18702010045187015556548691642394982835669262147230212731309938675226458555210425972429418449273410535387985931036711854265623905066805665751803269106880746769003478900791099590239513925449748814075904017471585572848473556490565450062664706449128415834787961947266259789785962922238701134079720414228414066193071495304612341052987455615930023536823801499269773357186087452747500840640419365011554421183037505653461286732740983702740822671148045619497667184586123657285604061875653909567822328914065337797733444640351518775487649819978262363617265797982843179630888729407238496650987720428708217115257989007867331698397
    e1 = 11187289
    e2 = 9647291
    # s11=gmpy2.invert(e1,e2)
    s22=gmpy2.invert(e2,e1)
    s11=int((1-e2*s22)/e1)  #float->int

    m = pow(c1,s11,n)*pow(c2,s22,n)%n
    print(m)
    flag = binascii.unhexlify(hex(m)[2:])
    print(flag)


if __name__ == '__main__':
    main()

flag{49d91077a1abcb14f1a9d546c80be9ef}
別人的解法

25.RSA2(dp泄露攻擊)

e<p-1
dp*e=ed(modp-1)
ed=k(p-1)+dp*e
ed=1(mod(p-1)(q-1))
ed=m(p-1)(q-1)+1
聯立可得:(p-1)*i+1=dp*e     //(i=m(q-1)-k)
dp<p-1
i<e
找到i即可計算出p
import gmpy2 as gp
import binascii

e = 65537
n = 248254007851526241177721526698901802985832766176221609612258877371620580060433101538328030305219918697643619814200930679612109885533801335348445023751670478437073055544724280684733298051599167660303645183146161497485358633681492129668802402065797789905550489547645118787266601929429724133167768465309665906113
dp = 905074498052346904643025132879518330691925174573054004621877253318682675055421970943552016695528560364834446303196939207056642927148093290374440210503657

c = 140423670976252696807533673586209400575664282100684119784203527124521188996403826597436883766041879067494280957410201958935737360380801845453829293997433414188838725751796261702622028587211560353362847191060306578510511380965162133472698713063592621028959167072781482562673683090590521214218071160287665180751


for i in range(1,e):                   #在范圍(1,e)之間進行遍歷
    if(dp*e-1)%i == 0:
        if n%(((dp*e-1)//i)+1) == 0:   #存在p,使得n能被p整除
            p=((dp*e-1)//i)+1
            q=n//(((dp*e-1)//i)+1)
            phi=(q-1)*(p-1)            #歐拉定理
            d=gp.invert(e,phi)         #求模逆
            m=pow(c,d,n)               #快速求冪取模運算
           
print(m)                               #10進制明文
print('------------')
print(hex(m)[2:])                      #16進制明文
print('------------')
print(bytes.fromhex(hex(m)[2:]))       #16進制轉文本
print(binascii.unhexlify(hex(m)[2:]))

flag{wow_leaking_dp_breaks_rsa?_98924743502}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM