题目描述

你和小鱼终于走到了最后的一个谜题所在的地方,上面写着一段话“亲爱的朋友, 很开心你对网络安全有这么大的兴趣,希望你一直坚持下去,不要放弃 ,学到一些知识, 走进广阔的安全大世界”,你和小鱼接过谜题,开始了耐心细致的解答。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

我们可以编写脚本:

  1. ans = [88421, 122, 48, 2244, 4, 142242, 248, 122]
  2. for i in ans:
  3. temp = 0
  4. while i:
  5. temp += i % 10
  6. i = i // 10
  7. temp = ord('A') + temp - 1
  8. print(chr(temp), end="")

运行结果如下:

  1. 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))