Python实现仿射密码解密:原理与代码解析

追风的人
追风的人
发布时间:2026-10-13 | 6人浏览过
原创

本文详解仿射密码的加解密原理,重点解析Python实现过程。通过定义求逆元函数NI,遍历密钥a和b的所有合法组合,批量生成潜在明文。最终结合语言学常识筛选出正确结果,完整展示从密文“DBUHU SPANO SMPUS STMIU SBAKN OSMPU SS”到明文“theres no business like show business”的解密流程。

仿射密码解密任务背景

新学期开设了一门密码学课程,教师在课堂上布置了一道具体的解密练习题。

题目要求解密一段由仿射密码加密的密文,内容为:“DBUHU SPANO SMPUS STMIU SBAKN OSMPU SS”。

仿射密码加解密原理

要成功解密该密文,首先需要明确仿射密码的基本定义与工作机制。

仿射密码属于代换密码的一种,其加解密过程遵循特定的数学公式。

加密公式为:C = E([a,b], p) = (ap + b) mod 26,其中C代表密文字母,p代表明文字母,a和b为密钥参数。

解密公式为:p = D([a,b], C) = ((C - b) / a) mod 26,这里需要计算a在模26下的乘法逆元。

Python解密代码实现与逆元计算

由于手动计算所有可能的密钥组合效率极低,因此借助计算机程序进行暴力破解是更可行的方案。以下是使用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 相关产品和应用

全部下载

专题列表