加密 【打表】

先生与加密
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 396 Solved: 255
[Submit][Status][Web Board]
Description
L先生最近想给暗恋的同班女神Z写一封情书,但是需要经过同学A、B、C、D、E、F、G转交,为了保证情书内容不被公之于众(否则后果,你懂的),他决定采用高大上的维吉尼亚加密。
那么,问题来了,L先生的C语言是挂科的,所以代码写不出来,笔算内容又太多,感到很无助,你能帮助他吗?

Input
多组测试例,处理到文件结束。(测试例数量<5)

每行有两个字符串,之间用空格隔开,分别为明文a和密钥b。输入字符全都为小写。(字符串长度<=50)

Output
每个加密结果占一行。输出字符全都小写。

Sample Input
datasecurity best
Sample Output
eelttiunsmlr
HINT

维吉尼亚密码引入了“密钥”的概念,即根据密钥来决定用哪一行的密表来进行替换,以此来对抗字频统计。假如对如下明文加密:

TO BE OR NOT TO BE THAT IS THE QUESTION

当选定RELATIONS作为密钥时,加密过程是:明文一个字母为T,第一个密钥字母为R,因此可以找到在R行中代替T的为K,依此类推,得出对应关系如下:

密钥:RELAT IONSR ELATI ONSRE LATIO NSREL

明文:TOBEO RNOTT OBETH ATIST HEQUE STION

密文:KSMEH ZBBLK SMEMP OGAJX SEJCS FLZSY

首先必须要 理解题中说的 在R行中代替T的为K ,这句话啥意思,
其实就是
ABCD…..Z
BCDE……A
CDEF…….B
.
.
ZABC……Y

就是这个表,当时想了半天才觉得只能是这样,正好对题意
之后很简单了,可以打个表
代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define MAXN 10000+10
#define MAXM 1000000+10
using namespace std;
int biao[26][26];
void dabiao()
{
    for(int i=0;i<26;i++)
    {
        for(int j=0;j<26;j++)
        {
            biao[i][j]=(i+j)%26;
        }
    }
    /*for(int i=0;i<26;i++)
    {
        for(int j=0;j<26;j++)
        {
            printf("%c ",biao[i][j]+'a');
        }
        putchar('\n');
    }*/
}
int main()
{
    dabiao();
    char s[100],ss[100];
    while(scanf("%s %s",s,ss)!=EOF)
    {
        int a=strlen(s);
        int b=strlen(ss);
        char str[100];
        if(b<a) 
        {
            int i,j=0;
            for(i=0;i<a;i++)
            {   
                 if(j==b) j=0;
                 str[i]=ss[j],j++;

            }
        }
        else  for(int i=0;i<b;i++) str[i]=ss[i];

        for(int i=0;i<a;i++)
        {
            printf("%c",biao[str[i]-'a'][s[i]-'a']+'a');
        }
        putchar('\n');
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值