Python this模块的加密原理

Python中 this模块的代码(this模块位于Python安装目录/lib下):

s = """Gur Mra bs Clguba, ol Gvz Crgref

Ornhgvshy vf orggre guna htyl.
Rkcyvpvg vf orggre guna vzcyvpvg.
Fvzcyr vf orggre guna pbzcyrk.
Pbzcyrk vf orggre guna pbzcyvpngrq.
Syng vf orggre guna arfgrq.
Fcnefr vf orggre guna qrafr.
Ernqnovyvgl pbhagf.
Fcrpvny pnfrf nera'g fcrpvny rabhtu gb oernx gur ehyrf.
Nygubhtu cenpgvpnyvgl orngf chevgl.
Reebef fubhyq arire cnff fvyragyl.
Hayrff rkcyvpvgyl fvyraprq.
Va gur snpr bs nzovthvgl, ershfr gur grzcgngvba gb thrff.
Gurer fubhyq or bar-- naq cersrenoyl bayl bar --boivbhf jnl gb qb vg.
Nygubhtu gung jnl znl abg or boivbhf ng svefg hayrff lbh'er Qhgpu.
Abj vf orggre guna arire.
Nygubhtu arire vf bsgra orggre guna *evtug* abj.
Vs gur vzcyrzragngvba vf uneq gb rkcynva, vg'f n onq vqrn.
Vs gur vzcyrzragngvba vf rnfl gb rkcynva, vg znl or n tbbq vqrn.
Anzrfcnprf ner bar ubaxvat terng vqrn -- yrg'f qb zber bs gubfr!"""

d = {}
for c in (65, 97):
    for i in range(26):
        d[chr(i+c)] = chr((i+13) % 26 + c)

print("".join([d.get(c, c) for c in s]))

从源码中看出,作者定义了2个变量,字符串s和字典d;

s很明显是一段密文,d则是密码字典;

可以把密码字典的键理解为加密后的字符,而键对应的值则为原始明文。

密码字典的生成方法也很简单;

看生成算法,有两个for块;首先是字典的键(key),其值范围是 (65+0)~ (65+25)和(97+0)~(97+25)的ASCII编码。也就是英文字母的大小写。

其次是密码字典中键(key)对应的值(value),其值的是 (i+13)%26 + c 的ASCII编码。

我得到的密码字典:

{'A': 'N', 'B': 'O', 'C': 'P', 'D': 'Q', 'E': 'R', 'F': 'S', 'G': 'T', 'H': 'U', 'I': 'V', 'J': 'W', 'K': 'X', 'L': 'Y', 'M': 'Z', 'N': 'A', 'O': 'B', 'P': 'C', 'Q': 'D', 'R': 'E', 'S': 'F', 'T': 'G', 'U': 'H', 'V': 'I', 'W': 'J', 'X': 'K', 'Y': 'L', 'Z': 'M', 'a': 'n', 'b': 'o', 'c': 'p', 'd': 'q', 'e': 'r', 'f': 's', 'g': 't', 'h': 'u', 'i': 'v', 'j': 'w', 'k': 'x', 'l': 'y', 'm': 'z', 'n': 'a', 'o': 'b', 'p': 'c', 'q': 'd', 'r': 'e', 's': 'f', 't': 'g', 'u': 'h', 'v': 'i', 'w': 'j', 'x': 'k', 'y': 'l', 'z': 'm'}

接下来只需要遍历密文,从密码字典获取对应的值即可获得原始明文。

注意最后一行代码中的 d.get(c,c),它定义了默认值,当密码字典中没有对应值时返回默认值,因为密文字符串中有特殊符号是密码字典中没有的。

原创内容,如需转载,请注明出处;

本文地址: https://www.perfcode.com/p/508.html

分类: 计算机技术
推荐阅读:
python object()函数 object() 是 Python 的内置函数之一,它返回一个新的 object 对象。这个对象没有任何特殊的属性或方法,它是所有类的基类,即所有 Python 类都直接或间接地继承自 object 类。
VirtualBox的无缝模式真是太酷了 VirtualBox的无缝模式真的很酷,可以让虚拟机中的系统和Windows系统共享一个窗口,具体是个什么效果,请看下图:
TypeError: can't take floor or mod of complex number. 在Python中,复数类型不支持地板除(floor division)和取模(modulo)运算。因此,在尝试对复数执行//、%或divmod()函数运算时,会引发TypeError异常,提示can't take floor or mod of complex number.
C语言isprint()函数:判断字符是否可打印 isprint()是C语言标准库中的一个函数,用于检查一个字符是否为可打印字符;该函数与isgraph()函数有点相似,isgraph()函数也用于检查一个字符是否为可打印字符(但不包括空格字符),而isprint()函数则包含空格字符;
Golang读取INI配置文件到结构体 本文将介绍Golang使用github.com/go-ini/ini包读取ini配置文件到结构体的方法。
C语言使用fork()系统调用创建子进程 有些时候,创建多个子进程可用于提高任务处理效率或提高程序的并发性;在Linux系统下可使用fork()系统调用创建一个新的子进程;