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}

原文地址:https://www.cnblogs.com/wqnmlkb/p/14651175.html