NOIP201205Vigenère密码 |
难度级别: A; 编程语言:不限;运行时间限制:1000ms; 运行空间限制:51200KB; 代码长度限制:2000000B |
试题描述
|
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 加密在操作时需要注意:
|
输入
|
输入共2行。第一行为一个字符串,表示密钥k,长度不超过100,其中仅包含大小写字母。第二行为一个字符串,表示经加密后的密文,长度不超过1000,其中仅包含大小写字母。
|
输出
|
输出共1行,一个字符串,表示输入密钥和密文所对应的明文。
|
输入示例
|
CompleteVictory
Yvqgpxaimmklongnzfwpvxmniytm |
输出示例
|
Wherethereisawillthereisaway
|
其他说明
|
【数据说明】输入的密钥的长度不超过100,输入的密文的长度不超过1000,且都仅包含英文字母。
|
需要找一下规律,之后就很容易了。
1 #include<iostream> 2 3 using namespace std; 4 5 int main() 6 { 7 int i,lenk,lenmw,key[100]; 8 char k[101],mw[1001],ch; 9 cin>>k>>mw; 10 lenk=strlen(k); 11 lenmw=strlen(mw); 12 for(i=0;i<lenk;i++) //先把所有密文和密钥都减掉一个A或a(大写字母减A,小写字母减a),方便后面计算 13 { 14 if(k[i]>='a') key[i]=k[i]-'a'; 15 else key[i]=k[i]-'A'; 16 } 17 for(i=0;i<lenmw;i++) //进行转换 18 { 19 ch=mw[i]-key[i%lenk]; 20 if((ch<'A')||(ch<'a'&&mw[i]>='a')) ch+=26; 21 cout<<ch; 22 } 23 return 0; 24 }