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密码题解【字符串】》

  Vigenère加密在操作时需要注意: 
1.  ®运算忽略参与运算的字母的大小写,并保持字母在明文 M中的大小写形式; 
2.  当明文M的长度大于密钥k的长度时,将密钥k 重复使用。 
例如,明文M=Helloworld,密钥k=abc 时,密文C=Hfnlpyosnd。 
明文  H  e  l  l  o  w  o  r  l  d 
密钥  a  b  c  a  b  c  a  b  c  a 
密文  H  f  n  l  p  y  o  s  n  d

输入

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

 

输出

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

 

样例输入

复制样例数据

CompleteVictory
Yvqgpxaimmklongnzfwpvxmniytm

样例输出

Wherethereisawillthereisaway

题解思路:我们观察一下上面的表不过就是1-26个英文字母,我们可以把这个26个英文字母转换成数字,在生成一张数字表,最后输入密匙的一个字母,找到密文的字母之后,输出他的明文字母,最后只需要判断一下是不是大小写就可以了。我用map进行了处理,附一下代码:

#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <map>
#include <string>
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
char mp[50][50];
int change(char a)
{
    return a>='A'&&a<='Z'?a:a-32;
}
int judge(char a)
{
    return a>='A'&&a<='Z'?1:0;
}
int main()
{
    map<char,int>q;
    map<int,char>q1;
    char in1[3000],in2[3000];
    char cop[3000];
    char str[30]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
    for(int i=0;i<26;i++)
        q[str[i]]=i+1;
    for(int i=0;i<26;i++)
        q1[i+1]=str[i];
    for(int i=1;i<=26;i++)
    {
        int j=i;
        for(int k=1;k<=26;k++)
        {
            if(j==26) mp[i][k]='Z';
            else mp[i][k]=q1[j%26];
            j++;
        }
    }//生成字母表,也可以生成数字表。
    scanf("%s%s",in1,in2);
    int len1=strlen(in1);
    int len2=strlen(in2);
    if(len1<len2)
        for(int i=len1;i<len2;i++)
            in1[i]=in1[i%len1];
    for(int i=0;i<len2;i++)
    {
        int re=q[change(in1[i])];
        for(int k=1;k<=26;k++)
        {
            if(mp[re][k]==change(in2[i]))
            {
                if(judge(in2[i])) printf("%c",q1[k]);
                else printf("%c",q1[k]+32);
            }
        }
    }
    return 0;
}

 

    原文作者:维吉尼亚加密问题
    原文地址: https://blog.csdn.net/qq_43857314/article/details/87622035
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞