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 Tkinter基础控件用法
Sep 03 Python
Python基于twisted实现简单的web服务器
Sep 29 Python
Python中规范定义命名空间的一些建议
Jun 04 Python
简单了解OpenCV是个什么东西
Nov 10 Python
TensorFlow实现模型评估
Sep 07 Python
浅谈django2.0 ForeignKey参数的变化
Aug 06 Python
浅析pandas 数据结构中的DataFrame
Oct 12 Python
详解python statistics模块及函数用法
Oct 27 Python
python 计算方位角实例(根据两点的坐标计算)
Jan 17 Python
python实现猜拳游戏
Mar 04 Python
Python如何创建装饰器时保留函数元信息
Aug 07 Python
python利用opencv实现颜色检测
Feb 23 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实现首页链接查询 友情链接检查的代码
2010/01/05 PHP
PHP远程采集图片详细教程
2014/07/01 PHP
php中使用Ajax时出现Error(c00ce56e)的详细解决方案
2014/11/03 PHP
实例分析PHP中PHPMailer发邮件
2017/12/13 PHP
增强的 JavaScript 的 trim 函数的代码
2007/08/13 Javascript
结合JQ1.9通过js正则判断各种浏览器版本的方法
2013/12/30 Javascript
ExtJS4给Combobox设置列表中的默认值示例
2014/05/02 Javascript
javascript搜索框点击文字消失失焦时文本出现
2014/09/18 Javascript
JS运动相关知识点小结(附弹性运动示例)
2016/01/08 Javascript
jQuery CSS3自定义美化Checkbox实现代码
2016/05/12 Javascript
总结jQuery插件开发中的一些要点
2016/05/16 Javascript
Javascript实现通过选择周数显示开始日和结束日的实现代码
2016/05/30 Javascript
vue实现验证码按钮倒计时功能
2018/04/10 Javascript
微信小程序实现折叠展开效果
2018/07/19 Javascript
详解vue axios二次封装
2018/07/22 Javascript
vue interceptor 使用教程实例详解
2018/09/13 Javascript
vue init webpack 建vue项目报错的解决方法
2018/09/29 Javascript
浅谈webpack 四个核心概念之Entry
2019/06/12 Javascript
Vue之Mixins(混入)的使用方法
2019/09/24 Javascript
vue+ESLint 配置保存 自动格式化代码
2020/03/17 Javascript
解决VUE项目localhost端口服务器拒绝连接,只能用127.0.0.1的问题
2020/08/14 Javascript
JS指定音频audio在某个时间点进行播放
2020/11/28 Javascript
基于vuex实现购物车功能
2021/01/10 Vue.js
[36:13]Mineski vs iG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python获取网页状态码示例
2014/03/30 Python
在Gnumeric下使用Python脚本操作表格的教程
2015/04/14 Python
python解析html提取数据,并生成word文档实例解析
2018/01/22 Python
python pytest进阶之conftest.py详解
2019/06/27 Python
Pytorch通过保存为ONNX模型转TensorRT5的实现
2020/05/25 Python
Spring @Enable模块驱动原理及使用实例
2020/06/23 Python
材料物理专业个人求职信
2013/12/15 职场文书
项目负责人任命书
2014/06/04 职场文书
企业宣传稿范文
2015/07/23 职场文书
PHP基本语法
2021/03/31 PHP
vue 自定义组件添加原生事件
2022/04/21 Vue.js
Golang 并发编程 SingleFlight模式
2022/04/26 Golang