消失的三重密码

时间:2015-11-07 | 分类:个人日志,学习园地 | 浏览:4502 | 评论:2 | 发表评论

【也许是双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

标签: , ,
本文链接: 消失的三重密码
版权所有: 破博客, 转载请注明本文出处。

2个评论

  1. nic
    2015/11/18 00:53:26

    程序有点儿看不太懂

    • admin
      2015/11/25 23:41:15

      是吧,因为python的语法太强大了

发表评论

您的昵称: *

您的邮箱: * (显示gravatar头像)

联系方式: