基于Python解密仿射密码

yipeiwu_com6年前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设计】。

相关文章

git进行版本控制心得详谈

git进行版本控制心得详谈

小编在学习可视化的时候,接触到git,所以这里写一下关于GitHub的有关知识,写这个的目的还是巩固自己的学习,一方面可以提高自己,另一方面回头看一下,有什么更深层次的东西还可以再记录。...

Python 实现引用其他.py文件中的类和类的方法

#HelloWorld是文件名称,Hello是类 from HelloWorld import Hello 调用,Hello类的方法: >>> h = Hel...

Python字符串匹配算法KMP实例

本文实例讲述了Python字符串匹配算法KMP。分享给大家供大家参考。具体如下: #!/usr/bin/env python #encoding:utf8 def next(patt...

轻松掌握python设计模式之策略模式

轻松掌握python设计模式之策略模式

本文实例为大家分享了python策略模式代码,供大家参考,具体内容如下 """ 策略模式 """ import types class StrategyExample: def...

Python计算两个矩形重合面积代码实例

这篇文章主要介绍了Python 实现两个矩形重合面积代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 代码如下 计算两个矩形的重...