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

本文介绍了维吉尼亚密码的原理,并通过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

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值