【题目描述】

6世纪法国外交家Blaise de Vigenère设计了一种多表密码加密算法——Vigenère密码。Vigenère密码的加密解密算法简单易用,且破译难度比较高,曾在美国南北战争中为南军所广泛使用。

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

表示;称加密后的信息为密文,用C表示;而密钥是一种参数,是将明文转换为密文或将密文转换为明文的算法中输入的数据,记为k。 在Vigenère密码中,密钥k是一个字母串,k=k1k2kn。当明文M=m1m2mn时,得到的密文C=c1c2cn,其中ci=mi®ki

,运算®的规则如下表所示:

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

1.®运算忽略参与运算的字母的大小写,并保持字母在明文M

中的大小写形式;

2.当明文M

的长度大于密钥k的长度时,将密钥k

重复使用。

例如,明文M=Helloworld

,密钥k=abc时,密文C=Hfnlpyosnd

【输入】

第一行为一个字符串,表示密钥k

,长度不超过100

,其中仅包含大小写字母。

第二行为一个字符串,表示经加密后的密文,长度不超过1000

,其中仅包含大小写字母。

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

,输入的密文的长度不超过1000

,且都仅包含英文字母。

【输出】

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

【输入样例】

CompleteVictory
Yvqgpxaimmklongnzfwpvxmniytm

【输出样例】

Wherethereisawillthereisaway
复制代码
#include<bits/stdc++.h>
using namespace std;
string k,c;
int main()
{
    getline(cin,k);
    getline(cin,c);
    int len=k.size(),len1=c.size();
    for(int i=0;i<len;i++)k[i]=(char)(toupper(k[i]));
    for(int i=0,j=0;i<len1;i++)
    {
        if(isupper(c[i]))
        {
            c[i]-=k[j]-'A';
            j++;
            if(c[i]<'A')c[i]='Z'-('A'-c[i])+1;
        }
        else
        {
            c[i]-=k[j]-'A';
            j++;
            if(c[i]<'a')c[i]='z'-('a'-c[i])+1;
        }
        if(j>len-1)j=0;
    }
    cout<<c;
    return 0;
}
复制代码

 

posted on   禹城我的家  阅读(340)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具



点击右上角即可分享
微信分享提示