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 BeautifulSoup使用方法详解
Nov 21 Python
零基础写python爬虫之urllib2使用指南
Nov 05 Python
python实现同时给多个变量赋值的方法
Apr 30 Python
MySQL最常见的操作语句小结
May 07 Python
Python编程中的for循环语句学习教程
Oct 14 Python
Python 爬虫之超链接 url中含有中文出错及解决办法
Aug 03 Python
python 字典中取值的两种方法小结
Aug 02 Python
Python实现简单查找最长子串功能示例
Feb 26 Python
python模块hashlib(加密服务)知识点讲解
Nov 25 Python
python:HDF和CSV存储优劣对比分析
Jun 08 Python
基于python实现判断字符串是否数字算法
Jul 10 Python
OpenCV读取与写入图片的实现
Oct 13 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中使用模板的方法
2008/05/24 PHP
PHP生成网页快照 不用COM不用扩展.
2010/02/11 PHP
从零开始学YII2框架(一)通过Composer安装Yii2框架
2014/08/20 PHP
使用PHP Socket 编程模拟Http post和get请求
2014/11/25 PHP
阿里云Win2016安装Apache和PHP环境图文教程
2018/03/11 PHP
解决iframe的frameborder在chrome/ff/ie下的差异
2010/08/12 Javascript
jquery修改网页背景颜色通过css方法实现
2014/06/06 Javascript
jquery+easeing实现仿flash的载入动画
2015/03/10 Javascript
js创建jsonArray传输至后台及后台全面解析
2016/04/11 Javascript
易被忽视的js事件问题总结
2016/05/14 Javascript
微信小程序-详解数据缓存
2016/11/24 Javascript
让div运动起来 js实现缓动效果
2017/07/06 Javascript
electron demo项目npm install安装失败的解决方法
2018/02/06 Javascript
浅谈bootstrap layer.open中end的使用方法
2019/09/12 Javascript
使用vue重构资讯页面的实例代码解析
2019/11/26 Javascript
JS中的继承操作实例总结
2020/06/06 Javascript
js判断鼠标移入移出方向的方法
2020/06/24 Javascript
[05:05]DOTA2亚洲邀请赛 战队出场仪式
2015/02/07 DOTA
[50:05]VGJ.S vs OG 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
为什么黑客都用python(123个黑客必备的Python工具)
2020/01/31 Python
python3中datetime库,time库以及pandas中的时间函数区别与详解
2020/04/16 Python
Python matplotlib 绘制双Y轴曲线图的示例代码
2020/06/12 Python
Python实现AES加密,解密的两种方法
2020/10/03 Python
关于多种方式完美解决Python pip命令下载第三方库的问题
2020/12/21 Python
css3中的calc函数浅析
2018/07/10 HTML / CSS
美国蔬菜和植物种子公司:Burpee
2017/02/01 全球购物
印度尼西亚最大和最全面的网络商城:Blibli.com
2017/10/04 全球购物
List, Set, Map是否继承自Collection接口?
2016/05/16 面试题
敬老文明号事迹材料
2014/01/16 职场文书
最常使用的求职信
2014/05/25 职场文书
2014年秋季开学寄语
2014/08/02 职场文书
交通安全横幅标语
2014/10/07 职场文书
追悼会答谢词
2015/01/05 职场文书
为什么说餐饮很难做,是因为你不了解这些新规则
2019/08/20 职场文书
Python实现为PDF去除水印的示例代码
2022/04/03 Python
SQL Server的存储过程与触发器以及系统函数和自定义函数
2022/04/10 SQL Server