【NOIP2012D1T1】Vigenère 密码

题目描述

  16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加密算法——Vigenère 密码。Vigenère 密码的加密解密算法简单易用,且破译难度比较高,曾在美国南北战争中为南军所广泛使用。
  在密码学中,我们称需要加密的信息为明文,用 M 表示;称加密后的信息为密文,用 C表示;而密钥是一种参数,是将明文转换为密文或将密文转换为明文的算法中输入的数据,记为 k。 在 Vigenère 密码中,密钥 k 是一个字母串 k = k 1 k 2 k n 。当明文 M = m 1 m 2 m n 时,得到的密文 C = c 1 c 2 c n ,其中 c i = m i ® k i ,运算 ® 的规则如下表所示:
这里写图片描述  
Vigenère 加密在操作时需要注意:
1. ® 运算忽略参与运算的字母的大小写,并保持字母在明文 M 中的大小写形式;
2.当明文 M 的长度大于密钥 k 的长度时,将密钥 k 重复使用。
例如,明文 M = Helloworld,密钥 k = abc 时,密文 C = Hfnlpyosnd。
这里写图片描述

输入输出格式

输入格式
输入共 2 行。
第一行为一个字符串,表示密钥 k ,长度不超过 100,其中仅包含大小写字母。
第二行为一个字符串,表示经加密后的密文,长度不超过 1000,其中仅包含大小写字母。

输出格式

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

输入输出样例

输入样例

CompleteVictory
Yvqgpxaimmklongnzfwpvxmniytm

输出样例

Wherethereisawillthereisaway

说明

对于 100 % 的数据,输入的密钥的长度不超过 100 ,输入的密文的长度不超过 1000 ,且都仅包含英文字母。

分析

很水的一道模拟题,直接上代码不解释。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define re register ll
string k,mi;
int main()
{
    cin>>k>>mi;
    re l1=k.length(),l2=mi.length();
    for(re i=0;i<l2;i++)
    {
        re bj=i>=l1?i%l1:i,chuli=0;
        char kk=char(k[bj])>=char('a')?char(k[bj])-char('a')+char('A'):k[bj];
        char h=char(mi[i])>=char('a')?char(char(mi[i])-char('a')+char('A')):mi[i];
        re change=char(h)>=char(kk)?char(h)-char(kk):char('Z')-char(kk)+char(h)-char('A')+1;
        if(char(mi[i])>=char('a'))chuli=char('a')-char('A');
        re js=char('A')+change+chuli;
        cout<<char(js);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/disangan233/article/details/81053425