问题如下:
解题思路:
根据凯撒密码的规则,将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,中文意思为密码学。