【Python】用让人看不懂的方式实现 ROT18
前言
各位是否见识过一些简单的古典加密算法?如前段时间说的摩斯电码,还有凯撒密码,栅栏密码等。这些很多都是 CTF 竞赛中的一些基础知识,加密逻辑也比较简单,却是目前用来逃避文字平台法眼的利器,就比如今天要说的 ROT18(Rotate by 18 places) 加密方式。
正文
ROT18 简介
总所周知,ROT13 是凯撒密码的一种变体,凯撒密码默认加密密钥为 3,即每次都将字母向后移 3 位(Rotate by 3 places),而 ROT13(Rotate by 13 places) 则是设置密钥为 13;ROT5(Rotate by 5 places) 则是用来处理十个阿拉伯数字的,目的和效果和上面一样。
细心的人可能发现,13 是单词表长度的一半;5 是个位数集的长度的一半。换句话说,同一串内容,经过 ROT13 或 ROT5 加密两次后的结果,和原文一样。所以一般的 ROT 系列加密程序不区分加密和解密功能。
明明要介绍 ROT18,为啥我扯了这么多 ROT13 和 ROT5?
解:
∵ 13 + 5 = 18
∴ ROT13 + ROT5 = ROT18
Python 程序实现
唠嗑一下 this
在正式讲代码之前,我想请各位看过《蛇宗三字经》的 Python 大佬,你们可细研 this
过模块?
我们知道,在终端中打开 Python 解释器,输入 import this
后回车,会看到蒂姆·彼得斯写的 The Zen of Python 原文(即《Python 之禅》,被有文化的人翻译成了《蛇宗三字经》)。
现在,请随机记住输出结果的一些字符,然后利用代码编辑器快速查找到 this
模块的源代码:
可以看到,上面的这一大串字符串格式和 this
模块的输出一样,但是字符完全不一样,且完全不可读(相对于人类)。全文只有一个地方涉及到了输出——即最后一行,里面调用到了 d, c, s
三个变量,这三个变量就足以影响程序的运行效果。
这里给大家揭秘一下,这里 this
模块用的是 ROT13 加密方式,将每一位字母后移 13 位。其中,代码中的 d 为 ROT13 密码字典,下面使用嵌套的 for 循环,利用 ascii 编码和 chr
函数生成结果填充字典 d
。
最后,遍历字符串中的每一个字符,分别往临时列表里添加利用密码字典获取到的密码,最后利用空字符串按序连接列表各元素,输出即可。
其实,
this
模块这么做是违反 Zen 本身提出的一些编码原则的。
看到这, 大家有什么感想?反正我有——可以抄借鉴了。
因为 ROT18 = ROT13 + ROT5,所以我们只需要依样画葫芦,把 ROT5 给实现了即可。
代码
def rot18(s: str):
d = {}
for c in (65, 97):
for i in range(26):
d[chr(i+c)] = chr((i+13) % 26 + c)
for n in range(0, 10):
d[str(n)] = str((n + 5) % 10)
return "".join([d.get(c, c) for c in s])
喏,这不是轻轻松松,有手就行?
然而一堆变量名只是一个字母,也照应了标题:让人看不懂……