Python实现凯撒密码

     大一上学习了Python,课程设计要求实现凯撒密码。加密方式很好写,减密方式是加密的逆过程,但涉及到对对字典和列表的使用,尤其是字符串与列表的转换这里要转一下弯。很多人在写时利用了反加密,即加密时移了几位,解密在反过来移动。想一想别人给你密文会给你密钥吗?,即你不知道密key,所以这里需要用统计学知识找到key.    

#2020更新:做了一个GUI扩展,可以参考这篇博客

我用了一篇文章某段加了密,运行代码,根据提示输入密文:

用统计方法找出移动key,根据结果我们发现字母h出现了88次,由统计方法知,字母h很可能时字母e变化而来。很自然我们就知道了移位规律,当然这里也可以使用冠词a来判断,因为它出现概率也高,且是单字母,因此可以用计算后的结果来反推它。 然后恢复文章

运行效果:

源代码如下:

import string
import math      


def prettyprint(wcdict):#定义函数,找到频率出现次数最高的字母,并返回 
    valkeylist=[]
    for key ,val in wcdict.items():
        valkeylist.append((val,key))
        t=sorted(valkeylist)
        v=len(t)

    return valkeylist[t-1]

  



def casar_code(a,k):#把密文转为原文
    s=str(a)
    k=int(k)
    l=[]
    for  i in range(len(a)):
        l.append(chr(ord(a[i])+k))

    return "".join(l)















a="abcdefghijklmnopqrstuwxyz"
a=list(a)
thearticle=input("enter the article (number of words must more than 100):")
a_list=[]
thearticle=list(thearticle)
for letter in thearticle:
    if letter in a :
        a_list.append(letter.lower)
#得到字典,键为字母 值为出现次数
b={}
for i in a_list:
        
    if i in b:
        b[i]+=1
    else:
        
        b[i]=1
#找到频率出现次数最高的字母,并返回
wcdict=b
valkeylist=[]
for key ,val in wcdict.items():
    
        valkeylist.append((val,key))
valkeylist=sorted(valkeylist)
t=len(valkeylist)
maxletter=valkeylist[t-1]   
p=a.find(maxletter)
shiftkey=p-5
k=shiftkey
print("the encrypted message is :",thearticle)
print('the shift key is:',k)
print("the explain message is:",casar_code(a,k))





 

  • 15
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值