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缩进区别分析
Feb 15 Python
python使用rabbitmq实现网络爬虫示例
Feb 20 Python
Python中使用partial改变方法默认参数实例
Apr 28 Python
python使用pil进行图像处理(等比例压缩、裁剪)实例代码
Dec 11 Python
python 将数据保存为excel的xls格式(实例讲解)
May 03 Python
Python快速查找list中相同部分的方法
Jun 27 Python
使用python实现http及ftp服务进行数据传输的方法
Oct 26 Python
python爬虫之快速对js内容进行破解
Jul 09 Python
Python OpenCV调用摄像头检测人脸并截图
Aug 20 Python
原来我一直安装 Python 库的姿势都不对呀
Nov 11 Python
安装PyInstaller失败问题解决
Dec 14 Python
Python模块常用四种安装方式
Oct 20 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
codeigniter中实现一次性加载多个view的方法
2015/03/20 PHP
php程序内部post数据的方法
2015/03/31 PHP
PHP模糊查询技术实例分析【附源码下载】
2019/03/07 PHP
javascript vvorld 在线加密破解方法
2008/11/13 Javascript
百度Popup.js弹出框进化版 拖拽小框架发布 兼容IE6/7/8,Firefox,Chrome
2010/04/13 Javascript
使用jquery实现IE下按backspace相当于返回操作
2014/03/18 Javascript
浅谈javascript的Array.prototype.slice.call
2015/08/31 Javascript
javascript图片延迟加载实现方法及思路
2015/12/31 Javascript
javascript 用函数实现继承详解
2016/05/28 Javascript
Jquery组件easyUi实现手风琴(折叠面板)示例
2016/08/23 Javascript
浅谈html转义及防止javascript注入攻击的方法
2016/12/04 Javascript
适用于手机端的jQuery图片滑块动画
2016/12/09 Javascript
easyui关于validatebox实现多重规则验证的方法(必看)
2017/04/12 Javascript
iview table render集成switch开关的实例
2018/03/14 Javascript
基于p5.js 2D图像接口的扩展(交互实现)
2020/11/30 Javascript
Python在线运行代码助手
2016/07/15 Python
Python入门_学会创建并调用函数的方法
2017/05/16 Python
Python断言assert的用法代码解析
2018/02/03 Python
python生成特定分布数的实例
2019/12/05 Python
python异常处理和日志处理方式
2019/12/24 Python
TensorFlow查看输入节点和输出节点名称方式
2020/01/04 Python
pytorch:实现简单的GAN示例(MNIST数据集)
2020/01/10 Python
Python 通过监听端口实现唯一脚本运行方式
2020/05/05 Python
中外合拍动画首获奥斯卡提名,“上海出品”《飞奔去月球》能否拿下最终大奖?
2021/03/16 国漫
css3弹性盒模型(Flexbox)详细介绍
2014/10/08 HTML / CSS
利用html5 canvas破解简单验证码及getImageData接口应用
2013/01/25 HTML / CSS
使用phonegap克隆和删除联系人的实现方法
2017/03/31 HTML / CSS
Crucial英睿达法国官网:内存条及SSD固态硬盘升级
2018/07/13 全球购物
北京某公司的.net笔试题
2014/03/20 面试题
毕业生自我鉴定范文
2013/11/08 职场文书
入党自我鉴定
2014/03/25 职场文书
担保书怎么写
2014/04/01 职场文书
党委工作总结2015
2015/04/27 职场文书
生日祝酒词大全
2015/08/10 职场文书
Python中Schedule模块使用详解 周期任务神器
2022/04/19 Python
详解apache编译安装httpd-2.4.54及三种风格的init程序特点和区别
2022/07/15 Servers