實驗介紹:
維吉尼亞密碼是多表代換密碼。
多表代換密碼和單表代換密碼的區別在於:
單表代換明文和密文一一對應,多表代換明文和密文不是一一對應的,同一個明文可以被加密成不同密文。
多表代換使用金鑰。
一:維吉尼亞加解密原理
維吉尼亞加密原理
將明文“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))