基于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 相关文章推荐
Python实现把回车符\r\n转换成\n
Apr 23 Python
使用Python制作获取网站目录的图形化程序
May 04 Python
Python3中的真除和Floor除法用法分析
Mar 16 Python
python进阶_浅谈面向对象进阶
Aug 17 Python
Python字典中的键映射多个值的方法(列表或者集合)
Oct 17 Python
Pandas_cum累积计算和rolling滚动计算的用法详解
Jul 04 Python
python禁用键鼠与提权代码实例
Aug 16 Python
使用opencv将视频帧转成图片输出
Dec 10 Python
python 如何用urllib与服务端交互(发送和接收数据)
Mar 04 Python
Python借助with语句实现代码段只执行有限次
Mar 23 Python
Pillow图像处理库安装及使用
Apr 12 Python
Python尝试实现蒙特卡罗模拟期权定价
Apr 21 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
phpMyAdmin 安装教程全攻略
2007/03/19 PHP
PHP使用mysqldump命令导出数据库
2015/04/14 PHP
PHP闭包函数详解
2016/02/13 PHP
PHP使用curl模拟post上传及接收文件的方法
2016/03/04 PHP
PHP异常处理定义与使用方法分析
2017/07/25 PHP
解决thinkphp5未定义变量会抛出异常,页面错误,请稍后再试的问题
2019/10/16 PHP
Javascript 去除数组的重复元素
2010/05/04 Javascript
实现51Map地图接口(示例代码)
2013/11/22 Javascript
JavaScript中自定义事件用法分析
2014/12/23 Javascript
AngularJS学习笔记之TodoMVC的分析
2015/02/22 Javascript
jQuery层次选择器用法示例
2016/09/09 Javascript
基于jQuery实现火焰灯效果导航菜单
2017/01/04 Javascript
JS 在数组指定位置插入/删除数据的方法
2017/01/12 Javascript
jQuery基于事件控制实现点击显示内容下拉效果
2017/03/07 Javascript
three.js中文文档学习之如何本地运行详解
2017/11/20 Javascript
微信小程序实现下载进度条的方法
2017/12/08 Javascript
node内置调试方法总结
2018/02/22 Javascript
JavaScript this绑定过程深入详解
2018/12/07 Javascript
如何用原生js写一个弹窗消息提醒插件
2019/05/24 Javascript
vue-dplayer 视频播放器实例代码
2019/11/08 Javascript
vue使用prop可以渲染但是打印台报错的解决方式
2019/11/13 Javascript
[06:33]DOTA2亚洲邀请赛小组赛第二日 TOP10精彩集锦
2015/01/31 DOTA
python爬虫实现教程转换成 PDF 电子书
2017/02/19 Python
利用Python如何生成hash值示例详解
2017/12/20 Python
Python2.7.10以上pip更新及其他包的安装教程
2018/06/12 Python
Python单元测试简单示例
2018/07/03 Python
Pyqt5实现英文学习词典
2019/06/24 Python
如何利用Pyecharts可视化微信好友
2019/07/04 Python
Python Gitlab Api 使用方法
2019/08/28 Python
python字符串的拼接方法总结
2019/11/18 Python
python操作yaml说明
2020/04/08 Python
进程的查看和调度分别使用什么命令
2015/03/25 面试题
医疗器械售后服务承诺书
2014/05/21 职场文书
事业单位年度考核个人总结
2015/02/12 职场文书
会计工作自我鉴定范文
2019/06/21 职场文书
Java实现扫雷游戏详细代码讲解
2022/05/25 Java/Android