问题 D: Vigenere密码

题目描述

有一位法国外交家发明了一种神奇的算法明文是M,密钥是k,密文是C。加密规则如下:
c[i]=m[i]@k[i]
 

密钥



加密注意点;
1、加密时忽略明文和密钥的大小写,并在密文中保持明文的大小写
2、当明文M的长度大于密钥K的长度时,K可以被循环使用。
例如,明文 M=Helloworld,密钥 k=abc 时,密文 C=Hfnlpyosnd
 

输入格式

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

输出格式

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

输入样例 复制
CompleteVictory
Yvqgpxaimmklongnzfwpvxmniytm
输出样例 复制
Wherethereisawillthereisaway

完整代码

加密方式是对应右移x为,这个x就是对应秘钥字母到‘a’的距离。解密自然就是左移了。

#include<bits/stdc++.h>
using namespace std;

int main(){
    //freopen("/config/workspace/test/test","r",stdin);
    string k;
    cin>>k;
    string m;
    cin>>m;

    for(int i=0;i<k.length();i++){
        if(k[i]>='A'&&k[i]<='Z'){
            k[i]=k[i]-('A'-'a');
        }
    }
    //cout<<k<<endl;
    int index=0;
    char res[1000];
    for(int i=0;i<m.length();i++){
        if(m[i]>='a'&&m[i]<='z'){
            res[i]='a'+(26+(m[i]-'a')-(k[(index++)%k.length()]-'a'))%26;
            //cout<<('a'+((m[i]-'a')-(k[(index++)%k.length()]-'a'))%26)<<endl;
        }else{
            res[i]='A'+(26+(m[i]-'A')-(k[(index++)%k.length()]-'a'))%26;
            //cout<<('A'+((m[i]-'A')-(k[(index++)%k.length()]-'a'))%26)<<endl;
        }
        
    }
    for(int i=0;i<m.length();i++){
        cout<<res[i];
    }

    return 0;
}

Vigenere密码是一种基于多字母替换密码的加密方法,它可以很好地保护数据的安全性。下面是Vigenere密码的加解密方法: 1. 加密方法 (1)准备明文和密钥 假设需要加密的明文为M,密钥为K。 (2)扩展密钥 将密钥K重复扩展成和明文M等长的序列K',例如: M: ATTACKATDAWN K: LEMONLEMONLE K': LEMONLEMONLE (3)生成密文 按照Vigenere密码表的规则,将明文M和扩展后的密钥K'进行加密,得到密文C。加密方法如下: - 将明文M和K'中的第一个字母相对应,得到密文C的第一个字母; - 将明文M和K'中的第二个字母相对应,得到密文C的第二个字母; - 以此类推,直到加密完所有的字母。 Vigenere密码表如下: A B C D E F G H I J K L M A A B C D E F G H I J K L M B B C D E F G H I J K L M A C C D E F G H I J K L M A B D D E F G H I J K L M A B C E E F G H I J K L M A B C D F F G H I J K L M A B C D E G G H I J K L M A B C D E F H H I J K L M A B C D E F G I I J K L M A B C D E F G H J J K L M A B C D E F G H I K K L M A B C D E F G H I J L L M A B C D E F G H I J K M M A B C D E F G H I J K L 例如,将明文M中的第一个字母A和扩展后的密钥K'中的第一个字母L对应,则密文C的第一个字母为L。 最后,将密文C发送给接收者。 2. 解密方法 (1)准备密文和密钥 假设需要解密的密文为C,密钥为K。 (2)扩展密钥 将密钥K重复扩展成和密文C等长的序列K',例如: C: LXFOPVEFRNHR K: LEMONLEMONLE K': LEMONLEMONLE (3)生成明文 按照Vigenere密码表的规则,将密文C和扩展后的密钥K'进行解密,得到明文M。解密方法如下: - 将密文C和K'中的第一个字母相对应,得到明文M的第一个字母; - 将密文C和K'中的第二个字母相对应,得到明文M的第二个字母; - 以此类推,直到解密完所有的字母。 例如,将密文C中的第一个字母L和扩展后的密钥K'中的第一个字母L对应,则明文M的第一个字母为A。 最后,将明文M发送给接收者。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值