简单介绍:维吉尼亚密码算法使用一个密钥和一个表来实现加密,根据明文和密钥的对应关系进行查表来决定加密结果。假设替换表如图https://www.qqxiuzi.cn/bianma/weijiniyamima.png所示,最上面一行表示明文,最左边一列表示密钥,那么二维表格中与明文字母和密钥字母对应的字母就是加密结果。例如单词PYTHON使用ABCDEF做密钥的加密结果就是PZVKSS
可在此网站验证https://www.qqxiuzi.cn/bianma/weijiniyamima.php
代码:
from string import ascii_uppercase as uppercase
from itertools import cycle
#创建密码表
table=dict()
for ch in uppercase:
index=uppercase.index(ch)
table[ch]=uppercase[index:]+uppercase[:index]
#创建解密码表
deTable={'A':'A'}
start='Z'
for ch in uppercase[1:]:
index=uppercase.index(ch)
deTable[ch]=chr(ord(start)+1-index)
#解密密钥
def deKey(key):
return ''.join([deTable[i] for i in key])
#加密/解密
def encrypt(plainText,key):
result=[]
#创建cycle对象,支持密钥字母的循环使用
currentKey=cycle(key)
for ch in plainText:
if 'A'<=ch<='Z':
index=uppercase.index(ch)
#获取密钥字母
ck=next(currentKey)
result.append(table[ck][index])
else:
result.append(ch)
return ''.join(result)
#进行加密
key=input('请输入你的密钥:')#输入只能大写字母
p=input('请输入你想要的加密的内容:')#输入只能大写字母
c=encrypt(p,key)
print('加密后的内容为',c)
#进行解密
q=input('请输入你想要解密的内容:')
key1=input('请输入密钥:')
print('解密后的内容为:',encrypt(q,deKey(key1)))
测试: