luogu1079 Vigenère 密码

网友投稿 846 2022-08-29

luogu1079 Vigenère 密码

luogu1079 Vigenère 密码

​​ 题目描述

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#includechar 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;}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:luogu3243 [HNOI2015]菜肴制作
下一篇:一行代码如何隐藏 Linux 进程?(隐藏一段代码)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~