【也许是双11史上最难拿的红包】What are you 弄啥嘞?双11圈新人阿里云放大招了,向全国的程序员发出了一封密码挑战书,破解者将有机会赢取阿里云双11专属红包!看不懂?没关系。即日起只要与阿里云官方微信互动,就能获取破解线索。当然,牛X的人无须线索[酷]。阿里云双11活动地址
一、第一重加密
由密文可以猜想加密方式是换字加密,所以需要先找到英文字母的对应表。
密文里有些字母标上了颜色,这应该就是提示了,红色字母为kearyod,绿色字母为d。
因为绿色是红色的反色,所以可以把绿色字母d反过来变成字母b。
小知识:补色在医疗方面也有所应用,如做手术的大夫穿绿色手术服,是因为手术中有大量红色的血,人看久了就会怠慢,从而延误手术。青绿色是红色的补色,大夫穿上了青绿色手术服,手术中看到红色,也看到青绿色,从而避免怠慢。
这样由kearyodb可以组合成英文单词keyboard
。大概是密文中没有字母b,出题人才会想到这一招。
keyboard
是键盘的意思,也就是说要将电脑键盘上的字母排列映射为英文字母表。
二、第二重加密
知道了映射表,就可以写一段代码来解密:
# -*- 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》,结果如下:
三、第三重加密
将上面的明文翻译为中文为:
房间里有四个相同的篮球和两个相同的足球。现在如果你想把它们排成一行,总共有多少种方案?提示:请改变你算出的数字的形式。程序员!
这是一道排列的数学题,只要求出两个足球放在六个位置有多少种方法就行了,因为剩下四个位置只能放篮球,不会影响排列。
所以排列方法有:(6 * 5) / (2 * 1) = 15
。
如果非得写代码来解决,那么可以用两行代码来搞定:
import itertools
balls = ["basketball"] * 4 + ["football"] * 2
print len(set(itertools.permutations(balls)))
执行结果是15。
由提示请改变你算出的数字的形式。程序员!
可知,程序员经常和二进制数据打交道,而15转成二进制是1111
。
由于这是双11的活动,所以答案很有可能就是1111
。
2015/11/18 00:53:26
程序有点儿看不太懂
2015/11/25 23:41:15
是吧,因为python的语法太强大了