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 数据结构之堆栈实例代码
Jan 22 Python
Python正则抓取新闻标题和链接的方法示例
Apr 24 Python
python删除不需要的python文件方法
Apr 24 Python
Python Django 实现简单注册功能过程详解
Jul 29 Python
基于python3实现倒叙字符串
Feb 18 Python
如何在django中实现分页功能
Apr 22 Python
pytorch查看模型weight与grad方式
Jun 24 Python
Python 操作 MySQL数据库
Sep 18 Python
python实现excel公式格式化的示例代码
Dec 23 Python
python 批量将中文名转换为拼音
Feb 07 Python
Python使用华为API为图像设置多个锚点标签
Apr 12 Python
python数字图像处理:图像简单滤波
Jun 28 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之第一天
2006/10/09 PHP
浅谈Laravel模板实体转义带来的坑
2019/10/22 PHP
JQuery动画和停止动画实例代码
2013/03/01 Javascript
JavaScript图片放大技术(放大镜)实现代码分享
2013/11/14 Javascript
JS判断、校验MAC地址的2个实例
2014/05/05 Javascript
wap浏览自动跳转到wap页面的js代码
2014/05/17 Javascript
javascript中局部变量和全局变量的区别详解
2015/02/27 Javascript
jQuery实现table中的tr上下移动并保持序号不变的实例代码
2016/07/11 Javascript
javascript之with的使用(阿里云、淘宝使用代码分析)
2016/10/11 Javascript
微信小程序 wxapp画布 canvas详细介绍
2016/10/31 Javascript
JavaScript之Canvas_动力节点Java学院整理
2017/07/04 Javascript
详解前端路由实现与react-router使用姿势
2017/08/07 Javascript
JavaScript使用indexOf()实现数组去重的方法分析
2018/09/04 Javascript
KOA+egg.js集成kafka消息队列的示例
2018/11/09 Javascript
JS实现简单的点赞与踩功能示例
2018/12/05 Javascript
webpack-mvc 传统多页面组件化开发详解
2019/05/07 Javascript
layUI实现列表查询功能
2019/07/27 Javascript
VUE实现密码验证与提示功能
2019/10/18 Javascript
Vue.js下拉菜单组件使用方法详解
2019/10/19 Javascript
python读取csv文件示例(python操作csv)
2014/03/11 Python
分析python动态规划的递归、非递归实现
2018/03/04 Python
Python字符串通过'+'和join函数拼接新字符串的性能测试比较
2019/03/05 Python
python实现根据给定坐标点生成多边形mask的例子
2020/02/18 Python
对python中return与yield的区别详解
2020/03/12 Python
tensorflow模型文件(ckpt)转pb文件的方法(不知道输出节点名)
2020/04/22 Python
Python基于当前时间批量创建文件
2020/05/07 Python
使用SimpleITK读取和保存NIfTI/DICOM文件实例
2020/07/01 Python
HTML5中canvas中的beginPath()和closePath()的重要性
2018/08/24 HTML / CSS
苹果美国官方商城:Apple美国
2016/08/24 全球购物
Farah官方网站:男士服装及配件
2019/11/01 全球购物
职业生涯规划怎么写
2013/12/29 职场文书
廉洁校园实施方案
2014/05/25 职场文书
社区精神文明建设汇报材料
2014/08/17 职场文书
优秀工作者事迹材料
2014/12/26 职场文书
学生会工作感言
2015/08/07 职场文书
2019银行竞聘书
2019/06/21 职场文书