Python之禅
在Python命令行运行import this
,会打印出python之禅
|
|
而运行print(this.s)
,则会打印出一段”乱码”:
|
|
这段”乱码”的结构看上去和Python之禅一样,在Python源码中的Lib/this.py
里,有一段解码程序:
|
|
密码学解释
Python之禅使用了一种简单的对称加密方法,即替换密码。
替换密码的基本思路是用一个符号替换另外一个符号,比如用h
代替a
,用x
代替b
等。
替换密码有一个特例,叫移位密码,也叫凯撒密码,这种密码是用某字符后面的第n个字符替换该字符。比如当n=1
时,是用b
代替a
,用c
代替b
等等,用什么来代替z
呢,当然是a
了。
替换密码的加密方法是:
解密方法是
Python之禅用的就是移位密码,将大小写字母分别由其后面的第13个字母所替换,即用n
代替a
,用o
代替b
,以此类推。
上面的解码程序构建了一个解密字典d
,表示了原文和密文的对应关系,有趣的是,这个字典d
即可以作为加密字典,也可以作为解密字典。
也就是说,经过这段代码的处理,原文可以变成密文,密文还能变回原文。因为这个字典是这样的(这里只给出小写字母):
让我们来分析一下原因,首先其加密的方法是:
根据数论,我们可以说x + 13
与y
模26同余,即:
其中符号≡
表示同余,我们把等式两边减26,得到:
又因为
得到如下公式,即解密公式
本质上偏移为13的加解密公式为同一个公式,他们生成的加解密字典是一样的,这也就解释了刚才的问题。
扩展
如果只给了一段加密信息(这里只讨论替换密码),不知道加解密算法,这段信息应该怎么破解呢。
有两个方法:
- 暴力破解,即把所有替换的情况都尝试一遍,这个办法基本不可行。
- 字母频率分析,根据字母出现的频率猜测
字母频率分析
把文章中出现的字母进行统计并排序,和英语字母频率对比,根据排序猜测出对应的字母。
Python之禅的密文字母统计结果是(为了简化,统一按小写字母处理):
其中第一列是字母,第二列是出现次数,第三列是频率。
英语字母频率表中的字母出现频率前几位分别是
通过对比,r
和e
、g
和t
都可以匹配上,后面的几个字母不能严格安装字母频率顺序匹配,毕竟密文的样本量有限,但是字母频率表极大缩小了密码猜测的范围,效率比暴力破解法高很多。
结论
这种加密方法基本上没有什么可靠性,仅供学习和娱乐。