维吉尼亚密码

实验介绍:

维吉尼亚密码是多表代换密码。

多表代换密码和单表代换密码的区别在于:

单表代换明文和密文一一对应,多表代换明文和密文不是一一对应的,同一个明文可以被加密成不同密文。

多表代换使用密钥。

一:维吉尼亚加解密原理

维吉尼亚加密原理

将明文"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))