实现移位密码(凯撒密码)加密算法(两种方法),凯撒加密算法,列表版本#!/usr/b
实现移位密码(凯撒密码)加密算法(两种方法),凯撒加密算法,列表版本#!/usr/b
列表版本
#!/usr/bin/python3#License:GPL v3 or higher.#Copyright (C) 2012 Biergaizi#实际上,这个程序是这样的:#首先,初始化一个字母表。然后让用户输入一段明文,并将该字符串转换成每个字符为一个对象的列表。#然后,让用户输入一个密钥,即字母移位的量。接着,通过种种方法来化简这个移位量,比如移动26位实际上是没有移位。#再然后,按照顺序处理每一个字母,这使用循环即可轻易实现。#首先得到用户明文列表字母里第n个字母在字母表里的顺序,然后进行移位。即直接加上处理过的移位量。并最后输出。#不过,需要判断用户的明文到底是大写字母,还是小写字母,并使用不同的列表alphabet和alphabet_upper来处理输出。#不过有两种异常需要处理:#1.如果根本不是字母,则直接输出,不加密。2.列表出界问题,解决的方法是将列表首尾相连,如果向前出界,就跳到最后;亦而反之。#判断输入的过程都是用多组try...except...实现的。#最后输出这一个字母的密文,由于是循环,因此将处理并输出完所有的字母,程序才会停止。#比尔盖子#2012/03/01#-----------------------------------------------import systimes=0#初始化一个字母表alphabet=['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']alphabet_upper=['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']plain=input("Please input your plain text: ")value=input("Please input your key(included negatives): ")try: value=int(value)except ValueError: print("Please input an integer.") sys.exit()#将用户输入的内容转换为列表,每个字母都是列表中的一个对象。secret_list=list(plain)secret_list_len=len(secret_list)print("")print("secret: ",end='')#循环一次就处理一个字母while times < secret_list_len: times=times+1#num实际上就是最终字母的移位量。 #这分为几步: #第一步:取出plain这个列表的第某个对象,times为循环次数。第一次循环就处理第一个字母哦!但由于列表从0开始,因此-1。 #第二步:alphabet.index用来将用户输入在plain列表的字母,查到alphabet列表对应的位置。 #第三步:在这个位置上加上value这个用户设置的移位量。最终的变量将是一个已经移动位置的alphabet列表对象顺序。 #这个try...except实际上就是: try: #如果这个try完全正常,则说明这是一个小写字母(能在alphabet中找到该字母),同时不存在列表超出范围(list index out of range)的问题。那么,将密文保存到output。 num=int(alphabet.index(plain[times-1])+int(value)) output=alphabet[num] except ValueError: #如果发生了ValueError,则说明这不是一个小写字母(不能在alphabet中找到该字母)。 try: #如果这个try完全正常,则说明这是一个大写字母(能在alphabet_upper中找到该字母),同时不存在列表超出范围的问题。那么,将密文保存到output。 num=int(alphabet_upper.index(plain[times-1])+int(value)) output=alphabet_upper[num] except IndexError: #如果发生了IndexError,则说明这是一个大写字母,但是列表超出范围。那么,如果列表是向前超出范围的,将回到后面;亦而反之。这是通过修改num实现的。修正之后,将密文保存到output。 if num>25: num=int(num%26) if num<-25: num=int(-(-num%26)) output=alphabet_upper[num] except ValueError: #如果发生了ValueError,则说明这不是一个英文字母(无论是alphabet或alphabet_upper都不存在该字母)。那么,这个字符将不会被加密,直接保存到output。 output=plain[times-1] except IndexError: #如果发生了IndexError,则说明这是一个小写字母,但是列表超出范围。那么,如果列表是向前超出范围的,将回到后面;亦而反之。这是通过修改num实现的。修正之后,将密文保存到output。 if num>25: num=int(num%26) if num<-25: num=int(-(-num%26)) output=alphabet[num] #最终,将保存在output中的密文输出。 print(output,end='') #由于是循环输出,每次都会换行,将导致输出的密文难以阅读。因此用end=''选项不换行。#由于不换行,最后一行看着很难受,故换一行。print("")
ANSI版本
#License:GPL v3 or higher.#Copyright (C) 2012 Biergaiziimport systimes=0plain=input("Please input your plain text: ")value=input("Please input your key(included negatives): ")secret_list=list(plain)secret_list_len=len(secret_list)try: value=int(value)except ValueError: print("Please input an integer.") sys.exit()#a的ANSI码是97, z的ANSI码是122。#A的ANSI码是65, Z的ANSI码是90。print("")print("secret: ",end='')while times < secret_list_len: times=times+1 #ansi_raw即没有经过任何处理的原始ANSI。 ansi_raw=ord(secret_list[0+times-1]) #ansi是经过移位加密的ANSI。 ansi=ansi_raw+int(value) #word是用户输入的原始字符。 word=(secret_list[0+times-1]) #如果ansi_raw小于65或大于90,而且还不是小写字母,那么则说明它根本就不是字母。不加密,直接输出原始内容。 if (ansi_raw < 65 or ansi_raw > 90) and word.islower() == False : print(word,end='') #如果ansi_raw小于97或大于122,而且还不是大写字母,那么则说明它根本不是字母。不加密,直接输出原始内容。 elif (ansi_raw < 97 or ansi_raw > 122) and word.isupper() == False: print(word,end='') #否则,它就是字母。 else: #如果它是大写字母,而且ANSI码大于90,则说明向后出界。那么通过这个公式回到开头,直到不出界为止。 while word.isupper() == True and ansi > 90: ansi = -26 + ansi #如果它是大写字母,而且ANSI码小于65,则说明向前出界。那么通过这个公式回到结尾,直到不出界为止。 while word.isupper() == True and ansi < 65: ansi = 26 + ansi #如果它是小写字母,而且ANSI码大于122,则说明向后出界。那么通过这个公式回到开头,直到不出界为止。 while word.isupper() == False and ansi > 122: ansi = -26 + ansi #如果它是小写字母,而且ANSI码小于97,则说明向前出界。那么通过这个公式回到结尾,直到不出界为止。 while word.isupper() == False and ansi < 97: ansi = 26 + ansi #将处理过的ANSI转换为字符,来输出密文。 print(chr(ansi),end='')print("")
相关内容
- python glob 用通配符查找指定目录中的文件,,[Python]代码
- 使用python smtplib库发邮件添加cc,bcc,smtplibbcc,[Python]代
- Python分割文件,python分割,[Python]代码#e
- 自动登录网络设备备份配置文件 version0.2版本,自动登
- 学习和分享,学习分享,[Python]代码#-
- Python 函数的周期性执行,python函数周期性,python sched
- 基于PyQt的Python识别Access密码,pyqtpythonaccess,[Python]代码
- 用来调试嵌入式服务器连接数,写的简单python脚本,嵌
- 利用Flask实现在线Whois 域名查询,flaskwhois,[Python]代码
- (Python学习)CSV电话本,python学习csv电话,CSV电话本#Fil
评论关闭