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每次处理固定个数的字符的方法总结
Jan 29 Python
python的re模块应用实例
Sep 26 Python
Pandas中把dataframe转成array的方法
Apr 13 Python
python绘制立方体的方法
Jul 02 Python
如何使用Python 打印各种三角形
Jun 28 Python
Python pip替换为阿里源的方法步骤
Jul 02 Python
使用Pandas对数据进行筛选和排序的实现
Jul 29 Python
Python使用指定字符长度切分数据示例
Dec 05 Python
Ubuntu中配置TensorFlow使用环境的方法
Apr 21 Python
Python3 ID3决策树判断申请贷款是否成功的实现代码
May 21 Python
如何基于Python Matplotlib实现网格动画
Jul 20 Python
Python中return函数返回值实例用法
Nov 19 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
html中select语句读取mysql表中内容
2006/10/09 PHP
PHP 面向对象程序设计(oop)学习笔记 (二) - 静态变量的属性和方法及延迟绑定
2014/06/12 PHP
PHP常用处理静态操作类
2015/04/03 PHP
php返回相对时间(如:20分钟前,3天前)的方法
2015/04/14 PHP
PHP内核学习教程之php opcode内核实现
2016/01/27 PHP
javascript 页面只自动刷新一次
2009/07/10 Javascript
json数据的列循环示例
2013/09/06 Javascript
js获取指定日期周数以及星期几的小例子
2014/06/27 Javascript
NodeJS制作爬虫全过程(续)
2014/12/22 NodeJs
Javascript基础教程之switch语句
2015/01/18 Javascript
jQuery实现在textarea指定位置插入字符或表情的方法
2015/03/11 Javascript
ECMAScript6新增值比较函数Object.is
2015/06/12 Javascript
jQuery事件的绑定、触发、及监听方法简单说明
2016/05/10 Javascript
基于HTML5上使用iScroll实现下拉刷新,上拉加载更多
2016/05/21 Javascript
纯javascript版日历控件
2016/11/24 Javascript
Bootstrap modal使用及点击外部不消失的解决方法
2016/12/13 Javascript
javascript实现复选框全选或反选
2017/02/04 Javascript
ES6教程之for循环和Map,Set用法分析
2017/04/10 Javascript
Vue.js学习教程之列表渲染详解
2017/05/17 Javascript
Vue底层实现原理总结
2018/02/17 Javascript
vue自动化表单实例分析
2018/05/06 Javascript
轻量级富文本编辑器wangEditor结合vue使用方法示例
2018/10/10 Javascript
react native 仿微信聊天室实例代码
2019/09/17 Javascript
JavaScript实现字符串与HTML格式相互转换
2020/03/17 Javascript
vue使用exif获取图片旋转,压缩的示例代码
2020/12/11 Vue.js
python中的对象拷贝示例 python引用传递
2014/01/23 Python
Python使用plt.boxplot() 参数绘制箱线图
2020/06/04 Python
Whittard官方海外旗舰店:英国百年茶叶品牌
2018/02/22 全球购物
System.Array.CopyTo()和System.Array.Clone()有什么区别
2016/06/20 面试题
会议活动邀请函
2014/01/27 职场文书
经典安踏广告词
2014/03/21 职场文书
医院安全生产月活动总结
2014/07/05 职场文书
领导班子整改方案和个人整改措施
2014/10/25 职场文书
外贸采购员岗位职责
2015/04/03 职场文书
世界十大动漫制作公司排行榜,迪士尼上榜,第二是美国代表性文化符
2022/03/18 欧美动漫
Pycharm远程调试和MySQL数据库授权问题
2022/03/18 MySQL