|
实验报告内容基本要求及参考格式
应用Python程序设计语言的相关知识,理解并实现凯撒密码加解密过程。
Python3.6
实验原理: 1:观察import this的运行结果,分析原理 this.py文件是一段关于凯撒密码左移13位的解密代码,执行import this可以得到它的明文,即Tim Peters作于1999年的python之禅。 https://www.playrobot.com/robotpress/archives/5956 2:实现凯撒密码加解密过程。 凯撒密码,又称移位密码 **可采用频率分析或者单词分词 实验步骤: 2:针对2实验,有两种建立不同字典对应关系的方法。 方法一:我们可以套用this.py的解密,实现凯撒密码加解密过程。 字典的建立:建立字母之间的移位关系的字典。ASCII码65(A)-90(Z)和97(a)-122(z)分别有各自对应的关系。大写字母对应大写字母,小写字母对应小写字母,建立移位的字典关系。 例:this.py中的字典 方法二:字典的建立:大小写字母混合建立字典对应关系 例:假设**为13,解密的情况下的字典
随后,根据建立的字典对应关系,我们可以利用dict.get()的方法,直接获取明文或密文所对应的密文或明文。如果不是字母,则返回该默认值,即它本身。再利用str.join()函数将单个结果连接起来。
程序及运行结果:方法一 print("***********************") print("**请选择:0-解密;1-加密**") choose = int(input("请选择加密or解密:")) k = int(input("请输入**k:")) d = {} #dict if choose == 0: s = input("请输入密文C:") for c in (65, 97): #A-a for i in range(26): d[chr(i+c)] = chr((i+k) % 26 + c)
print("".join([d.get(c, c) for c in s])) else: s = input("请输入明文:") for c in (65, 97): #A-a for i in range(26): d[chr(i+c)] = chr((i-k) % 26 + c)
print("".join([d.get(c, c) for c in s]))
程序及运行结果:方法二 SumTab = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
print("***********************") print("**请选择:0-解密;1-加密**") choose = int(input("请选择加密or解密:")) k = int(input("请输入**k:")) d2 = {} #dict if choose == 0: s = input("请输入密文C:") for i in range(len(SumTab)): d2[SumTab[i]]=SumTab[(i+k)%len(SumTab)]
print("".join([d2.get(c, c) for c in s])) else: s = input("请输入明文:") for i in range(len(SumTab)): d2[SumTab[i]]=SumTab[(i-k)%len(SumTab)]
print("".join([d2.get(c, c) for c in s]))
思路: 1建立字母之间的字典对应关系 2.使用dict.get()和str.join()函数分别进行字母的替换和结果的连接
觉得最神奇的大概就是dict.get()函数,以前写过凯撒类似的古典密码,当时不知道dict.get()可以如此使用,所以往往需要判断空格,换行等特殊情况,所以很麻烦。但是dict.get()就完美的解决了字母对应字母关系的替换,当遇到不是字母的特殊字符时,会默认返回它本身。 |