维吉尼亚密码的Python实现(加密和解密),加解密


维吉尼亚密码原理简介:

如读者还需实现 滚动密钥密码 (特殊的维吉尼亚密码),请移至本文末尾

维吉尼亚密码是一种特殊的移位密钥密码:
在这里插入图片描述

编码思路:

在这里插入图片描述

代码实现:

构造所需函数

列表函数
# 实现列表对应元素相加(加密部分)
def add_list(x,y):
    result = []
    for i in range(len(x)):
        z = x[i] + y[i]
        result.append(z)
    return result


# 实现列表元素对应相减(解密部分)
def sub_list(x,y):
    result = []
    for i in range(len(x)):
        z = x[i] - y[i]
        result.append(z)
    return result
构造映射关系
# 构造映射 字符---->num
def c2n():
    list_c = []
    list_n = []
    for i in range(26):
        list_n.append(i)
        list_c.append(chr(i+97))
    dic_c2n = dict(map(lambda x,y:[x,y],list_c,list_n))
    return dic_c2n


# 构造映射 num---->字符
def n2c():
    list_c = []
    list_n = []
    for i in range(26):
        list_n.append(i)
        list_c.append(chr(i+97))
    dic_n2c = dict(map(lambda x,y:[x,y],list_n,list_c))
    return dic_n2c
加密
# 加密
def encode(s,key):
    print('加密后的字符: ',end='')
    dic_c2n = c2n()
    dic_n2c = n2c()
    list_s = []
    list_key = []
    list_finall = []
    for i in s:
        i = i.lower()
        list_s.append(dic_c2n[i])
    for i in key:
        i = i.lower()
        list_key.append(dic_c2n[i])
    for i in list_key:
        if len(list_key) <= len(list_s):
            list_key.append(i)
    list_result = add_list(list_s,list_key)
    for i in list_result:
        if i > 25:
            i -= 26
        list_finall.append(dic_n2c[i])
    for i in list_finall:
        print(i.upper(),end='')
解密
# 解密
def decode(s,key):
    print('解密后的字符: ',end='')
    dic_c2n = c2n()
    dic_n2c = n2c()
    list_s = []
    list_key = []
    list_finall = []
    for i in s:
        i = i.lower()
        list_s.append(dic_c2n[i])
    for i in key:
        i = i.lower()
        list_key.append(dic_c2n[i])
    for i in list_key:
        if len(list_key) < len(list_s):
            list_key.append(i)
    list_result = sub_list(list_s,list_key)
    for i in list_result:
        if i < 0:
            i += 26
        list_finall.append(dic_n2c[i])
    for i in list_finall:
        print(i,end='')
程序入口
# 函数入口
answer = input(f'请输入所需的操作:编码/E or 解码/D:  ')
try:
    if answer.upper() == 'E':
        key = input('请输入Key:')
        s = input('请输入需要加密的字符:')
        encode(s,key)
    elif answer.upper() == 'D':
        key = input('请输入Key:')
        s = input('请输入需要解密的字符:')
        decode(s,key)
    else:
        print('输入错误!')
except KeyError:
    print('请勿输入空格!')
演示代码
'''
一般维吉尼亚密码:
key = 'RADIO'
s = 'polyalphabeticcipher'
s_ = 'GOOGOCPKIPVTLKQZPKMF'

滚动密钥密码:
key = 'beijingmeetatnineinthe'
s = 'meetatnineintheevening'
s_ = 'NIMCIGTURIBNMUMRZMABUK'
'''
实现效果

一般维吉尼亚密码的实现:

请输入所需的操作:编码/E or 解码/D:  e
请输入Key:RADIO
请输入需要加密的字符:polyalphabeticcipher
加密后的字符: GOOGOCPKIPVTLKQZPKMF

滚动密钥密码的实现:
在这里插入图片描述

请输入所需的操作:编码/E or 解码/D:  d
请输入Key:beijingmeetatnineinthe
请输入需要解密的字符:NIMCIGTURIBNMUMRZMABUK
解密后的字符: meetatnineintheevening