抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

【也许是双11史上最难拿的红包】What are you 弄啥嘞?

双11圈新人阿里云放大招了,向全国的程序员发出了一封密码挑战书,破解者将有机会赢取阿里云双11专属红包!

看不懂?没关系。即日起只要与阿里云官方微信互动,就能获取破解线索。当然,牛X的人无须线索[酷]。

阿里云双11活动地址

This is a picture without description

一、第一重加密

由密文可以猜想加密方式是换字加密,所以需要先找到英文字母的对应表。
密文里有些字母标上了颜色,这应该就是提示了,红色字母为kearyod,绿色字母为d。
因为绿色是红色的反色,所以可以把绿色字母d反过来变成字母b。

小知识:补色在医疗方面也有所应用,如做手术的大夫穿绿色手术服,是因为手术中有大量红色的血,人看久了就会怠慢,从而延误手术。青绿色是红色的补色,大夫穿上了青绿色手术服,手术中看到红色,也看到青绿色,从而避免怠慢。

这样由kearyodb可以组合成英文单词keyboard。大概是密文中没有字母b,出题人才会想到这一招。
keyboard是键盘的意思,也就是说要将电脑键盘上的字母排列映射为英文字母表。

二、第二重加密

知道了映射表,就可以写一段代码来解密:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#coding:utf-8

keyboard = "qwertyuiopasdfghjklzxcvbnm"
alphabet = "abcdefghijklmnopqrstuvwxyz"

dictionary = dict(zip(keyboard, alphabet))

ciphertext = "of zit kggd zitkt qkt ygxk ortfzoeqs wqlatzwqssl qfr zvg ortfzoeqs yggzwqssl. fgv oy ngx vqfz zg hxz zitd of gft soft.piv dgfn lgsxzogfl qkt zitkt? zohl:hstqlt eiqfut zit ygkd gy zit fxdwtk ngx utz.zit hkgukqddtkl!"

result = ""
for x in ciphertext:
if x in dictionary:
result += dictionary[x]
else:
result += x

print(result)

输出结果为:

in the room there are four identical basketballs and two identical footballs. now if you want to put them in one line.zhw mony solutions are there? tips:please change the form of the number you get.the programmers!

其中zhw mony应该是how many的意思,可能出题者写错了,或者可能另有深意。

上面的两重加密也可以使用软件来暴力破解,可以参考文章《HCTF网络安全大赛——FuckMe》,结果如下:
This is a picture without description

三、第三重加密

将上面的明文翻译为中文为:

房间里有四个相同的篮球和两个相同的足球。现在如果你想把它们排成一行,总共有多少种方案?提示:请改变你算出的数字的形式。程序员!

这是一道排列的数学题,只要求出2个足球放在6个位置有多少种方法就行了,因为剩下4个位置只能放篮球,不会影响排列。
所以排列方法有:(6 * 5) / (2 * 1) = 15

如果非得写代码来解决,那么可以用两行代码来搞定:

1
2
3
4
import itertools

balls = ["basketball"] * 4 + ["football"] * 2
print(len(set(itertools.permutations(balls))))

执行结果是15。

由提示请改变你算出的数字的形式。程序员!可知,程序员经常和二进制数据打交道,而15转成二进制是1111
由于这是双11的活动,所以答案很有可能就是1111

评论