基于Python解密仿射密码


Posted in Python onOctober 21, 2019

新学期有一门密码学课,课上老师布置了一道密码学题,题目如下:

解密由仿射密码加密的密文“DBUHU SPANO SMPUS STMIU SBAKN OSMPU SS”

想解密这个密文,首先必须要知道仿射密码是什么:

仿射密码是一种代换密码,加解密公式如下

加密:C=E([a,b],p)=(ap+b) mod 26C=E([a,b],p)=(ap+b) mod 26

解密:p=D([a,b],C)=((C−b)/a) mod 26p=D([a,b],C)=((C−b)/a) mod 26

很显然不能靠人力来解密,只好求助于计算机程序,下面是我写的用Python解密的代码,输出结果后要用语言学的知识(肉眼观察)来辨别哪一个是我们所需要的明文。此外,解密过程涉及到求逆元的过程,需要定义一个函数NI。

#encoding:utf-8

def NI(x,b): #定义求x关于b的逆元的函数NI,其中(NI(x,b)*x) mod b = 1 当x和b互质时求出的逆元唯一
  i = 1
  while (x*i)%b != 1:
    i = i + 1
  return i

c = "DBUHU SPANO SMPUS STMIU SBAKN OSMPU SS"
C = []

#对密文进行预处理并储存在列表中,储存形式是对应字母在26个英文字母中的位序
for i in c:
  if i == ' ':
    C.append(i)
  else:
    C.append(ord(i)-65)

#将加密算法中a可能的取值储存在列表中
a = [3,5,7,9,11,15,17,19,21,23,25]
P = []

for keyb in range(0,26):
  for keya in a:
    ni_a = NI(keya,26)
    for s in C:
      if s == ' ':
        P.append(' ')
      else:
        P.append(((s-keyb)*ni_a)%26) #将明文字母对应的位次码依次加入到明文列表中
    strP = ''
    for t in P:
      if t==' ':
        strP = strP + ' '
      else:
        strP = strP + chr(t+97) #将明文转化为字符串并输出
    print(strP)
    P = []

运行文件后依次打印出所有可能的明文。经过寻找,发现如下一行应当是所求的明文。

基于Python解密仿射密码

读出明文应当为theres no business like show business。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python3 能振兴 Python的原因分析
Nov 28 Python
Python中的id()函数指的什么
Oct 17 Python
理解python中生成器用法
Dec 20 Python
Python数据抓取爬虫代理防封IP方法
Dec 23 Python
python opencv实现gif图片分解的示例代码
Dec 13 Python
Python 识别12306图片验证码物品的实现示例
Jan 20 Python
关于TensorFlow新旧版本函数接口变化详解
Feb 10 Python
对django 2.x版本中models.ForeignKey()外键说明介绍
Mar 30 Python
python使用隐式循环快速求和的实现示例
Sep 11 Python
TensorFlow低版本代码自动升级为1.0版本
Feb 20 Python
python实现过滤敏感词
May 08 Python
Pytest中skip skipif跳过用例详解
Jun 30 Python
python多继承(钻石继承)问题和解决方法简单示例
Oct 21 #Python
python超时重新请求解决方案
Oct 21 #Python
详解python中*号的用法
Oct 21 #Python
python中bytes和str类型的区别
Oct 21 #Python
python中@property和property函数常见使用方法示例
Oct 21 #Python
vim自动补全插件YouCompleteMe(YCM)安装过程解析
Oct 21 #Python
基于python解线性矩阵方程(numpy中的matrix类)
Oct 21 #Python
You might like
php获取随机数组列表的方法
2014/11/13 PHP
Yii2框架中一些折磨人的坑
2019/12/15 PHP
如何用javascript去掉字符串里的所有空格
2007/02/08 Javascript
JavaScript实现网页上的浮动广告的简单方法
2013/06/14 Javascript
jquery全选checkBox功能实现代码(取消全选功能)
2013/12/10 Javascript
让人蛋疼的JavaScript语法特性
2014/09/30 Javascript
jquery动态加载js/css文件方法(自写小函数)
2014/10/11 Javascript
jQuery实现的动态伸缩导航菜单实例
2015/05/07 Javascript
浅谈javascript中的DOM方法
2015/07/16 Javascript
微信jssdk在iframe页面失效问题的解决措施
2016/03/03 Javascript
JS小数运算出现多为小数问题的解决方法
2016/06/02 Javascript
javascript 动态样式添加的简单实现
2016/10/11 Javascript
js判断手机号是否正确并返回的实现代码
2017/01/17 Javascript
python实现文件名批量替换和内容替换
2014/03/20 Python
Python-基础-入门 简介
2014/08/09 Python
python在linux系统下获取系统内存使用情况的方法
2015/05/11 Python
举例讲解Django中数据模型访问外键值的方法
2015/07/21 Python
python中pandas.DataFrame对行与列求和及添加新行与列示例
2017/03/12 Python
python中lambda()的用法
2017/11/16 Python
Python学习小技巧总结
2018/06/10 Python
pandas 转换成行列表进行读取与Nan处理的方法
2018/10/30 Python
详解在Python中以绝对路径或者相对路径导入文件的方法
2019/08/30 Python
Python基于WordCloud制作词云图
2019/11/29 Python
Python3合并两个有序数组代码实例
2020/08/11 Python
Jupyter Notebook 远程访问配置详解
2021/01/11 Python
基于pycharm 项目和项目文件命名规则的介绍
2021/01/15 Python
使用豆瓣源来安装python中的第三方库方法
2021/01/26 Python
详解纯CSS3制作的20种loading动效
2017/07/05 HTML / CSS
canvas基础之图形验证码的示例
2018/01/02 HTML / CSS
Boden美国官网:英伦原创时装品牌
2017/07/03 全球购物
德国、奥地利和瑞士最大的旅行和度假门户网站:HolidayCheck
2019/11/14 全球购物
人力资源主管职责范本
2014/03/05 职场文书
应届生求职信范文
2014/05/26 职场文书
Python编程编写完善的命令行工具
2021/09/15 Python
SQL基础的查询语句
2021/11/11 MySQL
Oracle中DBLink的详细介绍
2022/04/29 Oracle