維吉尼亞密碼

纤秾發表於2024-10-12

實驗介紹:

維吉尼亞密碼是多表代換密碼。
多表代換密碼和單表代換密碼的區別在於:
單表代換明文和密文一一對應,多表代換明文和密文不是一一對應的,同一個明文可以被加密成不同密文。
多表代換使用金鑰。

一:維吉尼亞加解密原理

維吉尼亞加密原理

將明文“cyber great wall corporation”(網路長城公司)字元去掉空格寫在第一行
轉化成數字寫在第二行
image
金鑰“iscbupt”轉化為數字金鑰“8,18,2,1,20,15,19”
寫到第三行重複直至和明文一樣長
數字明文和數字金鑰相加再求模26寫在第四行
將第四行的數字轉成字母寫在第五行就是密文了
image

維吉尼亞解密原理

第一行寫密文
第二行寫數字密文
第三行寫數字金鑰
第四行寫(數字密文-數字金鑰)模26
第五行寫明文
image

二:維吉尼亞矩陣

因為加密是數字明文加數字金鑰求mod26,所以相對於是明文偏移了一個金鑰的距離。可得矩陣

在加密中如果金鑰為L 明文為S 則密文為D

image
金鑰字母a值為0,則數字明文偏移0,
金鑰字母b值為1,則數字明文偏移1,以此類推。

解密矩陣

先找到金鑰,密文,再對應明文
image

三:加密程式碼實現

點選檢視程式碼
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))

相關文章