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写入数据到MP3文件中的方法
Jul 10 Python
对Python的Django框架中的项目进行单元测试的方法
Apr 11 Python
Python的Flask框架中使用Flask-Migrate扩展迁移数据库的教程
Jun 14 Python
详解Python如何获取列表(List)的中位数
Aug 12 Python
python 专题九 Mysql数据库编程基础知识
Mar 16 Python
python 平衡二叉树实现代码示例
Jul 07 Python
mac安装pytorch及系统的numpy更新方法
Jul 26 Python
Django实现单用户登录的方法示例
Mar 28 Python
Python matplotlib画图与中文设置操作实例分析
Apr 23 Python
python2和python3实现在图片上加汉字的方法
Aug 22 Python
利用python如何实现猫捉老鼠小游戏
Dec 04 Python
python常见的占位符总结及用法
Jul 02 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
用文本作数据处理
2006/10/09 PHP
推荐文章系统(一)
2006/10/09 PHP
关于php循环跳出的问题
2013/07/01 PHP
PHP生成短网址的3种方法代码实例
2014/07/08 PHP
PHP文件生成的图片无法使用CDN缓存的解决方法
2015/06/20 PHP
php封装的连接Mysql类及用法分析
2015/12/10 PHP
在textarea文本域中显示HTML代码的方法
2007/03/06 Javascript
List all the Databases on a SQL Server
2007/06/21 Javascript
jquery 批量上传图片实现代码
2010/01/28 Javascript
浅谈tudou土豆网首页图片延迟加载的效果
2010/06/23 Javascript
解析jQuery的三种bind/One/Live事件绑定使用方法
2013/12/30 Javascript
jQuery实现行文字链接提示效果的方法
2015/03/10 Javascript
javascript数组排序汇总
2015/07/07 Javascript
jQuery实现图片与文字描述左右滑动自动切换的方法
2015/07/27 Javascript
JS处理json日期格式化问题
2015/10/01 Javascript
jquery实现下拉框左右选择功能
2017/02/21 Javascript
vue-resource + json-server模拟数据的方法
2017/11/02 Javascript
解决vue项目使用font-awesome,build后路径的问题
2018/09/01 Javascript
js实现文件上传功能 后台使用MultipartFile
2018/09/08 Javascript
ES6知识点整理之数组解构和字符串解构的应用示例
2019/04/17 Javascript
JS+CSS实现过渡特效
2021/01/02 Javascript
python使用PIL模块实现给图片打水印的方法
2015/05/22 Python
Python新手们容易犯的几个错误总结
2017/04/01 Python
Python计算两个日期相差天数的方法示例
2017/05/23 Python
深入浅析python3中的unicode和bytes问题
2019/07/03 Python
Python闭包装饰器使用方法汇总
2020/06/29 Python
用python给csv里的数据排序的具体代码
2020/07/17 Python
django使用graphql的实例
2020/09/02 Python
html5通过postMessage进行跨域通信的方法
2017/12/04 HTML / CSS
高一自我鉴定
2013/12/17 职场文书
婚前财产公证书
2014/04/10 职场文书
社区志愿者培训方案
2014/06/10 职场文书
我们的节日春节活动方案
2014/08/22 职场文书
百万英镑观后感
2015/06/09 职场文书
食品卫生管理制度
2015/08/06 职场文书
Redis命令处理过程源码解析
2022/02/12 Redis