buuctf之crypto部分解题思路

大帝的密码武器

题目

公元前一百年,在罗马出生了一位对世界影响巨大的人物,他生前是罗马三巨头之一。
他率先使用了一种简单的加密函,因此这种加密方法以他的名字命名。
以下密文被解开后可以获得一个有意义的单词:FRPHEVGL
你可以用这个相同的加密向量加密附件中的密文,作为答案进行提交。

进行凯撒密码解密
python脚本:

def decode(secret):
    min=ord("a")
    max=ord("z")
    for offset in range(26):
        plaint=''
        for s in secret:
            o=ord(s)+offset
            o=(o-max+min-1) if o>max else o
            plaint+=chr(o)
        print(plaint,offset)

str_secret='FRPHEVGL'.lower()
decode(str_secret)

得到:

frphevgl 0
gsqifwhm 1
htrjgxin 2
iuskhyjo 3
jvtlizkp 4
kwumjalq 5
lxvnkbmr 6
mywolcns 7
nzxpmdot 8
oayqnepu 9
pbzrofqv 10
qcaspgrw 11
rdbtqhsx 12
security 13
tfdvsjuz 14
ugewtkva 15
vhfxulwb 16
wigyvmxc 17
xjhzwnyd 18
ykiaxoze 19
zljbypaf 20
amkczqbg 21
bnldarch 22
comebsdi 23
dpnfctej 24
eqogdufk 25

移位13得到security。再对附件中的密文加密:ComeChina
注意大小写

1
P要大写flag{PbzrPuvan}

rsarsa

Math is cool! Use the RSA algorithm to decode the secret message, c, p, q, and e are parameters for the RSA algorithm.//数学很酷!使用 RSA 算法解码秘密消息,c、 p、 q 和 e 是 RSA 算法的参数

p = 9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483
q = 11874843837980297032092405848653656852760910154543380907650040190704283358909208578251063047732443992230647903887510065547947313543299303261986053486569407
e = 65537
c = 83208298995174604174773590298203639360540024871256126892889661345742403314929861939100492666605647316646576486526217457006376842280869728581726746401583705899941768214138742259689334840735633553053887641847651173776251820293087212885670180367406807406765923638973161375817392737747832762751690104423869019034

Use RSA to find the secret message//使用RSA来找到秘密消息

已知c,p,q,e,n=p*q,求明文M
python脚本:

'''已知p,q,e,c.很明朗了,求d再解:'''
import gmpy2

e = 65537
p = 9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483
q = 11874843837980297032092405848653656852760910154543380907650040190704283358909208578251063047732443992230647903887510065547947313543299303261986053486569407
n = p * q
# 密文
C = 83208298995174604174773590298203639360540024871256126892889661345742403314929861939100492666605647316646576486526217457006376842280869728581726746401583705899941768214138742259689334840735633553053887641847651173776251820293087212885670180367406807406765923638973161375817392737747832762751690104423869019034

d = gmpy2.invert(e, (p - 1) * (q - 1))
print(d)
# 求明文
M = pow(C, d, n)  # 快速求幂取模运算
print(M)

解出M值:5577446633554466577768879988
flag{5577446633554466577768879988}

Windows系统密码

内容:

Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
ctf:1002:06af9108f2e1fecf144e2e8adef09efd:a7fcb22a88038f35a8f39d503e7f0062:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
SUPPORT_388945a0:1001:aad3b435b51404eeaad3b435b51404ee:bef14eee40dffbc345eeb3f58e290d56:::

像hash密码,常用hash算法:
1
先试试MD5,a7fcb22a88038f35a8f39d503e7f0062明文为good-luckmd5解密
flag{good-luck}

中文电码

来源

  中文电码,又称中文商用电码、中文电报码或中文电报明码,原本是于电报之中传送中文信息的方法。它是第一个把汉字化作电子讯号的编码表。
  自摩尔斯电码在1835年发明后,一直只能用来传送英语或以拉丁字母拼写的文字。1873年,法国驻华人员威基杰(S·A·Viguer)参照《康熙字典》的部首排列方法,挑选了常用汉字6800多个,编成了第一部汉字电码本,名为《电报新书》。后由我国的郑观应将其改编成为《中国电报新编》。这是中国最早的汉字电码本。中国人最早研制的电报机华侨商人王承荣从法国回国后,与福州的王斌研制出我国第一台电报机,并呈请政府自办电报。清政府拒不采纳。

应用

  中文电码可用作电脑里的中文输入法,但因中文电码是“无理码”,记忆困难,一般用户几乎无法熟练地掌握使用。
  在香港,每个有中文姓名的市民的身份证上,均会在他的姓名下面,印有中文电码,外国人取得的入港签证亦有印上。在很多政府或商业机构的表格中,都会要求填写者填写他的中文电码,以便输入电脑。
  美国签证申请表(DS-160表)中,要求申请人填写姓名的中文电码,一些生僻字没有对应的中文电码时,可用“0000”代替。

原理

  中文电码表采用了四位阿拉伯数字作代号,从0001到9999按四位数顺序排列,用四位数字表示最多一万个汉字、字母和符号。汉字先按部首,后按笔划排列。字母和符号放到电码表的最尾。后来由于一万个汉字不足以应付户籍管理的要求,又有第二字面汉字的出现。在香港,两个字面都采用同一编码,由输入员人手选择字面;在台湾,第二字面的汉字会在开首补上“1”字,变成5个数字的编码。

密文:606046152623600817831216121621196386
中文电码查询

凯撒?替换?呵呵!

MTHJ{CUBCGXGUGXWREXIPOYAOEYFIGXWRXCHTKHFCOHCFDUCGTXZOHIXOEOWMEHZO} 注意:得到的 flag 请包上 flag{} 提交, flag{小写字母}
MTHJ明显对应flag,quipqiup-cryptoquip和解密
1
得到明文转换为小写去掉空格就行了

萌萌哒的八戒 (猪圈密码)

1
猪圈密码解密
1

传统知识+古典密码

小明某一天收到一封密信,信中写了几个不同的年份
辛卯癸巳丙戌辛未庚辰癸酉己卯癸巳
信的背面还写有“+甲子”,请解出这段密文。

key值:CTF{XXX}

六十年甲子(干支表)

1一甲子为60年

辛卯,顺序为第28个 + 甲子(60) –> 88 –> X
癸巳,顺序为第30个 + 甲子(60) –> 90 –> Z
丙戌,顺序为第23个 + 甲子(60) –> 93 –> S
辛未,顺序为第8个 + 甲子(60) –> 68 –> D
庚辰,顺序为第17个 + 甲子(60) –> 77 –> M
癸酉,顺序为第10个 + 甲子(60) –> 70 –> F
己卯,顺序为第16个 + 甲子(60) –> 76 –> L
癸巳,顺序为第30个 + 甲子(60) –> 90 –> Z

XZSDMFLZ
看了下writeup:
先栅栏,后凯撒:

栅栏fence解码:
因数[2, 4]:
分为2栏时,解密结果为:XMZFSLDZ
分为4栏时,解密结果为:XSMLZDFZ

然后分别解密
凯撒Caesar解码:
key #0: XMZFSLDZ
key #1: WLYERKCY
key #2: VKXDQJBX
key #3: UJWCPIAW
key #4: TIVBOHZV
key #5: SHUANGYU
key #6: RGTZMFXT
key #7: QFSYLEWS
key #8: PERXKDVR
key #9: ODQWJCUQ
key #10: NCPVIBTP
key #11: MBOUHASO
key #12: LANTGZRN
key #13: KZMSFYQM
key #14: JYLREXPL
key #15: IXKQDWOK
key #16: HWJPCVNJ
key #17: GVIOBUMI
key #18: FUHNATLH
key #19: ETGMZSKG
key #20: DSFLYRJF
key #21: CREKXQIE
key #22: BQDJWPHD
key #23: APCIVOGC
key #24: ZOBHUNFB
key #25: YNAGTMEA

凯撒Caesar解码:
key #0: XSMLZDFZ
key #1: WRLKYCEY
key #2: VQKJXBDX
key #3: UPJIWACW
key #4: TOIHVZBV
key #5: SNHGUYAU
key #6: RMGFTXZT
key #7: QLFESWYS
key #8: PKEDRVXR
key #9: OJDCQUWQ
key #10: NICBPTVP
key #11: MHBAOSUO
key #12: LGAZNRTN
key #13: KFZYMQSM
key #14: JEYXLPRL
key #15: IDXWKOQK
key #16: HCWVJNPJ
key #17: GBVUIMOI
key #18: FAUTHLNH
key #19: EZTSGKMG
key #20: DYSRFJLF
key #21: CXRQEIKE
key #22: BWQPDHJD
key #23: AVPOCGIC
key #24: ZUONBFHB
key #25: YTNMAEGA

flag{SHUANGYU}

RSA1

p = 8637633767257008567099653486541091171320491509433615447539162437911244175885667806398411790524083553445158113502227745206205327690939504032994699902053229
q = 12640674973996472769176047937170883420927050821480010581593137135372473880595613737337630629752577346147039284030082593490776630572584959954205336880228469
dp = 6500795702216834621109042351193261530650043841056252930930949663358625016881832840728066026150264693076109354874099841380454881716097778307268116910582929
dq = 783472263673553449019532580386470672380574033551303889137911760438881683674556098098256795673512201963002175438762767516968043599582527539160811120550041
c = 24722305403887382073567316467649080662631552905960229399079107995602154418176056335800638887527614164073530437657085079676157350205351945222989351316076486573599576041978339872265925062764318536089007310270278526159678937431903862892400747915525118983959970607934142974736675784325993445942031372107342103852

先摆出已知条件:

c ≡ m e m o d n c≡m^{e} mod n c≡memodn m ≡ c d m o d n m≡c^{d} mod n
m≡cdmodn ϕ ( n ) = ( p − 1 ) ∗ ( q − 1 ) ϕ(n)=(p−1)∗(q−1)
ϕ(n)=(p−1)∗(q−1) d ∗ e ≡ 1 m o d ϕ ( n ) d∗e≡1 mod ϕ(n) d∗e≡1modϕ(n) d
p ≡ d m o d ( p − 1 ) dp≡d mod (p−1) dp≡dmod(p−1) d q ≡ d m o d ( q −
1 ) dq≡d mod (q−1) dq≡dmod(q−1)

import libnum
def egcd(a, b):
    if (b == 0):
        return 1, 0, a
    else:
        x, y, q = egcd(b, a % b)  # q = GCD(a, b) = GCD(b, a%b)
        x, y = y, (x - (a // b) * y)
        return x, y, q

def mod_inv(a, b):
    return egcd(a, b)[0] % b  # 求a模b得逆

p = 8637633767257008567099653486541091171320491509433615447539162437911244175885667806398411790524083553445158113502227745206205327690939504032994699902053229
q = 12640674973996472769176047937170883420927050821480010581593137135372473880595613737337630629752577346147039284030082593490776630572584959954205336880228469
dp = 6500795702216834621109042351193261530650043841056252930930949663358625016881832840728066026150264693076109354874099841380454881716097778307268116910582929
dq = 783472263673553449019532580386470672380574033551303889137911760438881683674556098098256795673512201963002175438762767516968043599582527539160811120550041
c = 24722305403887382073567316467649080662631552905960229399079107995602154418176056335800638887527614164073530437657085079676157350205351945222989351316076486573599576041978339872265925062764318536089007310270278526159678937431903862892400747915525118983959970607934142974736675784325993445942031372107342103852

invq=mod_inv(p,q)
mp=pow(c,dp,p)
mq=pow(c,dq,q)
m=((mp-mq)*invq%p)*q+mq
print(libnum.n2s(m))

得到noxCTF{W31c0m3_70_Ch1n470wn}

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

请我喝杯咖啡吧~

支付宝
微信