zoukankan      html  css  js  c++  java
  • 使用Python解密仿射密码

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

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

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

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

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

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

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

     1 #encoding:utf-8
     2 
     3 def NI(x,b): #定义求x关于b的逆元的函数NI,其中(NI(x,b)*x) mod b = 1 当x和b互质时求出的逆元唯一
     4     i = 1
     5     while (x*i)%b != 1:
     6         i = i + 1
     7     return i
     8 
     9 c = "DBUHU SPANO SMPUS STMIU SBAKN OSMPU SS"
    10 C = []
    11 
    12 #对密文进行预处理并储存在列表中,储存形式是对应字母在26个英文字母中的位序
    13 for i in c:
    14     if i == ' ':
    15         C.append(i)
    16     else:
    17         C.append(ord(i)-65)
    18 
    19 #将加密算法中a可能的取值储存在列表中
    20 a = [3,5,7,9,11,15,17,19,21,23,25]
    21 P = []
    22 
    23 for keyb in range(0,26):
    24     for keya in a:
    25         ni_a = NI(keya,26)
    26         for s in C:
    27             if s == ' ':
    28                 P.append(' ')
    29             else:
    30                 P.append(((s-keyb)*ni_a)%26) #将明文字母对应的位次码依次加入到明文列表中
    31         strP = ''
    32         for t in P:
    33             if t==' ':
    34                 strP = strP + ' '
    35             else:
    36                 strP = strP + chr(t+97) #将明文转化为字符串并输出
    37         print(strP)
    38         P = []

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

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

  • 相关阅读:
    JavaWeb 内存马一周目通关攻略
    Android应用攻与防
    JavaWeb 内存马二周目通关攻略
    Mysql 5.7 windows安装 zip安装
    [JavaScript] 单例模式
    [JavaScript] 策略模式
    Leecode刷题笔记
    Java面经
    一些开源项目在ARM上的移植
    ffmpeg和SDL的多媒体编程(二)输出到屏幕
  • 原文地址:https://www.cnblogs.com/chester-cs/p/11574237.html
Copyright © 2011-2022 走看看