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 + hadoop streaming 分布式编程(一) -- 原理介绍,样例程序与本地调试
Jul 14 Python
详解使用python crontab设置linux定时任务
Dec 08 Python
浅谈Python基础—判断和循环
Mar 22 Python
pygame实现贪吃蛇游戏(上)
Oct 29 Python
python jenkins 打包构建代码的示例代码
Nov 29 Python
Python数据可视化:幂律分布实例详解
Dec 07 Python
使用python matplotlib 画图导入到word中如何保证分辨率
Apr 16 Python
Python小白不正确的使用类变量实例
May 29 Python
通过代码实例解析Pytest运行流程
Aug 20 Python
python pip如何手动安装二进制包
Sep 30 Python
python unichr函数知识点总结
Dec 16 Python
Python调用高德API实现批量地址转经纬度并写入表格的功能
Jan 12 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实现MVC开发得最简单的方法――模型
2007/04/10 PHP
php面向对象全攻略 (六)__set() __get() __isset() __unset()的用法
2009/09/30 PHP
PHP小教程之实现双向链表
2014/06/12 PHP
php中通过DirectoryIterator删除整个目录的方法
2015/03/13 PHP
基于PHP如何把汉字转化为拼音
2015/12/11 PHP
漂亮的jquery提示效果(仿腾讯弹出层)
2013/02/05 Javascript
js常用自定义公共函数汇总
2014/01/15 Javascript
javasctipt如何显示几分钟前、几天前等
2014/04/30 Javascript
iframe如何动态创建及释放其所占内存
2014/09/03 Javascript
使用jQuery和Bootstrap实现多层、自适应模态窗口
2014/12/22 Javascript
Javascript刷新窗口方法小结
2015/10/21 Javascript
JavaScript对HTML DOM使用EventListener进行操作
2015/10/21 Javascript
清除输入框内的空格
2016/12/21 Javascript
bootstrap vue.js实现tab效果
2017/02/07 Javascript
Vue.js手风琴菜单组件开发实例
2017/05/16 Javascript
vue.js 双层嵌套for遍历的方法详解, 类似php foreach()
2018/09/07 Javascript
详解vue中localStorage的使用方法
2018/11/22 Javascript
js实现固定区域内的不重叠随机圆
2019/10/24 Javascript
[00:34]DOTA2上海特级锦标赛 Spirit战队宣传片
2016/03/04 DOTA
[01:07:11]Secret vs Newbee 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
在python3.5中使用OpenCV的实例讲解
2018/04/02 Python
Python设计模式之组合模式原理与用法实例分析
2019/01/11 Python
python3编写ThinkPHP命令执行Getshell的方法
2019/02/26 Python
详解将Pandas中的DataFrame类型转换成Numpy中array类型的三种方法
2019/07/06 Python
python3调用windows dos命令的例子
2019/08/14 Python
python爬虫豆瓣网的模拟登录实现
2019/08/21 Python
python如何求100以内的素数
2020/05/27 Python
html5 Canvas画图教程(9)—canvas中画出矩形和圆形
2013/01/09 HTML / CSS
C++如何引用一个已经定义过的全局变量
2014/08/25 面试题
大学生职业生涯规划书模版
2013/12/30 职场文书
副厂长岗位职责
2014/02/02 职场文书
创先争优宣传标语
2014/10/08 职场文书
高三英语复习计划
2015/01/19 职场文书
万能检讨书
2015/01/27 职场文书
党支部考察意见范文
2015/06/02 职场文书
Python使用OpenCV实现虚拟缩放效果
2022/02/28 Python