题目描述
你和小鱼终于走到了最后的一个谜题所在的地方,上面写着一段话“亲爱的朋友, 很开心你对网络安全有这么大的兴趣,希望你一直坚持下去,不要放弃 ,学到一些知识, 走进广阔的安全大世界”,你和小鱼接过谜题,开始了耐心细致的解答。flag为cyberpeace{你解答出的八位大写字母}
8842101220480224404014224202480122
Solution
二进制数除了0和1的表示方法外,在由二进制转换成十进制的时候,还可以表示成2的N次方的形式。例如:
15 = 20 + 21 + 22 + 23
并且我们发现,任意的十进制数都可以用 2n 或 2n+2m+…… 的形式表示出来,可以表示的单元数由使用的max n来决定。
可表示的单元数 = 2(n+1) - 1
二进制幂数加密法就是应用这个原理,由于英文字母只有26个字母,由公式可知,只要2的0、1、2、3、4、5次幂就可以表示31个单元。通过用二进制幂数表示字母序号数来加密。例如
明文: d o n o t p u l l a l l y o u r e g g s i n o n e b a s k e t
字母序号:4 15 14 15 20 16 21 12 12 1 12 12 25 15 21 18 5 7 7 19 9 14 15 14 5 2 1 19 11 5 20
由于4 = 22 所以D加密过之后是2;15 = 20 + 21 + 22 + 23 所以O加密后是0123。同理得到上述明文的加密后的密文
密文:2 0123/123 0123 24/4 024 23 23/0 23 23/034 0123 024 14/02 012 012 014/03 123 /0123 123 02/1 0 014 013 02 24
其中空格表示字母的间隔,/表示单词的间隔。
在 CTF-WiKi 里也被称为“云影密码”,我们按照上面百度百科的解释,我们尝试破解
8842101220480224404014224202480122
由于题目提到了 8 个大写字母,这串数字又正好有 7 个零,所以我们把它分割成:
88421 0 122 0 48 0 2244 0 4 0 142242 0 248 0 122
我们可以编写脚本:
ans = [88421, 122, 48, 2244, 4, 142242, 248, 122]
for i in ans:
temp = 0
while i:
temp += i % 10
i = i // 10
temp = ord('A') + temp - 1
print(chr(temp), end="")
运行结果如下:
WELLDONE
附加一个 Python 进制转换表:
↓ | 2进制 | 8进制 | 10进制 | 16进制 |
---|---|---|---|---|
2进制 | — | bin(int(n,8)) |
bin(int(n,10)) |
bin(int(n,16)) |
8进制 | oct(int(n,2)) |
— | oct(int(n,10)) |
oct(int(n,16)) |
10进1 | int(n,2) |
int(n,8) |
— | int(n,16) |
16进制 | hex(int(n,2)) |
hex(int(n,8)) |
hex(int(n,10)) |
— |