古典密码-维吉尼亚密码
实验介绍:
维吉尼亚密码是多表代换密码。
多表代换密码和单表代换密码的区别在于:
单表代换明文和密文一一对应,多表代换明文和密文不是一一对应的,同一个明文可以被加密成不同密文。
多表代换使用密钥。
一:维吉尼亚加解密原理
维吉尼亚加密原理
将明文“cyber great wall corporation”(网络长城公司)字符去掉空格写在第一行
转化成数字写在第二行
密钥“iscbupt”转化为数字密钥“8,18,2,1,20,15,19”
写到第三行重复直至和明文一样长
数字明文和数字密钥相加再求模26写在第四行
将第四行的数字转成字母写在第五行就是密文了
维吉尼亚解密原理
第一行写密文
第二行写数字密文
第三行写数字密钥
第四行写(数字密文-数字密钥)模26
第五行写明文
二:维吉尼亚矩阵
因为加密是数字明文加数字密钥求mod26,所以相对于是明文偏移了一个密钥的距离。可得矩阵
在加密中如果密钥为L 明文为S 则密文为D
密钥字母a值为0,则数字明文偏移0,
密钥字母b值为1,则数字明文偏移1,以此类推。
解密矩阵
先找到密钥,密文,再对应明文
三:加密代码实现
点击查看代码
def KeyTran(key,keyLen):
strResult=""
if(len(key)>keyLen):
strResult=key[0:keyLen]
else:
newKeyList=list()
index=0
while(index<keyLen):
newKeyList.append(key[index%len(key)])
index+=1
strResult="".join(newKeyList)
return strResult
def PassMatrix():
pm=list()
# startIndex=65
startIndex=ord('A')
while(startIndex<91):
pmRow=list()
i=0
while(i<26):
currChr=startIndex+i
if(currChr>90):
currChr=currChr-26
pmRow.append(chr(currChr))
print("".join(pmRow))
pm.append(pmRow)
startIndex+=1
return pm
txtPlain=input("please input your plain text:")
txtPlain= txtPlain.upper()
print(txtPlain)
txtKey=input("please input your key:")
txtKey=txtKey.upper()
print(txtKey)
print("trasforming the key...")
txtNewKey=KeyTran(txtKey,len(txtPlain))
print("Constructing key password matrix:")
lsPM=PassMatrix()
print("Plain Text: ",txtPlain)
print("encryption key:",txtNewKey)
print("encrypting...")
gapPlain=0
gapKey=0
strResult=list()
index=0
for ch in txtPlain:
gapPlain=ord(ch)-ord('A')
gapKey=ord(txtNewKey[index])-ord('A')
print(ch, txtNewKey[index], "|", gapPlain, ",", gapKey, "->", lsPM[gapKey][gapPlain])
strResult.append(lsPM[gapKey][gapPlain])
index+=1
print("encryption result:","".join(strResult))