NOIP201205Vigenère密码

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 加密在操作时需要注意:
    1.®运算忽略参与运算的字母的大小写,并保持字母在明文M 中的大小写形式; 
    2.当明文M 的长度大于密钥k 的长度时,将密钥k重复使用。 
例如,明文M=Helloworld,密钥k=abc时,密文C=Hfnlpyosnd。 

       

输入
输入共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 }
NOIP201205Vigenère密码
原文地址:https://www.cnblogs.com/YXY-1211/p/5666171.html