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 enumerate()函数 在Python中,enumerate()是一个内置函数,用于将一个可迭代对象转换为一个枚举对象,该对象包含每个元素的索引和对应的值。enumerate()函数返回的是一个由元组组成的迭代器,每个元组包含两个元素,第一个元素是元素的索引,第二个元素是元素的值。
Nginx隐藏和显示版本号 默认情况下,Nginx在返回Response时,会在Header中设置一个Server的参数,Server的值为web服务程序名及其版本信息;返回的404、503错误信息也会包含版本信息;因为Nginx的一些漏洞会在特定的版本中出现,暴漏的版本号就可能成为攻击者可以利用的信息;所以我们最好将版本信息隐藏。
Rust获取命令行参数 所谓的命令行参数,是指程序在命令行或SHELL上运行时后跟的参数;Rust语言中获取命令行参数的方法如下:
Python中@property和@*.setter装饰器的详细用法 @property装饰器的作用是,将一个函数装饰成为类的一个属性,当某个属性需要动态的计算时,用@property来装饰函数最好不过了;
C语言生成指定长度的字符串密码 在C语言中使用当前时间和进程识别码作为随机种子,生成一个指定长度,内容随机的字符串密码;
Python issubclass()函数 在Python中,issubclass()函数用于判断一个类是否是另一个类的子类。