python实现凯撒密码、凯撒加解密算法


Posted in Python onJune 11, 2020

凯撒密码的原理:计算并输出偏移量为3的凯撒密码的结果
注意:密文是大写字母,在变换加密之前把明文字母都替换为大写字母

def casar(message):
# *************begin************#
 message1=message.upper() #把明文字母变成大写
 message1=list(message1) #将明文字符串转换成列表
 list1=[]
 for i in range(len(message1)):
 if message1[i]==' ':
  list1.append(message1[i]) #若为空格不用移动
 elif ord(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*************# 
 
 
def main():
 message = input()
 casar(message)
if __name__=='__main__':
 main()

测试输入:Guet
预期输出:JXHW
测试输入:information security
预期输出:LQIRUPDWLRQ VHFXULWB

凯撒密码原理:根据输入的加解密模式和密钥对消息进行加解密。
注意:如果是加密,输出的密文是大写字母,如果是解密,按照凯撒解密后,转换为小写后,输出解密后的明文.

def casar(mode,message,key):
# *************begin************#
 if mode==1: #加密
 message1 = message.upper() # 把明文字母变成大写
 message1 = list(message1) # 将明文字符串转换成列表
 list1 = []
 for i in range(len(message1)):
  if message1[i] == ' ':
  list1.append(message1[i]) # 若为空格不用移动
  elif ord(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)
 elif mode==0: #解密
 message2 = list(message) # 将明文字符串转换成列表
 list2 = []
 for i in range(len(message2)):
  if message2[i] == ' ':
  list2.append(message2[i]) # 若为空格不用移动
  elif ord(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*************# 

def main():
 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

#仿射密码

def encrypt(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)))
 for i in range(len(list1)):
 list1.append(list2[i])
 y=[]
 for i in range(len(message)):
 if message1[i]==' ':
  y.append(message1[i])
 else:
  for j in range(52):
  if message1[i]==list1[j]:
   y.append(list1[(k1*j + k2) % 52])
   result = ''.join(y)
 return result
# **************end*************# 

def decrypt(k1,k2,message):
# *************begin************#
	#扩展欧几里得算法求逆元法
 # x1, x2, x3 = 1, 0, 52 
 # y1, y2, y3 = 0, 1, k1
 # while True:
 # if y3 == 0:
 #  return 'None'
 #  break
 # elif y3 == 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
 
 #已知模求逆元
 for i in range(1,53):
 if k1 * 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)))
 for i in range(len(list1)):
 list1.append(list2[i])
 x=[]
 for i in range(len(message1)):
 if message1[i]==' ':
  x.append(message1[i])
 else:
  for j in range(52):
  if message1[i]==list1[j]:
   x.append(list1[(a_reverse * (j-k2) )% 52])
   result = ''.join(x)
 return result
  
# **************end*************# 

def main():
 mode = int(input()) # 1代表加密,0代表解密
 message = input() #待加密或解密的消息
 key1 = int(input()) # key的范围0~51之间
 key2 = int(input()) # key的范围0~51之间
 if mode == 1:
 translated = encrypt(key1,key2,message)
 else:
 translated = decrypt(key1,key2,message)
 print(translated)

if __name__=='__main__':
 main()

测试输入:
1
zhang
7
31
预期输出:
YCFsv
测试输入:
0
gVEXGT iDIT
5
29
预期输出:
Lovely Baby

总结

到此这篇关于python语言编程实现凯撒密码、凯撒加解密算法的文章就介绍到这了,更多相关python凯撒密码 凯撒加解密算法内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
简单介绍Python中的round()方法
May 15 Python
python统计cpu利用率的方法
Jun 02 Python
举例讲解Python中的迭代器、生成器与列表解析用法
Mar 20 Python
使用Python的Flask框架来搭建第一个Web应用程序
Jun 04 Python
python中requests库session对象的妙用详解
Oct 30 Python
Python线性方程组求解运算示例
Jan 17 Python
对PyQt5中树结构的实现方法详解
Jun 17 Python
Python hashlib常见摘要算法详解
Jan 13 Python
Python selenium模拟手动操作实现无人值守刷积分功能
May 13 Python
基于python实现操作redis及消息队列
Aug 27 Python
如何利用opencv判断两张图片是否相同详解
Jul 07 Python
方法汇总:Python 安装第三方库常用
Apr 26 Python
python新手学习可变和不可变对象
Jun 11 #Python
基于Keras 循环训练模型跑数据时内存泄漏的解决方式
Jun 11 #Python
什么是python的id函数
Jun 11 #Python
Keras:Unet网络实现多类语义分割方式
Jun 11 #Python
Pycharm中配置远程Docker运行环境的教程图解
Jun 11 #Python
Keras 快速解决OOM超内存的问题
Jun 11 #Python
python3.6.8 + pycharm + PyQt5 环境搭建的图文教程
Jun 11 #Python
You might like
人族 TERRAN 概述
2020/03/14 星际争霸
兼容ie6浏览器的php下载文件代码分享
2014/07/14 PHP
PHP制作万年历
2015/01/07 PHP
PHP编程实现的TCP服务端和客户端功能示例
2018/04/13 PHP
php和C#的yield迭代器实现方法对比分析
2019/07/17 PHP
js 未结束的字符串常量错误解决方法
2010/06/13 Javascript
javascript来定义类的规范小结
2010/11/19 Javascript
关于Javascript模块化和命名空间管理的问题说明
2010/12/06 Javascript
node.js中的url.resolve方法使用说明
2014/12/10 Javascript
简单谈谈jQuery(function(){})与(function(){})(jQuery)
2014/12/19 Javascript
javascript每日必学之封装
2016/02/23 Javascript
JS检测window.open打开的窗口是否关闭
2017/06/25 Javascript
jQuery 实现倒计时天,时,分,秒功能
2018/07/31 jQuery
[02:02]DOTA2英雄基础教程 斯拉达
2013/12/11 DOTA
Python多线程结合队列下载百度音乐的方法
2015/07/27 Python
Python使用time模块实现指定时间触发器示例
2017/05/18 Python
Python上下文管理器和with块详解
2017/09/09 Python
Python中的pygal安装和绘制直方图代码分享
2017/12/08 Python
python使用os.listdir和os.walk获得文件的路径的方法
2017/12/16 Python
python统计指定目录内文件的代码行数
2019/09/19 Python
Python彻底删除文件夹及其子文件方式
2019/12/23 Python
Django实现后台上传并显示图片功能
2020/05/29 Python
CSS中越界问题的经典解决方案【推荐】
2016/04/19 HTML / CSS
美国在线纱线商店:Darn Good Yarn
2019/03/20 全球购物
后勤人员自我鉴定
2013/10/20 职场文书
高中化学教学反思
2014/01/13 职场文书
模范教师事迹材料
2014/02/10 职场文书
南京青奥会口号
2014/06/12 职场文书
法学自荐信
2014/06/20 职场文书
党性心得体会
2014/09/03 职场文书
创新社会管理心得体会
2014/09/12 职场文书
2014年超市工作总结
2014/11/19 职场文书
努力工作保证书
2015/02/28 职场文书
2015年世界粮食日演讲稿
2015/03/20 职场文书
导游词之南京汤山温泉
2019/11/26 职场文书
javascript条件式访问属性和箭头函数介绍
2021/11/17 Javascript