题目描述
16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加密算法——Vigenère 密码。Vigenère 密码的加密解密算法简单易用,且破译难度比较高,曾在美国南北战争中为南军所广泛使用。
在密码学中,我们称需要加密的信息为明文,用 表示;称加密后的信息为密文,用 表示;而密钥是一种参数,是将明文转换为密文或将密文转换为明文的算法中输入的数据,记为 。在 Vigenère 密码中,密钥 是一个字符串, 。当明文 时,得到的密文 ,其中 ,运算 的规则如下表所示:
Vigenère 加密在操作时需要注意:
例如,明文 ,密钥 时,密文 。
明文 | H | e | l | o | w | o | r | l | d | |
---|---|---|---|---|---|---|---|---|---|---|
密钥 | a | b | c | a | b | c | a | b | c | a |
密文 | H | f | n | l | p | y | o | s | n | d |
第一行为一个字符串,表示密钥 ,长度不超过 ,其中仅包含大小写字母。
第二行为一个字符串,表示经加密后的密文,长度不超过 ,其中仅包含大小写字母。
输出格式输出共 行,一个字符串,表示输入密钥和密文所对应的明文。
样例样例输入 1
CompleteVictory
Yvqgpxaimmklongnzfwpvxmniytm
样例输出 1
Wherethereisawillthereisaway
数据范围与提示
对于 100% 的数据,输入的密钥的长度不超过 ,输入的密文的长度不超过 ,且都仅包含大小写字母。
分类标签[2012] [NOIp 提高组]
C++题解代码
#include <bits/stdc++.h>
using namespace std;
string a;
string b;
int c;
int e;
int d;
// 描述该功能...
int xh(char x) {
if ((x >= 'a') && (x <= 'z')) {
e = ((int)x-32);
} else {
e = (int)x;
}
e = (e-(int)'A');
return e;
}
// The main procedure
int main() {
cin>>a;
cin>>b;
for (int i = 0; i < b.size(); i++) {
c = xh(a[(i%a.size())]);
d = xh(b[i]);
d = (((d+26)-c)%26);
if ((b[i] >= 'a') && (b[i] <= 'z')) {
cout<<(char)(d+(int)'a');
} else {
cout<<(char)(d+(int)'A');
}
}
return 0;
}
Blockly题解代码图片