APP下载

Python字符映射实现凯撒加密

2021-07-01牟晓东

电脑报 2021年8期
关键词:字符串英文字母凯撒

牟晓东

Python提供了比较丰富的字符串常用方法,其中的maketrance()和translate()是一对专门用来生成字符映射表和根据映射表进行字符转换的方法,可以同时处理多个不同的字符,经常应用于字符串的加密和解密。

1.字符映射加密的简单应用举例

maketrance()方法一般用于创建字符映射的转换表,两个参数为长度一致的字符串,作用是将前面字符串中的字符转换成后面字符串中的对应字符;而translate()方法则是配合maketrance()方法实现字符串内容的替换。在此编写一个简单的英文加密小程序。

首先建立变量table并赋值为“‘.maketrans(‘abcdefg,‘nmlkjih)”,作用是利用建立maketrance()方法来建立字符映射表,把第一个参数“abcdefg”中的各个字符依次替换为“nmlkjih”中的各个字符,即a映射为n、b映射为m、c映射为l……接着建立变量s,其值为使用input获取用户从键盘输入的一句英文;然后建立变量miwen,其值为“s.translate(table)”,根据之前使用maketrance()方法创建的table映射表完成对应字符的一一映射;最后,使用print语句输出变量miwen,即“加密后的密文”。

运行程序,按照提示输入经典测试句:“The quick brown fox jumps over a lazy dog.”(这句话包含全部字母),得到加密后的密文结果:“Thj quilk mrown iox jumps ovjr n lnzy koh.”(如图1)。原句中的“abcdefg”七个字母都被分别替换为“nmlkjih”,实现了加密。

2.字符映射的“非完全”解密法

既然利用maketrance()方法的加密是将两个字符串进行映射替换,那么理论上可以将两个字符串位置互换来实现解密。即table变量的值变成“‘.maketrans(‘nmlkjih,‘abcdefg)”,其他的内容基本不变,只修改一下对应的提示信息。在“请输入待解密的一句英文:”提示后面输入刚刚得到的加密句子:“Thj quilk mrown iox jumps ovjr n lnzy koh.”,回车后得到解密后的原文是:“Tge qufcd browa fox eubps over a cazy dog.”,并未还原最初的经典测试句子(如图2)。那么究竟错出在哪儿呢?

那是因为无论是加密还是解密时,使用maketrance()方法建立的字符映射表并不全面,没有将所有的大小写英文字母都进行映射,只是建立了7个字母之间的相互映射(即加密与解密)。解密时,程序会机械地将密文中的所有“nmlkjih”这七个字母还原为“abcdefg”,但密文中有些“nmlkjih”最初并不是由“abcdefg”加密而来的。想要实现真正的解密,必须在加密时对所有的大小写英文字母进行逐一不重复的映射替换,其实凯撒加密就是一种通过字母移位的方式来加密信息的方法。

3.字符映射实现凯撒加密

首先使用“import string”语句导入string库,接着使用变量s来接收用户从键盘输入的待加密的英文。变量n是用来接收凯撒加密的移位要求,因为有26个英文字母,所以加密的有效移位数字共有25个(1-25);特别注意input语句接收的是字符串型数据,必须通过int来转换为整数。

然后建立lower和upper两个变量,其值分别为26个英文小写字母(string.ascii_lowercase)和大写字母(string.ascii_uppercase),这是string库所提供的常量;同样,变量before的值为“string.ascii_letters”,也是string库中已经定义好的常量值,意思是所有的大小写英文字母。变量after则是利用了Python的“切片”操作,其中的“lower[n:] + lower[:n]”是完成英文小写字母的循环移位,而“upper[n:] + upper[:n]”则是大写字母的循环移位,移位的步长即用户之前从键盘上输入的数值n。

建立变量table,其值为“‘.maketrans(before,after)”,即包括所有大小写在内的英文字母完整映射表。最后,通过print语句输出凯撒加密后的密文信息“s.translate(table)”。

运行程序,按照提示仍然输入那句经典测试句子。回车后,提示输入加密的移位数字,输入“6”,得到了加密后的密文“Znk waoiq hxuct lud pasvy ubkx g rgfe jum.”(如图3)。

4.凱撒加密的解密方法

由于程序中已经包括了所有的英文大小写字母,因此简单地修改table变量的值即可实现凯撒密码的解密,也就是将maketrance()方法的before和after两个参数进行位置互换即可。运行解密程序,输入刚刚加密后的结果,收到“解密的移位数字”,此时必须要输入之前加密时的移位数字“6”,才能得到正确的原文信息。如果输入其他的数字,比如“11”,就无法正确还原出之前未加密的原文,得到的是“Ocz lpdxf wmjri ajs ephkn jqzm v gvut yjb.”。

猜你喜欢

字符串英文字母凯撒
凯撒的倒霉事
英文字母,你们看上去萌萌哒
一字千进(23)
从《高卢战记》浅析凯撒其人
一种基于PowerBuilder环境字符串相似度算法
浅论《裘力斯凯撒》中的凯撒形象及其意义
SQL server 2008中的常见的字符串处理函数
倍增法之后缀数组解决重复子串的问题
捋顺绳子
洛斯警长的终极挑战⑤