• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

基于Python解密仿射密码

python 搞代码 4年前 (2022-01-08) 25次浏览 已收录 0个评论

这篇文章主要介绍了基于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_<div style="color:transparent">来源gaodai^.ma#com搞#代!码网</div>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解密仿射密码的详细内容,更多请关注gaodaima搞代码网其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:基于Python解密仿射密码

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址