用python实现一个凯撒密码解密算法

 问题如下:

解题思路:

根据凯撒密码的规则,将26个字母分别对应[0,25]区间内的数,然后经过计算将所有可能的明文求出,并在明文中找出有意义的单词即为真正的明文。因为密文的长度为12,所以总共需要进行12*25(移动0位的情况下明文就是密文,无意义)= 300次计算。由于计算量过于复杂,所以通过python进行编程实现。

编程实现(本算法不仅只用于解决以上问题,可以解决任何凯撒密码的解密,只需修改其中的ciphertext变量):

cht = list('abcdefghijklmnopqrstuvwxyz') #定义字母表
plv = [i for i in range(0,26)] #字母表中的每一个字母依次对应[0,25]之间的一个数

caesar = dict(zip(cht,plv)) #凯撒密码加密器
recaesar = dict(zip(plv,cht)) #凯撒密码解密器

#将你自己的密文赋值给ciphertext
#例:如果你的密文为chgjklop,请将下面这句代码改为ciphertext = list('chgjklop')
ciphertext = list('pelcgbtencul') #经过加密后的密文
plaintexts = [] #用来存放所有可能的明文

#穷举法得到所有可能的明文
for offset in range(1,26): #取[1,25]的原因是当偏移量为0时明文就是密文,无意义
    tmp = str()
    for ch in ciphertext:
        tmp += recaesar[(caesar[ch]+offset)%26] #将密文对应的数加上偏移量在对26进行求模运算后,得到数字对应的字母
    plaintexts.append(tmp)

for plaintext in plaintexts:
	print(plaintext)

运行结果:

如上图所示,所有可能的明文中有意义的单词为cryptography,中文意思为密码学。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值