题目一:凯撒密码的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}