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 时间处理datetime实例
Sep 06 Python
python打开文件并获取文件相关属性的方法
Apr 23 Python
Python抓取电影天堂电影信息的代码
Apr 07 Python
Python SVM(支持向量机)实现方法完整示例
Jun 19 Python
Django model反向关联名称的方法
Dec 15 Python
python模拟菜刀反弹shell绕过限制【推荐】
Jun 25 Python
python 3.7.4 安装 opencv的教程
Oct 10 Python
Python csv文件的读写操作实例详解
Nov 19 Python
python实现opencv+scoket网络实时图传
Mar 20 Python
Python如何解除一个装饰器
Aug 07 Python
OpenCV图片漫画效果的实现示例
Aug 18 Python
python urllib和urllib3知识点总结
Feb 08 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数据库调用类调用实例(详细注释)
2012/07/12 PHP
PHP session_start()问题解疑(详细介绍)
2013/07/05 PHP
POST一个JSON格式的数据给Restful服务实例详解
2017/04/07 PHP
mac pecl 安装php7.1扩展教程
2019/10/17 PHP
phpStudy vscode 搭建debug调试的教程详解
2020/07/28 PHP
JavaScript高级程序设计 扩展--关于动态原型
2010/11/09 Javascript
使用jQuery实现的网页版的个人简历(可换肤)
2013/04/19 Javascript
jQuery动画出现连续触发、滞后反复执行的解决方法
2015/01/28 Javascript
遍历js中对象的属性和值的实例
2016/11/21 Javascript
Vue.js学习之计算属性
2017/01/22 Javascript
javascript 中设置window.location.href跳转无效问题解决办法
2017/02/09 Javascript
react native带索引的城市列表组件的实例代码
2017/08/08 Javascript
使用DataTable插件实现异步加载数据
2017/11/19 Javascript
JavaScript创建对象方式总结【工厂模式、构造函数模式、原型模式等】
2018/12/19 Javascript
ES6知识点整理之模块化的应用详解
2019/04/15 Javascript
详解微信小程序中var、let、const用法与区别
2020/01/11 Javascript
解决ant-design-vue中menu菜单无法默认展开的问题
2020/10/31 Javascript
[00:32]2018DOTA2亚洲邀请赛EG出场
2018/04/03 DOTA
python中退出多层循环的方法
2018/11/27 Python
Python 如何实现访问者模式
2020/07/28 Python
Python实现邮件发送的详细设置方法(遇到问题)
2021/01/18 Python
html5的新玩法——语音搜索
2013/01/03 HTML / CSS
html5超简单的localStorage实现记住密码的功能实现
2017/09/07 HTML / CSS
英国最大的香水商店:The Fragrance Shop
2018/07/06 全球购物
匡威英国官网:Converse英国
2018/12/02 全球购物
物流管理专业应届生求职信
2013/11/21 职场文书
名人演讲稿范文
2013/12/28 职场文书
军训感想500字
2014/02/20 职场文书
秋天的怀念教学反思
2014/04/28 职场文书
个人年度总结报告
2015/03/09 职场文书
无婚姻登记记录证明
2015/06/18 职场文书
村主任当选感言
2015/08/01 职场文书
班级管理经验交流材料
2015/11/02 职场文书
领导干部学习三严三实心得体会
2016/01/05 职场文书
2019年行政人事个人工作总结范本!
2019/07/19 职场文书
Nginx解决403 forbidden的完整步骤
2021/04/01 Servers