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管理Windows服务小脚本
Mar 12 Python
浅谈DataFrame和SparkSql取值误区
Jun 09 Python
python3 property装饰器实现原理与用法示例
May 15 Python
wxPython电子表格功能wx.grid实例教程
Nov 19 Python
Flask中endpoint的理解(小结)
Dec 11 Python
pytorch::Dataloader中的迭代器和生成器应用详解
Jan 03 Python
Python实现进度条和时间预估的示例代码
Jun 02 Python
Python 保存加载mat格式文件的示例代码
Aug 04 Python
ubuntu16.04升级Python3.5到Python3.7的方法步骤
Aug 20 Python
python获取本周、上周、本月、上月及本季的时间代码实例
Sep 08 Python
单身狗福利?Python爬取某婚恋网征婚数据
Jun 03 Python
python元组打包和解包过程详解
Aug 02 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 什么是PEAR?(第二篇)
2009/03/19 PHP
用PHP读取超大文件的实例代码
2012/04/01 PHP
PHP按行读取文件时删除换行符的3种方法
2014/05/04 PHP
php匹配字符中链接地址的方法
2014/12/22 PHP
JS之Date对象和获取系统当前时间详解
2014/01/13 Javascript
jquery获取html元素的绝对位置和相对位置的方法
2014/06/20 Javascript
jquery访问ashx文件示例代码
2014/08/11 Javascript
Javascript原型链和原型的一个误区
2014/10/22 Javascript
js操作滚动条事件实例
2015/01/29 Javascript
纯javascript实现四方向文本无缝滚动效果
2015/06/16 Javascript
JS实现网页上随机产生超链接地址的方法
2015/11/09 Javascript
node 版本切换的实现
2020/02/02 Javascript
用javascript实现倒计时效果
2021/02/09 Javascript
布同 统计英文单词的个数的python代码
2011/03/13 Python
python连接oracle数据库实例
2014/10/17 Python
Python多进程机制实例详解
2015/07/02 Python
Python使用PyCrypto实现AES加密功能示例
2017/05/22 Python
Python实现备份MySQL数据库的方法示例
2018/01/11 Python
Python使用pandas处理CSV文件的实例讲解
2018/06/22 Python
Windows下将Python文件打包成.EXE可执行文件的方法
2018/08/03 Python
在Python中输入一个以空格为间隔的数组方法
2018/11/13 Python
python实现图书借阅系统
2019/02/20 Python
在python tkinter中Canvas实现进度条显示的方法
2019/06/14 Python
Python OpenCV读取显示视频的方法示例
2020/02/20 Python
Python使用进程Process模块管理资源
2020/03/05 Python
浅谈python量化 双均线策略(金叉死叉)
2020/06/03 Python
python利用paramiko实现交换机巡检的示例
2020/09/22 Python
HTML5 离线应用之打造零请求、无流量网站的解决方法
2013/04/25 HTML / CSS
心理学专业毕业生推荐信范文
2013/11/21 职场文书
党支部换届选举方案
2014/05/08 职场文书
学习雷锋精神活动总结
2015/02/06 职场文书
公路施工安全责任书
2015/05/08 职场文书
演讲比赛通讯稿
2015/07/18 职场文书
青年文明号创建口号大全
2015/12/25 职场文书
2016党校学习心得体会范文
2016/01/07 职场文书
详解Vue的列表渲染
2021/11/20 Vue.js