python实现凯撒密码、凯撒加解密算法
凯撒密码的原理:计算并输出偏移量为3的凯撒密码的结果
注意:密文是大写字母,在变换加密之前把明文字母都替换为大写字母
defcasar(message): #*************begin************# message1=message.upper()#把明文字母变成大写 message1=list(message1)#将明文字符串转换成列表 list1=[] foriinrange(len(message1)): ifmessage1[i]=='': list1.append(message1[i])#若为空格不用移动 eliford(message1[i])<=90-3+1:#A-X右移三位 list1.append(chr(ord(message1[i])+3)) result=''.join(list1)#列表转换成字符串 else: list1.append(chr(ord(message1[i])-(26-3)))#Y和Z回到A、B result=''.join(list1) print(result) #**************end*************# defmain(): message=input() casar(message) if__name__=='__main__': main()
测试输入:Guet
预期输出:JXHW
测试输入:informationsecurity
预期输出:LQIRUPDWLRQVHFXULWB
凯撒密码原理:根据输入的加解密模式和密钥对消息进行加解密。
注意:如果是加密,输出的密文是大写字母,如果是解密,按照凯撒解密后,转换为小写后,输出解密后的明文.
defcasar(mode,message,key): #*************begin************# ifmode==1:#加密 message1=message.upper()#把明文字母变成大写 message1=list(message1)#将明文字符串转换成列表 list1=[] foriinrange(len(message1)): ifmessage1[i]=='': list1.append(message1[i])#若为空格不用移动 eliford(message1[i])<=65+key-1: list1.append(chr(ord(message1[i])+key))#右移key位 result=''.join(list1)#列表转换成字符串 else: list1.append(chr(ord(message1[i])-key)) result=''.join(list1) print(result) elifmode==0:#解密 message2=list(message)#将明文字符串转换成列表 list2=[] foriinrange(len(message2)): ifmessage2[i]=='': list2.append(message2[i])#若为空格不用移动 eliford(message2[i])<=65+key-1: list2.append(chr(ord(message2[i])+(26-key)))#右移三位 result=''.join(list2)#列表转换成字符串 else: list2.append(chr(ord(message2[i])-key)) result=''.join(list2) result=result.lower() print(result) #**************end*************# defmain(): mode=int(input())#1代表加密,0代表解密 message=input()#待加密或解密的消息 key=int(input())#key的范围0~25之间 casar(mode,message,key) if__name__=='__main__': main()
测试输入:
1
zhang
13
测试输出:
MUNAT
测试输入:
0
GOHUN
7
测试输出:
zhang
编写一个仿射加解密程序,范围是所有的大小写字母范围
本题需要掌握相关知识1.仿射加密算法,2.扩展的欧几里得算法。
假设X,Y,a,b是Z52整数环中的元素,a和b为密钥,X是原文,Y是密文
加密函数:Y=(aX+b)%52
获取乘法逆元
通过扩展的欧几里得算法求a的乘法逆元
加密过程
加密函数:Y=(aX+b)%52
解密过程
解密函数:X=(a的逆元)*(Y-B)%52
#仿射密码 defencrypt(k1,k2,message): #*************begin************# message1=list(message) list1=list(map(chr,range(ord('a'),ord('z')+1))) list2=list(map(chr,range(ord('A'),ord('Z')+1))) foriinrange(len(list1)): list1.append(list2[i]) y=[] foriinrange(len(message)): ifmessage1[i]=='': y.append(message1[i]) else: forjinrange(52): ifmessage1[i]==list1[j]: y.append(list1[(k1*j+k2)%52]) result=''.join(y) returnresult #**************end*************# defdecrypt(k1,k2,message): #*************begin************# #扩展欧几里得算法求逆元法 #x1,x2,x3=1,0,52 #y1,y2,y3=0,1,k1 #whileTrue: #ify3==0: #return'None' #break #elify3==1: #a_reverse=y2%52 #break #else: #Q=x3//y3 #t1,t2,t3=x1-Q*y1,x2-Q*y2,x3-Q*y3 #x1,x2,x3=y1,y2,y3 #y1,y2,y3=t1,t2,t3 #已知模求逆元 foriinrange(1,53): ifk1*i%52==1: a_reverse=i message1=list(message) list1=list(map(chr,range(ord('a'),ord('z')+1))) list2=list(map(chr,range(ord('A'),ord('Z')+1))) foriinrange(len(list1)): list1.append(list2[i]) x=[] foriinrange(len(message1)): ifmessage1[i]=='': x.append(message1[i]) else: forjinrange(52): ifmessage1[i]==list1[j]: x.append(list1[(a_reverse*(j-k2))%52]) result=''.join(x) returnresult #**************end*************# defmain(): mode=int(input())#1代表加密,0代表解密 message=input()#待加密或解密的消息 key1=int(input())#key的范围0~51之间 key2=int(input())#key的范围0~51之间 ifmode==1: translated=encrypt(key1,key2,message) else: translated=decrypt(key1,key2,message) print(translated) if__name__=='__main__': main()
测试输入:
1
zhang
7
31
预期输出:
YCFsv
测试输入:
0
gVEXGTiDIT
5
29
预期输出:
LovelyBaby
总结
到此这篇关于python语言编程实现凯撒密码、凯撒加解密算法的文章就介绍到这了,更多相关python凯撒密码凯撒加解密算法内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!