1024程序员解密游戏

简介:     人们喜欢造节。一些人就起哄把 10 月 24 日叫做程序员节。1024 是 2 的 10 次方,是计算机存储单位的换算率,1024 字节等于 1K,1024K 等于 1M,以此类推。因此 1024 这个数字被认为与程序员相关。     编程的本质是组合创造,是思考,优秀的程序应该正确、简单、健壮。所谓的程

    人们喜欢造节。一些人就起哄把 10 月 24 日叫做程序员节。1024 是 2 的 10 次方,是计算机存储单位的换算率,1024 字节等于 1K,1024K 等于 1M,以此类推。因此 1024 这个数字被认为与程序员相关。

    编程的本质是组合创造,是思考,优秀的程序应该正确、简单、健壮。所谓的程序员节其实毫无意义。不过在身边有两个活动,一是亲橙里旁边有一个展台派送礼品,二是下班的时候(约 18:30) Rancher 公众号推送了一个程序员解密游戏。这个游戏其实有点意思,即贴合程序员知识,又贴合大众娱乐。注意:想要自己解题的小伙伴看完图片后就此打住,不要再往下看了。

图片.png

    谜面主体是图片中间的一段密文,群里很快有人看出这是 摩尔斯电码(Morse code),并得到官方确认。

    摩尔斯电码(Morse code,又译为摩斯密码)是早期用于发送电报等信息的编码,与计算机使用二进制编码数据类似,摩尔斯电码使用短声嘀 di 和长声嗒 dah 两种状态编码数据。以短声嘀 di 的时间为一个时间单位 t,停顿时间也为 t,长声嗒 dah 时间为 3t 。国际摩尔斯电码给出了 26 个英文字母和 10 个阿拉伯数字的编码表,如下图所示。

图片.png

    摩尔斯电码并非纯二进制编码(如果使用纯二进制编码,编码间的停顿应该是无意义的)。一个字符的摩尔斯电码需要使用分隔符指明边界。摩尔斯(或者维尔?)很聪明,他想到可以使用较长时间的停顿(3t)来分隔字符,还可以使用更长时间的停顿来分割单词、句子等。停顿时间虽然有意义,但并不能引入全功能的状态位(停顿本身也是状态位的边界),因此摩尔斯电码也不是 3 进制编码,大概可以叫做 2.5 进制编码。

    书写时通常使用点(.)表示滴 di,横(-)表示嗒 dah,分割符可以使用空格或 / 等。通常空白无意义,使用 / 更容易阅读和排版。可见上述密文几乎是标准的摩尔斯电码。根据图片提示,还可以回复公众号得到可复制的文本形式密文,密文如下。

-.-/..-/..---/-/--./---/-.../--../-.-/..-/..---/.--/./-.--/
.-./-/-.-/..-/..---/--./-.-/---/-.../.--/-.-/..-/...--/-../
./--/.---/.-./-.-/..-/...--/-/--/---/-.../..-/-.-/..-/...--/
-/./-./.-../-.-./-.../../-...-/-...-/-...-/-...-/-...-/-...-

    根据编码表,就可以完成解码。为了方便人肉编码解码,还有人整理了一张字母编码表,如下图所示。

图片.png

    为了偷懒,直接在网上找了一个 在线翻译器 。没想到这个翻译器很粗糙,还有部分编码没翻译过来,看了下未翻译的部分是数字,敢情这个翻译器只认识英文字母。

图片.png

    还好数字部分不多,而且数字编码规则很简单(共 5 位,点在前每点加一,横在前大于 5,每横加一),可以人肉翻译补齐,如 ..---2 。这时有人在群里贴出了解码后的结果,这样是不对的,透露答案。于是我直接将其复制出来,如下,简单核对了一下,应该没问题。

KU2TGOBZKU2WEYRTKU2GKOBWKU3DEMJRKU3TMOBUKU3TENLCBI

    稍后,官方宣布截止到 19:40 已有超过 34 人解密成功,但决定再追加 34 个名额。

    显然,解码后的这段文本仍然是一段编码。官方透露第二层加密的线索也在图片中,还确认 2 的 5 次方里有秘密,这样是不对的,透露答案。2 的 5 次方是 32,于是我打开 python3 尝试直接用 base32 解码试试。

$ python3
Python 3.6.8 (default, Oct  7 2019, 12:59:55) 
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import base64
>>> base64.b32decode('KU2TGOBZKU2WEYRTKU2GKOBWKU3DEMJRKU3TMOBUKU3TENLCBI')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.6/base64.py", line 205, in b32decode
    raise binascii.Error('Incorrect padding')
binascii.Error: Incorrect padding

    提示编码没有填充对齐,难道是前面摩尔斯电码没有解码完吗?回头看,果然在编码结尾 CBI 后,还有 -...- 这样的编码,上述国际摩尔斯电码表里查不出这个编码,可能是某种扩展编码,也可能根本就毫无意义。再看了下,发现原密文结尾连续出现 6 次出现此编码,或许就只是用来填充对齐 base32 编码。不管了,先尝试补 6 个 = 上去做填充对齐,再次尝试 base32 解码,竟解码成功。

>>> base64.b32decode('KU2TGOBZKU2WEYRTKU2GKOBWKU3DEMJRKU3TMOBUKU3TENLCBI======')
b'U5389U5bb3U4e86U6211U7684U725b\n'

    解码结果出来一些数字。本来准备好解密的某一步要用上 1024 这个数字(活动源头 + 图片中有隐约出现),但同时注意到每隔 4 个字符规律的出现一个大写的 U,结尾还有一个换行符 \n,熟悉 Java 或者 JSON 字符串转义的同学应该能猜到,这难道是变体的 Unicode 编码?注意:在 JSON 或 python3 里,2 字节范围的 Unicode 字符应该使用小写的 \u 转义,即 \uXXXX 的形式。手动解码一下试试,果然得到有意义的文字字符,总共没几个字符,全部手动解码即可。在英文编码间兜兜转转,最终通过 Unicode 回归伟大的中文。

>>> chr(0x5389)
'厉'
>>> chr(0x5bb3)
'害'

解码结果为 厉害了我的牛,这应该就是最终解密结果了,公众号回复验证成功,不过赶不上前 n 名了。

最后,收获是学习了摩尔斯电码(然而并没有什么用?),缺憾是准备好的 1024 这个数字竟然没用上。

相关文章
|
3月前
|
API C语言 C++
贪吃蛇游戏(必备知识篇)
贪吃蛇游戏(必备知识篇)
126 1
游戏开发零基础入门教程(14):把游戏分享给朋友们
你的第一个小游戏已经完成了,现在是时候把它分享给朋友们了。无需担心它看起来怎样,是否太过简单或者粗糙。总之它是你的第一个游戏作品,你值得为之高兴,也值得将这快乐分享出去。
136 0
|
开发工具
想学做游戏到底该怎么学
嗨!大家好,我是小蚂蚁。 遇到过很多想学习做游戏却又不得章法的人,有些人可能只是有个想法,有些人真的付诸了行动。但是大部分人最终都是以失败而告终的,不是说最终没有做出来一个游戏,而是连第一步的门槛也没迈的过去。 做游戏做了这么多年,也教了不少的学员,我觉得我至少有一定的经历,可以来说一下,想学习做游戏到底该怎么学。
224 0
快来看看,小蚂蚁准备要开一门游戏开发课了
做个简单的自我介绍吧!给那些还不认识我的朋友,我是小蚂蚁,从事游戏开发行业已经 6 年的时间,之前在团队中一直担任唯一的主程序的角色,做过大大小小的十几款游戏,如今是一个独立的游戏制作人,尝试以一己之力去完成整个游戏的创作,当然这里指的是小游戏。
91 0
小蚂蚁游戏开发的视频号
最近除了写图文教程,小蚂蚁也开通了视频号,开始做短视频了。 为什么要做短视频呢?因为这是趋势,不管你愿不愿意承认,短视频的洪流已经冲过来了,作为个体,在面对趋势时,最好的策略呢,就是去顺应。 虽然我个人更倾向于看文字或者是图文,而且也更愿意去写图文教程。但是,在趋势面前,我还是尝试着去做短视频了,而且也做了几次直播。虽然目前还没有什么效果,但是慢慢来吧!没有谁能一上手就做的很好,慢慢积累吧!毕竟我是一个相信通过持续不断的积累定会产生好结果的人。
90 0
|
存储 缓存 前端开发
关于我用iVX沉浸式体验了一把0代码创建飞机大战这件事
很多朋友还是会在后台问iVX的系统架构是什么。 这里我就给大家先再简单详细的介绍一下!~
关于我用iVX沉浸式体验了一把0代码创建飞机大战这件事
|
传感器 移动开发 前端开发
从《淘特斗地主》说起,前端如何做 h5 游戏的游戏体验
从《淘特斗地主》说起,前端如何做 h5 游戏的游戏体验
1032 1
从《淘特斗地主》说起,前端如何做 h5 游戏的游戏体验
|
存储 JavaScript 安全
妈妈,我要做游戏, 一文告诉你怎么入行游戏开发
经常在csdn 上看到我用java 做了什么游戏,我用python做了什么游戏,而且很多人阅读,我只想说你们都是弟弟,都是外行,你们写的那张根本就不是游戏行业的生产方式,连个玩具都不算,自嗨还行,没有一点专业性,专业的还是要看我的,正儿八经的做游戏的。
253 0
妈妈,我要做游戏, 一文告诉你怎么入行游戏开发
|
JavaScript 前端开发 程序员
CodeCombat:玩游戏就能学会编程的开源项目
CodeCombat是一个通过玩游戏来学习编程的网站,也是GitHub上最大的开源CoffeeScript(一种脚本语言,类似JavaScript)项目,有上千程序员和玩家为其编写程序、测试游戏。到目前为止,已经翻译成17种国外语言。最近,该网站将所有源代码提交到GitHub上,实现了全面开源。
1160 0
CodeCombat:玩游戏就能学会编程的开源项目
|
Python
使用Python编程打造一款游戏
使用Python编程打造一款游戏
201 0
使用Python编程打造一款游戏

热门文章

最新文章