前言:个人的学习总结,不对的地方欢迎大家批评指正,会每日更新一些题目!
题目:一段新闻
首先打开txt文件,发现里面是一段文字,并且有多段换行。推测是隐藏字符的加解密。
使用在线的工具进行隐藏字符的解密隐藏字符加密 - 一个工具箱 - 好用的在线工具都在这里!
发现得到的是社会主义核心价值观,使用随波逐流工具箱,或者使用在线工具社会主义核心价值观加密/解密 - 一个工具箱 - 好用的在线工具都在这里!解密,即可得到flag
得到结果为
flag{why_d0nt_you_try_t0_understand_socia1ism?}
题目:7+1+0
首先打开txt文件,有大小写,数字,符号,双等号推测是base64编码
使用随波逐流工具进行解码,得到flag
得到结果为
bugku{7bit28bit}
其他:如果使用在线工具得到的是部分字符是乱码,请看这篇博客CTF-bugku-crypto-[7+1+0]-base64解码之后做偏移_ctf 图片 偏移 加base64-CSDN博客
题目:这是个盲兔子,竟然在唱歌!
首先打开txt文件,发现里面是盲文,使用盲文网站破解,但发现是乱码文本加密为盲文,可自设密码|文本在线加密解密工具
把加密文本中的换行符删去,得到一串字符
看着有点像base64,但破解出来是乱码,最后从题目中的提示得知要用兔子密码在线Rabbit加密 | Rabbit解密- 在线工具
解密出来得到音符,也是从题目得知用音乐密码进行破解,得到答案
得到结果为
bugku{2at746c5jfc6nh5klxs0c7bcvrzfv5nv}
题目:道友不来算一算凶吉?
首先打开txt文件,得知密文和a与b的值
之后打开py文件,得知加密方式,需要我们写出逆向代码再通过密文来解出明文
这里逆向有点难,看了下别人的WP,然后对其进行修改和复现。大体思路是这样的:首先我们把上面的两个函数进行逆向(这是最难的一步),然后我们注意到加密其实是在ascii码的基础上进行的,那么就应该先把密文转化为ascii码。通过易经64卦创建相应的字典比如:'坤':'000000' ,这里坤对应的是二进制字符串。之后把密文转化为二进制字符串,并且每八位转化为10进制数,再用chr函数转化为ascii码,发现得到的是大小写,末尾还有两个等号,推测是base64,再对其进行解码得到处理后的密文。最后再使用前面逆向的两个函数对处理后的密文进行解密。
import base64
def decrypt4(enc): #加密是先5后4,所以逆向解密是先4后5,
temp = ''
offset = 5
for i in range(len(enc)): #这里是range(len(enc)),所以i在这里代表索引
temp += chr(ord(enc[i])+offset+i) #这里的i是索引,enc是字符串可以看成列表
return temp
def decrypt5(temp):
flag = ''
for i in temp: #这里是temp,所以i在这里代表temp中的字符
flag += chr((21*(ord(i)-97-7))%26+97) #这一步是逆向的精华,加密方式主要是ascii码的偏移,那么解密可以看作是解一个同余方程,解出同余方程,这道题就能解决了
return flag
s = '升益艮归妹井萃旅离旅困未济屯未济中孚未济升困噬嗑鼎震巽噬嗑解节井萃离未济蒙归妹大畜无妄解兑临睽升睽未济无妄遁涣归妹'
dic = {'坤': '000000', '剥': '000001', '比': '000010', '观': '000011', '豫': '000100', '晋': '000101', '萃': '000110', '否': '000111', '谦': '001000', '艮': '001001', '蹇': '001010', '渐': '001011', '小过': '001100', '旅': '001101', '咸': '001110', '遁': '001111', '师': '010000', '蒙': '010001', '坎': '010010', '涣': '010011', '解': '010100', '未济': '010101', '困': '010110', '讼': '010111', '升': '011000', '蛊': '011001', '井': '011010', '巽': '011011', '恒': '011100', '鼎': '011101', '大过': '011110', '姤': '011111',
'复': '100000', '颐': '100001', '屯': '100010', '益': '100011', '震': '100100', '噬嗑': '100101', '随': '100110', '无妄': '100111', '明夷': '101000', '贲': '101001', '既济': '101010', '家人': '101011', '丰': '101100', '离': '101101', '革': '101110', '同人': '101111', '临': '110000', '损': '110001', '节': '110010', '中孚': '110011', '归妹': '110100', '睽': '110101', '兑': '110110', '履': '110111', '泰': '111000', '大畜': '111001', '需': '111010', '小畜': '111011', '大壮': '111100', '大有': '111101', '夬': '111110', '乾': '111111'}
li = []
k = 0 #k用于识别是一个字还是两个字
for i in range(len(s)):
if k==1:
k = 0
continue #continue要在if里面
try:
li.append(dic[s[i]]) #也就是把字典中s密文的部分,用二进制字符串添加进li列表中
except:
t = ''
t = s[i]+s[i+1]
li.append(dic[t])
k = 1 #这里k = 1表示进行了两字处理
binary_str = "".join(li) #将li列表中的元素进行连接
print(binary_str)
temp_str = ''
handel_str = ''
for i in range(0,len(binary_str),8): #注意这里的range函数里面是逗号不是切片语法中的冒号
temp_str = binary_str[i:i+8] #这里把二进制字符串进行8位分割,用来转ascii码
handel_str += chr(int(temp_str,2)) #这里就是转ascii码了
print(handel_str) #打印出来发现是base64,这时候才去import base64
decode_str = ''
decode_str = base64.b64decode(handel_str).decode() #base64的解码
print(decode_str)
temp_flag = decrypt4(decode_str)
final_flag = decrypt5(temp_flag)
print(final_flag)
分别得到过程结果如下
得到结果为
flag{shaodayouxiduoduyijing}