
今天遇见一密码题目,感觉甚是不解,记录下
如下:
李磊是一名程序员,在他的笔记本里有一些这样的记录: QQ:iloveyou521 blog:blog132 wechat:wechat190 看着应该像是密码,于是尝试去登录,发现密码错误 后来一打听,原来他将这些密码经过自己写的一个简单的加密算法变成真实的密码,而自己笔记本中存放的只是一些虚假的密码,只是方便记忆而已 其真实密码如下: QQ:+p)g$_)‘521 blog:hp)u132 wechat:A$ezr&190 hint:Caesar flag is spru.r5sf3h7660h7394e169699hffe0s0h$4, Please restore the real flag
提示了凯撒,可是并没有发现有很强烈的对应关系(可能本人太菜- -)
不过好像隐藏着一些线索,在加密QQ/blog/wechat时,这些字符与字符的对应关系是不变的
而Flag使用的正是含有对应关系的字符串
例如:
spru -> flag
r5s -> a5f(在wechat加密时 a加密为r 5不动为5 s对应的是flag中的f)
所以我们可以依据对应关系来进行直接解密:
import string
a = "iloveyou521blog132wechat190flag"
b = "+p)g$_)'521hp)u132A$ezr&190spru"
tmp = "r5sf3h7660h7394e169699hffe0s0h$4"
tmp1= ""
for x in tmp:
if x in string.digits:
tmp1 = tmp1+x
else:
try:
y = a[b.index(x)]
tmp1 = tmp1+y
except:
tmp1 = tmp1+" "
print(tmp1)
运行得到了 a5f 3b7660b7394c169699b c0f0be4 中间这三个空格对应的都是密文中的f 而它对应的明文字符肯定没有出现在上面已经解密出的字符串中,所以排除了明文中出现的a、f、b等等… 又因为这个平台的flag都是16进制,所以可能的只有d,所以flag就是a5fd3b7660b7394c169699bddc0f0be4