python 密码学示例——凯撒密码的实现


Posted in Python onSeptember 21, 2020

凯撒密码 是密码学中的一种简单的 替换加密 技术。明文中的所有字符都会替换为其按照字母表顺序向左(或向右)偏移一定量后得到的新字母,作为加密后密文。

如当偏移量为 3 时,明文中所有的字母 A 将被替换成字母 D,B 替换成 E,以此类推。

若收到密文的同时已知加密时使用的偏移量,就可以快速地通过逆运算获取到最初的明文。

下面两张图展示了当偏移量为 8 时明文字母与密文字母的对应关系(图一即凯撒密码轮盘,外层为明文,内层为密文,可旋转以改变偏移量)以及实际的加密过程(图二):

python 密码学示例——凯撒密码的实现

python 密码学示例——凯撒密码的实现

PS:对一段明文消息连续应用多个不同的偏移量进行凯撒密码规则的加密,并不会增强安全等级。即轮盘的多次旋转,实际上等同于抵消后的一次旋转。多次应用的不同偏移量,最终等同于抵消后的一次偏移量,对于暴力破解来说并不会增加复杂度。

如第一次对明文实施偏移 3 位的凯撒加密,再对生成的密文实施偏移 10 位的加密,实际上相当于对最初的明文实施了偏移 13 位的加密。

二、Python 实现凯撒密码

源代码:

while True:
 key = input("Please input a key number (like 13):\n") or 13
 mode = input("\nPlease input mode (encrypt or decrypt):\n") or "encrypt"

 symbols = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890 !?.'
 # 根据数字 key 对字母表 symbols 进行偏移操作,形成密文字母表 ciphers
 ciphers = symbols[int(key):] + symbols[:int(key)]
 # 根据加密与解密动作,生成明文字母到密文字母(或密文到明文)的对应关系
 transtab = str.maketrans(symbols, ciphers) if mode == 'encrypt' else str.maketrans(ciphers, symbols)

 message = input("\nPlease input plaintext or ciphertext:\n")
 # 完成明文到密文(或密文到明文)的转换
 result = message.translate(transtab)
 print(f"\nThe result is: {result}\n\n")

运行效果如下:

Please input a key number (like 13):
13

Please input mode (encrypt or decrypt):
encrypt

Please input plaintext or ciphertext:
This is my secret message.

The result is: guv6Jv6Jz!J6rp5r7Jzr66ntrM

Please input a key number (like 13):
13

Please input mode (encrypt or decrypt):
decrypt

Please input plaintext or ciphertext:
guv6Jv6Jz!J6rp5r7Jzr66ntrM

The result is: This is my secret message.

三、Python 对凯撒密码的爆破

即在加密用的 key 值未知的情况下,尝试所有可能的 key 值(0 到字母表长度减一)对密文进行解密,输出以查看解密出的明文是否有意义。

源代码:

symbols = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890 !?.'

ciphertext = input("Please input ciphertext:\n")


for key in range(len(symbols)):
 ciphers = symbols[key:] + symbols[:key]
 transtab = str.maketrans(ciphers, symbols)
 plaintext = ciphertext.translate(transtab)

 print(f'Key #{key}: {plaintext}')

运行效果如下:

Please input ciphertext:
guv6Jv6Jz!J6rp5r7Jzr66ntrM
Key #0: guv6Jv6Jz!J6rp5r7Jzr66ntrM
Key #1: ftu5Iu5Iy I5qo4q6Iyq55msqL
Key #2: est4Ht4Hx0H4pn3p5Hxp44lrpK
Key #3: drs3Gs3Gw9G3om2o4Gwo33kqoJ
Key #4: cqr2Fr2Fv8F2nl1n3Fvn22jpnI
Key #5: bpq1Eq1Eu7E1mkzm2Eum11iomH
Key #6: aopzDpzDt6Dzljyl1DtlzzhnlG
Key #7: ZnoyCoyCs5CykixkzCskyygmkF
Key #8: YmnxBnxBr4BxjhwjyBrjxxfljE
Key #9: XlmwAmwAq3AwigvixAqiwwekiD
Key #10: Wklv.lv.p2.vhfuhw.phvvdjhC
Key #11: Vjku?ku?o1?ugetgv?oguucigB
Key #12: Uijt!jt!nz!tfdsfu!nfttbhfA
Key #13: This is my secret message.
Key #14: Sghr0hr0lx0rdbqds0ldrrZfd?
Key #15: Rfgq9gq9kw9qcapcr9kcqqYec!
...

参考资料

Cracking Codes with Python

以上就是python 密码学示例——凯撒密码的实现的详细内容,更多关于python 凯撒密码的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python人人网登录应用实例
Sep 26 Python
正确理解python中的关键字“with”与上下文管理器
Apr 21 Python
python距离测量的方法
Mar 06 Python
利用arcgis的python读取要素的X,Y方法
Dec 22 Python
Python 输出时去掉列表元组外面的方括号与圆括号的方法
Dec 24 Python
python图像处理入门(一)
Apr 04 Python
ubuntu 16.04下python版本切换的方法
Jun 14 Python
Python post请求实现代码实例
Feb 28 Python
浅谈matplotlib.pyplot与axes的关系
Mar 06 Python
解决jupyter notebook 出现In[*]的问题
Apr 13 Python
Jupyter Notebook的连接密码 token查询方式
Apr 21 Python
浅谈Python爬虫原理与数据抓取
Jul 21 Python
python 密码学示例——理解哈希(Hash)算法
Sep 21 #Python
python中的垃圾回收(GC)机制
Sep 21 #Python
如何在Python3中使用telnetlib模块连接网络设备
Sep 21 #Python
总结Pyinstaller的坑及终极解决方法(小结)
Sep 21 #Python
python生成xml时规定dtd实例方法
Sep 21 #Python
Python中的特殊方法以及应用详解
Sep 20 #Python
matplotlib 三维图表绘制方法简介
Sep 20 #Python
You might like
通过PHP current函数获取未知字符键名数组第一个元素的值
2013/06/24 PHP
WordPress中用于获取文章信息以及分类链接的函数用法
2015/12/18 PHP
PHP多进程编程总结(推荐)
2016/07/18 PHP
php使用curl下载指定大小的文件实例代码
2017/09/30 PHP
针对thinkPHP5框架存储过程bug重写的存储过程扩展类完整实例
2018/06/16 PHP
PHP多个图片压缩成ZIP的方法
2020/08/18 PHP
JavaScript 事件系统
2010/07/22 Javascript
动态载入js提高网页打开速度的方法
2014/07/04 Javascript
JavaScript中的包装对象介绍
2015/01/27 Javascript
基于jQuery实现鼠标点击导航菜单水波动画效果附源码下载
2016/01/06 Javascript
jQuery之简单的表单验证实例
2016/07/07 Javascript
老生常谈onBlur事件与onfocus事件(js)
2016/07/09 Javascript
JS 事件绑定、事件监听、事件委托详细介绍
2016/09/28 Javascript
Vue开发环境跨域访问问题
2020/01/22 Javascript
jquery实现加载更多"转圈圈"效果(示例代码)
2020/11/09 jQuery
Python使用bs4获取58同城城市分类的方法
2015/07/08 Python
python模块之paramiko实例代码
2018/01/31 Python
Python实现的计算器功能示例
2018/04/26 Python
使用python的pandas库读取csv文件保存至mysql数据库
2018/08/20 Python
PyQt5 在label显示的图片中绘制矩形的方法
2019/06/17 Python
Django Python 获取请求头信息Content-Range的方法
2019/08/06 Python
Python 剪绳子的多种思路实现(动态规划和贪心)
2020/02/24 Python
django admin 添加自定义链接方式
2020/03/11 Python
python中not、and和or的优先级与详细用法介绍
2020/11/03 Python
Python和Bash结合在一起的方法
2020/11/13 Python
Python爬虫之Selenium设置元素等待的方法
2020/12/04 Python
Python实现Kerberos用户的增删改查操作
2020/12/14 Python
Omio法国:全欧洲低价大巴、火车和航班搜索和比价
2017/11/13 全球购物
PHP开发工程师面试问题集锦
2012/11/01 面试题
工作决心书范文
2014/03/11 职场文书
学生党员一帮一活动总结
2014/07/08 职场文书
员工辞职信范文大全
2015/05/12 职场文书
2016年清明节期间群众祭祀活动工作总结
2016/04/01 职场文书
如何写好开幕词?
2019/06/24 职场文书
vue项目两种方式实现竖向表格的思路分析
2021/04/28 Vue.js
安装harbor作为docker镜像仓库的问题
2022/06/14 Servers