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中sys.argv参数用法实例分析
May 20 Python
python抽象基类用法实例分析
Jun 04 Python
python如何使用正则表达式的前向、后向搜索及前向搜索否定模式详解
Nov 08 Python
django静态文件加载的方法
May 20 Python
Python Grid使用和布局详解
Jun 30 Python
pycharm 在windows上编辑代码用linux执行配置的方法
Oct 27 Python
详解Python_shutil模块
Mar 15 Python
Python使用sklearn实现的各种回归算法示例
Jul 04 Python
python标记语句块使用方法总结
Aug 05 Python
Python学习笔记之文件的读写操作实例分析
Aug 07 Python
Pytorch mask_select 函数的用法详解
Feb 18 Python
python 通过使用Yolact训练数据集
Apr 06 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 模拟$_PUT实现代码
2010/03/15 PHP
PHP中对于浮点型的数据需要用不同的方法解决
2014/03/11 PHP
Laravel框架实现修改登录和注册接口数据返回格式的方法
2018/08/17 PHP
php ZipArchive实现多文件打包下载实例
2019/10/31 PHP
Ext第一周 史上最强学习笔记---GridPanel(基础篇)
2008/12/29 Javascript
可以用来调试JavaScript错误的解决方案
2010/08/07 Javascript
javascript 正则表达式相关应介绍
2012/11/27 Javascript
jQuery+PHP+MySQL二级联动下拉菜单实例讲解
2015/10/27 Javascript
js不间断滚动的简单实现
2016/06/03 Javascript
数据结构中的各种排序方法小结(JS实现)
2016/07/23 Javascript
jquery事件绑定解绑机制源码解析
2016/09/19 Javascript
Javascript 实现放大镜效果实例详解
2016/12/03 Javascript
BootstrapTable请求数据时设置超时(timeout)的方法
2017/01/22 Javascript
微信小程序 弹幕功能简单实例
2017/02/14 Javascript
vue 怎么创建组件及组件使用方法
2017/07/27 Javascript
详解Vue单元测试case写法
2018/05/24 Javascript
vue css 引入asstes中的图片无法显示的四种解决方法
2020/03/16 Javascript
JavaScript eval()函数定义及使用方法详解
2020/07/07 Javascript
解决vue路由name同名,路由重复的问题
2020/08/05 Javascript
Vue使用Proxy代理后仍无法生效的解决
2020/11/13 Javascript
[03:02]生活中的Dendi之野外度假篇
2016/08/09 DOTA
Django添加favicon.ico图标的示例代码
2018/08/07 Python
python保存二维数组到txt文件中的方法
2018/11/15 Python
如何用Python来搭建一个简单的推荐系统
2019/08/07 Python
Python figure参数及subplot子图绘制代码
2020/04/18 Python
Django多层嵌套ManyToMany字段ORM操作详解
2020/05/19 Python
利用CSS3实现自定义滚动条代码分享
2016/08/18 HTML / CSS
捷克家具销售网站:SCONTO Nábytek
2020/01/02 全球购物
在阿联酋购买翻新手机和平板电脑:Teckzu
2021/02/12 全球购物
自主招生自荐信格式
2013/12/03 职场文书
优秀班干部事迹材料
2014/01/26 职场文书
会计与审计专业自荐信范文
2014/03/15 职场文书
乡镇网格化管理实施方案
2014/03/23 职场文书
电大毕业个人生自我鉴定
2014/03/26 职场文书
材料专业大学毕业生自荐书
2014/07/02 职场文书
学习党的群众路线对照检查材料
2014/09/29 职场文书