luogu1079 Vigenère 密码

本文介绍了Vigenère密码,一种由Blaise de Vigenère在16世纪设计的加密算法,因其相对较高的安全性在历史中被广泛应用。文章详细阐述了Vigenère密码的加密和解密原理,以及如何使用密钥和明文进行转换。同时,给出了输入输出格式和样例,帮助理解算法的实现过程。该题目来源于NOIP 2012提高组第一天的第一题,属于简单的模拟题目。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://www.elijahqi.win/archives/955
题目描述

16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加密算法――Vigenère 密

码。Vigenère 密码的加密解密算法简单易用,且破译难度比较高,曾在美国南北战争中为

南军所广泛使用。

在密码学中,我们称需要加密的信息为明文,用 M 表示;称加密后的信息为密文,用

C 表示;而密钥是一种参数,是将明文转换为密文或将密文转换为明文的算法中输入的数据,

记为 k。 在 Vigenère 密码中,密钥 k 是一个字母串,k=k1k2…kn。当明文 M=m1m2…mn时,

得到的密文 C=c1c2…cn,其中 ci=mi®ki,运算®的规则如下表所示:

Vigenère 加密在操作时需要注意:

®运算忽略参与运算的字母的大小写,并保持字母在明文 M 中的大小写形式;
当明文 M 的长度大于密钥 k 的长度时,将密钥 k 重复使用。
例如,明文 M=Helloworld,密钥 k=abc 时,密文 C=Hfnlpyosnd。

输入输出格式

输入格式:

输入共 2 行。

第一行为一个字符串,表示密钥 k,长度不超过 100,其中仅包含大小写字母。第二行

为一个字符串,表示经加密后的密文,长度不超过 1000,其中仅包含大小写字母。

输出格式:

输出共 1 行,一个字符串,表示输入密钥和密文所对应的明文。

输入输出样例

输入样例#1:

CompleteVictory
Yvqgpxaimmklongnzfwpvxmniytm
输出样例#1:

Wherethereisawillthereisaway
说明

【数据说明】

对于 100%的数据,输入的密钥的长度不超过 100,输入的密文的长度不超过 1000,且

都仅包含英文字母。

NOIP 2012 提高组 第一天 第一题

简单模拟

#include<cstdio>
#include<cstring>
char map1[30],map[30][30],map2[256][256],s[1100],k[1100],ans[11000];
int main(){
    //freopen("vigenere.in","r",stdin);
    for (int i=0;i<=25;++i) map1[i+1]=i+'a';
    for (int i=1;i<=26;++i) map1[26+i]=map1[i];
    for (int i=1;i<=26;++i){
        int cnt=0;
        for (int j=i;j<=i+26-1;++j) map[i][++cnt]=map1[j];
    }
    for (int i=1;i<=26;++i){
        for (int j=1;j<=26;++j) map2[map[i][j]][i+'a'-1]='a'+j-1,map2[map[i][j]-('a'-'A')][i+'a'-1]='A'+j-1;
    }
    scanf("%s",k+1);scanf("%s",s+1);    
    int n=strlen(s+1),kk=strlen(k+1);
    for (int i=1;i<=kk;++i) if (k[i]<=90&&k[i]>=65) k[i]+='a'-'A';int tmp=0;
    //printf("%s",k+1);
    for (int i=1;i<=n;++i){
        ++tmp;if (tmp==kk+1) tmp=1;
        ans[i]=map2[s[i]][k[tmp]];
    }
    for (int i=1;i<=n;++i) printf("%c",ans[i]);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值