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实现保存网页到本地示例
Mar 16 Python
Python实现的Google IP 可用性检测脚本
Apr 23 Python
python解决方案:WindowsError: [Error 2]
Aug 28 Python
Python实现选择排序
Jun 04 Python
python+tkinter编写电脑桌面放大镜程序实例代码
Jan 16 Python
Python json模块dumps、loads操作示例
Sep 06 Python
python使用matplotlib画饼状图
Sep 25 Python
Python在图片中插入大量文字并且自动换行
Jan 02 Python
python绘制双Y轴折线图以及单Y轴双变量柱状图的实例
Jul 08 Python
pytorch实现MNIST手写体识别
Feb 14 Python
Keras 利用sklearn的ROC-AUC建立评价函数详解
Jun 15 Python
Python中全局变量和局部变量的理解与区别
Feb 07 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文件读写操作之文件读取方法详解
2011/01/13 PHP
PHP中操作ini配置文件的方法
2013/04/25 PHP
JS启动应用程序的一个简单例子
2008/05/11 Javascript
JavaScript弹出对话框的三种方式
2016/03/23 Javascript
探讨:JavaScript ECAMScript5 新特性之get/set访问器
2016/05/05 Javascript
js字符串截取函数slice、substring和substr的比较
2016/05/17 Javascript
Js获取图片原始宽高的实现代码
2016/05/17 Javascript
TinyMCE汉化及本地上传图片功能实例详解
2016/05/31 Javascript
jQuery插件扩展测试实例
2016/06/21 Javascript
Node.js读写文件之批量替换图片的实现方法
2016/09/07 Javascript
JS判断是否为JSON对象及是否存在某字段的方法(推荐)
2016/11/29 Javascript
Java与JavaScript中判断两字符串是否相等的区别
2017/03/13 Javascript
JS闭包的几种常见形式实例详解
2017/09/16 Javascript
原生JS实现的轮播图功能详解
2018/08/06 Javascript
Vue Promise的axios请求封装详解
2018/08/13 Javascript
node.js实现为PDF添加水印的示例代码
2018/12/05 Javascript
Vue组件通信的几种实现方法
2019/04/25 Javascript
Vue响应式原理Observer、Dep、Watcher理解
2019/06/06 Javascript
antd-mobile ListView长列表的数据更新遇到的坑
2020/04/08 Javascript
[00:02]DOTA2新版本使用PA至宝后暴击展示
2014/11/19 DOTA
提升Python程序运行效率的6个方法
2015/03/31 Python
非递归的输出1-N的全排列实例(推荐)
2017/04/11 Python
Django中Aggregation聚合的基本使用方法
2020/07/09 Python
英国领先的家庭时尚品牌:Peacocks
2018/01/11 全球购物
护理专业的自荐信
2013/10/22 职场文书
宝宝周岁宴答谢词
2014/01/26 职场文书
学习十八大坚定理想信念心得体会
2014/03/11 职场文书
优秀大学生自荐信
2014/06/09 职场文书
学习朴航瑛老师爱岗敬业先进事迹思想汇报
2014/09/17 职场文书
光棍节联谊晚会活动策划书
2014/10/10 职场文书
作风建设年度心得体会
2014/10/29 职场文书
2015年政协委员工作总结
2015/05/20 职场文书
2015年远程教育工作总结
2015/05/20 职场文书
傲慢与偏见读书笔记
2015/06/29 职场文书
远程教育培训心得体会
2016/01/09 职场文书
个人工作总结(管理人员)范文
2019/08/13 职场文书