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 相关文章推荐
详解django三种文件下载方式
Apr 06 Python
django静态文件加载的方法
May 20 Python
python2 与 python3 实现共存的方法
Jul 12 Python
python爬虫获取小区经纬度以及结构化地址
Dec 30 Python
Django框架首页和登录页分离操作示例
May 28 Python
如何使用Python标准库进行性能测试
Jun 25 Python
numpy数组广播的机制
Jul 12 Python
pytorch 固定部分参数训练的方法
Aug 17 Python
PyTorch中Tensor的拼接与拆分的实现
Aug 18 Python
Python中sys模块功能与用法实例详解
Feb 26 Python
opencv 实现特定颜色线条提取与定位操作
Jun 02 Python
浅谈tensorflow使用张量时的一些注意点tf.concat,tf.reshape,tf.stack
Jun 23 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常用代码大全(新手入门必备)
2010/06/29 PHP
php从数组中随机选择若干不重复元素的方法
2015/03/14 PHP
ThinkPHP5框架实现简单的批量查询功能示例
2018/06/07 PHP
PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】
2018/06/16 PHP
解决laravel5.4下的group by报错的问题
2019/10/16 PHP
PHP超全局变量实现原理及代码解析
2020/09/01 PHP
JQuery 国际象棋棋盘 实现代码
2009/06/26 Javascript
JavaScript 序列化对象实现代码
2009/12/18 Javascript
c#和Javascript操作同一json对象的实现代码
2012/01/17 Javascript
Javascript 加载和执行-性能提高篇
2012/12/28 Javascript
jquery.qrcode在线生成二维码使用示例
2013/08/21 Javascript
js二维数组排序的简单示例代码
2014/01/24 Javascript
javascript实现复选框超过限制即弹出警告框的方法
2015/02/25 Javascript
jquery中实现时间戳与日期相互转换
2016/04/12 Javascript
JavaScript中实现键值对应的字典与哈希表结构的示例
2016/06/12 Javascript
javascript类型系统——日期Date对象全面了解
2016/07/13 Javascript
jQuery和CSS仿京东仿淘宝列表导航菜单
2017/01/04 Javascript
微信小程序之前台循环数据绑定
2017/08/18 Javascript
vue.js组件vue-waterfall-easy实现瀑布流效果
2017/08/22 Javascript
vue19 组建 Vue.extend component、组件模版、动态组件 的实例代码
2019/04/04 Javascript
小程序关于请求同步的总结
2019/05/05 Javascript
openlayers4实现点动态扩散
2020/08/17 Javascript
下载安装setuptool和pip linux安装pip    
2014/01/24 Python
Python Pillow Image Invert
2019/01/22 Python
python实现给微信指定好友定时发送消息
2019/04/29 Python
Django实现auth模块下的登录注册与注销功能
2019/10/10 Python
基于python3抓取pinpoint应用信息入库
2020/01/08 Python
Python3标准库glob文件名模式匹配的问题
2020/03/13 Python
基于selenium及python实现下拉选项定位select
2020/07/22 Python
亚洲领先的旅游体验市场:Voyagin
2019/11/23 全球购物
个人作风剖析材料
2014/02/02 职场文书
模具专业毕业推荐信
2014/03/08 职场文书
2014年除四害工作总结
2014/12/06 职场文书
高三复习计划
2015/01/19 职场文书
2015年机关党委工作总结
2015/05/23 职场文书
《最终幻想14》6.01版本4月5日推出 追加新任务新道具
2022/04/03 其他游戏