华师一附中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
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cmath>
#include <cstring>
using namespace std;
int main()
{
int i,j;
char a[1001],b[101];
gets(b);
gets(a);
for (i=0;i<strlen(b);++i)
b[i]=(b[i]>='A'&&b[i]<='Z')?b[i]+32:b[i];
for (i=0;i<strlen(a);++i)
{
j=i%strlen(b);
if (a[i]>='A'&&a[i]<='Z')
printf("%c",(a[i]-b[j]+58)%26+65);
else
printf("%c",(a[i]-b[j]+26)%26+97);
}
return 0;
}
复制代码
作者:
倚窗倾听风吹雨
时间:
2018-7-30 08:49
#include<iostream>
using namespace std;
string s1,s2;
char s3[1010];
int main()
{
cin>>s1>>s2;
for(int i=0;i<s2.size();i++)
{
if(s2[i]>='a' && s2[i]<='z')
{
if(s1[i%s1.size()]>='a' && s1[i%s1.size()]<='z')
s3[i]=(s2[i]-'a'-(s1[i%s1.size()]-'a')+26)%26+'a';
if(s1[i%s1.size()]>='A' && s1[i%s1.size()]<='Z')
s3[i]=(s2[i]-'a'-(s1[i%s1.size()]-'A')+26)%26+'a';
}
if(s2[i]>='A' && s2[i]<='Z')
{
if(s1[i%s1.size()]>='a' && s1[i%s1.size()]<='z')
s3[i]=(s2[i]-'A'-(s1[i%s1.size()]-'a')+26)%26+'A';
if(s1[i%s1.size()]>='A' && s1[i%s1.size()]<='Z')
s3[i]=(s2[i]-'A'-(s1[i%s1.size()]-'A')+26)%26+'A';
}
}
cout<<s3;
}
复制代码
作者:
黄煦喆
时间:
2018-8-2 10:22
#include<iostream>
#include<map>
using namespace std;
string s1="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
string s2="abcdefghijklmnopqrstuvwxyz";
map<char,int>M,m;
string key,mi,c;
int im,ik;
int main()
{
cin>>key>>mi;
for(int i=0;i<26;i++)
M.insert(make_pair(char(i+'A'),i)),
m.insert(make_pair(char(i+'a'),i));
while(im<mi.size())
{
int k;
if(mi[im]>='a'&&mi[im]<='z')k=mi[im]-'a';
else k=mi[im]-'A';
if(key[ik]>='a'&&key[ik]<='z')k-=m[key[ik]];
else k-=M[key[ik]];
k=(k+26)%26;
if(mi[im]>='a'&&mi[im]<='z')cout<<s2[k];
else cout<<s1[k];
im++,ik++;
ik%=key.size();
}
return 0;
}
复制代码
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2