华师一附中OI组

标题: P1079 Vigenère 密码 [打印本页]

作者: admin    时间: 2018-6-29 16:55
标题: P1079 Vigenère 密码
题目描述
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 提高组 第一天 第一题


作者: 吴语林    时间: 2018-7-30 00:09
  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. }
复制代码

作者: 倚窗倾听风吹雨    时间: 2018-7-30 08:49
  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. }
复制代码

作者: 黄煦喆    时间: 2018-8-2 10:22
  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. }
复制代码





欢迎光临 华师一附中OI组 (http://hsyit.cn/) Powered by Discuz! X3.2