buuctf crypto

题目一:凯撒密码的base64形式
给出字符串 e6Z9i~]8R~U~QHE{RnY{QXg~QnQ{^XVlRXlp^XI5Q6Q6SKY8jUAA。

要求:解密获得flag 
解题思路:

观察最后的AA,联想到base64编码最后常出现的==,A的ASCII码值为65,=的ASCII的码值为61,分析可能是base64编码做了偏移,尝试将密文所有字符的ASCII码值-4,然后再做base64解码。
也可以从 010 编辑器 批量改字符

也可以得到
a2V5ezY4NzQzMDAwNjUwMTczMjMwZTRhNThlZTE1M2M2OGU4fQ==

总结:
遍历密文字符串的每个字符,获取它的ascii码值,-4之后转化为新的ASCII字符,拼接转化的字符之后获得还原的base64字符串,然后再做base64解密。这里的4就相当于凯撒密码的密钥。

base64编码之后做偏移加密,凯撒密码的base64形式。

结果:key{68743000650173230e4a58ee153c68e8}


题目二:恺撒密码
Fhfpgs{3r811r068s5pr27ro4op1p37723q7rr2}
解题思路:

恺撒密码:它的偏移量最多就是25。请通过穷举找到 Susctf{XXX} 的字符串

答案

def unlock(text):
    for i in text:
        if 65 + key <= ord(text) < 92 or 97 + key <= ord(text) < 123:
            text = chr(ord(text) - key)
        elif 65 <= ord(text) < 65 + key or 97 <= ord(text) < 97 + key:
            text = chr(ord(text) - key + 26)
        else:
            text = text
    return text


text = 'Fhfpgs{3r811r068s5pr27ro4op1p37723q7rr2}'
plaintext = ""
for key in range(1, 27):
    for k in list(map(unlock, text)):
        plaintext = plaintext + k
    print("第%d把钥匙的结果是%s" % (key, plaintext))
    plaintext = ""

输出结果

第1把钥匙的结果是Egeofr{3q811q068r5oq27qn4no1o37723p7qq2}
第2把钥匙的结果是Dfdneq{3p811p068q5np27pm4mn1n37723o7pp2}
第3把钥匙的结果是Cecmdp{3o811o068p5mo27ol4lm1m37723n7oo2}
第4把钥匙的结果是Bdblco{3n811n068o5ln27nk4kl1l37723m7nn2}
第5把钥匙的结果是Acakbn{3m811m068n5km27mj4jk1k37723l7mm2}
第6把钥匙的结果是Zbzjam{3l811l068m5jl27li4ij1j37723k7ll2}
第7把钥匙的结果是Yayizl{3k811k068l5ik27kh4hi1i37723j7kk2}
第8把钥匙的结果是Xzxhyk{3j811j068k5hj27jg4gh1h37723i7jj2}
第9把钥匙的结果是Wywgxj{3i811i068j5gi27if4fg1g37723h7ii2}
第10把钥匙的结果是Vxvfwi{3h811h068i5fh27he4ef1f37723g7hh2}
第11把钥匙的结果是Uwuevh{3g811g068h5eg27gd4de1e37723f7gg2}
第12把钥匙的结果是Tvtdug{3f811f068g5df27fc4cd1d37723e7ff2}
第13把钥匙的结果是Susctf{3e811e068f5ce27eb4bc1c37723d7ee2}
第14把钥匙的结果是Rtrbse{3d811d068e5bd27da4ab1b37723c7dd2}
第15把钥匙的结果是Qsqard{3c811c068d5ac27cz4za1a37723b7cc2}
第16把钥匙的结果是Prpzqc{3b811b068c5zb27by4yz1z37723a7bb2}
第17把钥匙的结果是Oqoypb{3a811a068b5ya27ax4xy1y37723z7aa2}
第18把钥匙的结果是Npnxoa{3z811z068a5xz27zw4wx1x37723y7zz2}
第19把钥匙的结果是Momwnz{3y811y068z5wy27yv4vw1w37723x7yy2}
第20把钥匙的结果是Lnlvmy{3x811x068y5vx27xu4uv1v37723w7xx2}
第21把钥匙的结果是Kmkulx{3w811w068x5uw27wt4tu1u37723v7ww2}
第22把钥匙的结果是Jljtkw{3v811v068w5tv27vs4st1t37723u7vv2}
第23把钥匙的结果是Ikisjv{3u811u068v5su27ur4rs1s37723t7uu2}
第24把钥匙的结果是Hjhriu{3t811t068u5rt27tq4qr1r37723s7tt2}
第25把钥匙的结果是Gigqht{3s811s068t5qs27sp4pq1q37723r7ss2}
第26把钥匙的结果是Fhfpgs{3r811r068s5pr27ro4op1p37723q7rr2}
最后找到,第13把钥匙的结果是

Susctf{3e811e068f5ce27eb4bc1c37723d7ee2}


题目三:摩斯密码
 ..-./.-../.-/--./----.--/-../...--/..-./-.-./-.../..-./.----/--.../..-./----./...--/----./----./...../-----/....-/-----.-
在 https://www.bejson.com/enc/morse/可以得到

FLAG%u7bD3FCBF17F9399504%u7d
FLAG{D3FCBF17F9399504}

然后转小写

flag{d3fcbf17f9399504}

题目给了描述:一只小羊翻过了2个栅栏

fa{fe13f590lg6d46d0d0}

def encrypt_fence(string, key):  # 没用到
    ciphertext = ""
    temp = []
    for i in range(key):
        temp.append("")
    for index, i in enumerate(string):
        temp[index % key] += i
    # print("".join(temp))
    ciphertext = "".join(temp)
    return ciphertext

def decrypt_fence(string, key):
    plaintext = ""
    length = len(string)
    min_row = length // key
    max_num = length % key
    temp = []
    index = 0
    for i in range(key):
        if i < max_num:
            temp.append(string[index:index + min_row + 1])
            index += min_row + 1
        else:
            temp.append(string[index:index + min_row])
            index += min_row
    # print(temp)
    for i in range(length):
        plaintext += temp[i % key][i // key]
    return plaintext


print(decrypt_fence("fa{fe13f590lg6d46d0d0}", 2) == 'flag{6fde4163df05d900}')
# print(encrypt_fence("flag{6fde4163df05d900}", 2) == 'fa{fe13f590lg6d46d0d0}')
结果:flag{6fde4163df05d900}

传统知识+古典密码
题目描述:

1小明某一天收到一封密信,信中写了几个不同的年份
        2  辛卯,癸巳,丙戌,辛未,庚辰,癸酉,己卯,癸巳。
       3   信的背面还写有“+甲子”,请解出这段密文。
4key值:CTF{XXX}
根据天干地支纪年法

1. 甲子 2.乙丑 3.丙寅 4.丁卯 5.戊辰 6.己巳 7.庚午 8.辛未 9.壬申 10.癸酉
11.甲戌 12.乙亥 13.丙子 14.丁丑 15.戊寅 16.己卯 17.庚辰 18.辛巳 19.壬午 20.癸未
21.甲申 22.乙酉 23.丙戌 24.丁亥 25.戊子 26.己丑 27.庚寅 28.辛卯 29.壬辰 30.癸巳
31.甲午 32.乙未 33.丙申 34.丁酉 35.戊戌 36.己亥 37.庚子 38.辛丑 39.壬寅 40.癸卯
41.甲辰 42.乙巳 43.丙午 44.丁未 45.戊申 46.己酉 47.庚戌 48.辛亥 49.壬子 50.癸丑
51.甲寅 52.乙卯 53.丙辰 54.丁巳 55.戊午 56.己未 57.庚申 58.辛酉 59.壬戌 60.癸亥
写出题中所给组合的数字编码

28    30    23    8    17    10    16    30
加上一个甲子(60)

88    90    93    68    77    70    76    90

转换成ASCII字母:
XZSDMFLZ
栅栏密码(两栏):
XMZFSLDZ
凯撒:
SHUANGYU
最后按格式提交CTF{SHUANGYU}即可。

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值