华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1130|回复: 3
打印 上一主题 下一主题

P1079 Vigenère 密码

[复制链接]

738

主题

1485

帖子

5420

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5420
跳转到指定楼层
楼主
发表于 2018-6-29 16:55:23 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
题目描述
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 ® k_i,运算®的规则如下表所示:





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


®运算忽略参与运算的字母的大小写,并保持字母在明文 M 中的大小写形式;


当明文 M 的长度大于密钥 k 的长度时,将密钥 k  重复使用。


例如,明文 M=Helloworld ,密钥 k=abc 时,密文 C=Hfnlpyosnd 。





输入输出格式
输入格式:
共 2 行。


第一行为一个字符串,表示密钥 k,长度不超过 100 ,其中仅包含大小写字母。


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


输出格式:
一个字符串,表示输入密钥和密文所对应的明文。


输入输出样例
输入样例#1:
CompleteVictory
Yvqgpxaimmklongnzfwpvxmniytm
输出样例#1:
Wherethereisawillthereisaway
说明
【数据说明】


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


NOIP 2012 提高组 第一天 第一题

回复

使用道具 举报

9

主题

158

帖子

470

积分

华一学生

积分
470
QQ
地板
发表于 2018-8-2 10:22:30 | 只看该作者
  1. #include<iostream>
  2. #include<map>
  3. using namespace std;
  4. string s1="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  5. string s2="abcdefghijklmnopqrstuvwxyz";
  6. map<char,int>M,m;
  7. string key,mi,c;
  8. int im,ik;
  9. int main()
  10. {
  11.     cin>>key>>mi;
  12.     for(int i=0;i<26;i++)
  13.         M.insert(make_pair(char(i+'A'),i)),
  14.         m.insert(make_pair(char(i+'a'),i));
  15.     while(im<mi.size())
  16.     {
  17.         int k;
  18.         if(mi[im]>='a'&&mi[im]<='z')k=mi[im]-'a';
  19.         else k=mi[im]-'A';
  20.         if(key[ik]>='a'&&key[ik]<='z')k-=m[key[ik]];
  21.         else k-=M[key[ik]];
  22.         k=(k+26)%26;
  23.         if(mi[im]>='a'&&mi[im]<='z')cout<<s2[k];
  24.         else cout<<s1[k];
  25.         im++,ik++;
  26.         ik%=key.size();
  27.     }
  28.     return 0;
  29. }
复制代码
回复 支持 反对

使用道具 举报

50

主题

215

帖子

619

积分

高级会员

Rank: 4

积分
619
板凳
发表于 2018-7-30 08:49:11 | 只看该作者
  1. #include<iostream>
  2. using namespace std;
  3. string s1,s2;
  4. char s3[1010];
  5. int main()
  6. {
  7.         cin>>s1>>s2;
  8.         for(int i=0;i<s2.size();i++)
  9.         {
  10.                 if(s2[i]>='a' && s2[i]<='z')
  11.                 {
  12.                         if(s1[i%s1.size()]>='a' && s1[i%s1.size()]<='z')
  13.                         s3[i]=(s2[i]-'a'-(s1[i%s1.size()]-'a')+26)%26+'a';
  14.                         if(s1[i%s1.size()]>='A' && s1[i%s1.size()]<='Z')
  15.                         s3[i]=(s2[i]-'a'-(s1[i%s1.size()]-'A')+26)%26+'a';
  16.                 }
  17.                 if(s2[i]>='A' && s2[i]<='Z')
  18.                 {
  19.                         if(s1[i%s1.size()]>='a' && s1[i%s1.size()]<='z')
  20.                         s3[i]=(s2[i]-'A'-(s1[i%s1.size()]-'a')+26)%26+'A';
  21.                         if(s1[i%s1.size()]>='A' && s1[i%s1.size()]<='Z')
  22.                         s3[i]=(s2[i]-'A'-(s1[i%s1.size()]-'A')+26)%26+'A';
  23.                 }
  24.         }
  25.         cout<<s3;
  26. }
复制代码
回复 支持 反对

使用道具 举报

2

主题

105

帖子

306

积分

中级会员

Rank: 3Rank: 3

积分
306
沙发
发表于 2018-7-30 00:09:29 | 只看该作者
  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <iostream>
  4. #include <cmath>
  5. #include <cstring>
  6. using namespace std;
  7. int main()
  8. {
  9.     int i,j;
  10.     char a[1001],b[101];
  11.     gets(b);
  12.     gets(a);
  13.     for (i=0;i<strlen(b);++i)
  14.     b[i]=(b[i]>='A'&&b[i]<='Z')?b[i]+32:b[i];
  15.     for (i=0;i<strlen(a);++i)
  16.     {
  17.         j=i%strlen(b);
  18.         if (a[i]>='A'&&a[i]<='Z')
  19.         printf("%c",(a[i]-b[j]+58)%26+65);
  20.         else
  21.         printf("%c",(a[i]-b[j]+26)%26+97);
  22.     }
  23.         return 0;
  24. }
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-11-2 06:30 , Processed in 0.120867 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表