步骤
发现密文如下:
c8e9aca0c6f2e5f3e8c4efe7a1a0d4e8e5a0e6ece1e7a0e9f3baa0e8eafae3f9e4eafae2eae4e3eaebfaebe3f5e7e9f3e4e3e8eaf9eaf3e2e4e6f2
仔细分析一下密文是由数字0-9和字母a-f组成,可以看出是十六进制的密文,一个十六进制数等于四个二进制数,所以一个字节等于两个十六进制数等于八个二进制数。跟上一题差不多的解法:
直接上python脚本
str_hex = 'c8e9aca0c6f2e5f3e8c4efe7a1a0d4e8e5a0e6ece1e7a0e9f3baa0e8eafae3f9e4eafae2eae4e3eaebfaebe3f5e7e9f3e4e3e8eaf9eaf3e2e4e6f2'
# 两个十六进制数=八个二进制数=一个字节
flag = ''
# 两个为一组
for i in range(len(str_hex)//2):
flag += chr(int(str_hex[i*2:(i+1)*2], 16)-128) # 取一个字节转换成十进制,减去128再转换成字符
print(flag)
至于为什么减去128,最坑的就是这了。ascii码的范围是0-127,这里转换为十进制数后明显发现都是大于127的,所以得减去128(我是这样理解的:一个轮回之后会从头重新匹配,比如127->127,128->0,129->1…)
最后提交的时候记得是flag{xxx}的形式,直接提交字符串是错的
总结
密码学的应用(十六进制)
熟悉ASCII码以及各种进制的转换
善于使用代码作为工具