基于Python解密仿射密码

 更新时间:2019年10月21日 10:18:09   作者:思念殇千寻  
这篇文章主要介绍了基于Python解密仿射密码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

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

解密由仿射密码加密的密文“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 = []

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

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

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

相关文章

  • Python 异常处理实例详解

    Python 异常处理实例详解

    python提供了两个非常重要的功能(异常处理和断言(Assertions))来处理python程序在运行中出现的异常和错误,你可以使用该功能来捕捉python程序的异常
    2014-03-03
  • python爬取亚马逊书籍信息代码分享

    python爬取亚马逊书籍信息代码分享

    这篇文章主要介绍了python爬取亚马逊书籍信息代码分享,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • 深入探究Flask的两个高级特性之蓝图和JWT认证

    深入探究Flask的两个高级特性之蓝图和JWT认证

    本文将探讨 Flask 的两个高级特性:蓝图(Blueprints)和 JSON Web Token(JWT)认证,蓝图让我们可以将应用模块化,以便更好地组织代码;而 JWT 认证是现代 Web 应用中常见的一种安全机制,感兴趣的小伙伴跟着小编一起来看看吧
    2023-08-08
  • python 字符串常用方法超详细梳理总结

    python 字符串常用方法超详细梳理总结

    字符串是Python中基本的数据类型,几乎在每个Python程序中都会使用到它。本文为大家总结了Python中必备的31个字符串方法,需要的可以参考一下
    2022-03-03
  • 详解Python开启线程和线程池的方法

    详解Python开启线程和线程池的方法

    这篇文章主要介绍了Python开启线程和线程池的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-03-03
  • 利用Python自动化生成爱豆日历详解

    利用Python自动化生成爱豆日历详解

    openpyxl,一个能读取和修改Excel电子表格的Pyhton模块,可以实现自动化处理表格信息,摆脱无趣无味。本文将利用openpyxl和calendar库,实现自动化生成爱豆日历,感兴趣的可以了解一下
    2022-05-05
  • 基于Pygame中Pygame模块的大战外星人实战

    基于Pygame中Pygame模块的大战外星人实战

    本文主要介绍了基于Pygame中Pygame模块的大战外星人实战,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • python标准算法实现数组全排列的方法

    python标准算法实现数组全排列的方法

    这篇文章主要介绍了python标准算法实现数组全排列的方法,实例分析了全排列的原理与Python实现技巧,需要的朋友可以参考下
    2015-03-03
  • Pytest+request+Allure实现接口自动化框架

    Pytest+request+Allure实现接口自动化框架

    接口自动化是指模拟程序接口层面的自动化,由于接口不易变更,维护成本更小,所以深受各大公司的喜爱,本文主要介绍了Pytest+request+Allure实现接口自动化框架,感兴趣的可以了解一下
    2021-07-07
  • python实现学生管理系统源码

    python实现学生管理系统源码

    这篇文章主要为大家详细介绍了python实现学生管理系统源码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04

最新评论