题目名称:维吉尼亚密码加密与解密
问题描述
维吉尼亚密码是一种多表代换密码,使用重复的密钥词对每个字母进行位移加密或解密。具体规则如下:
- 加密:密文字母 =
(明文字母 - 'a' + 位移量) % 26 + 'a'
- 解密:明文字母 =
(密文字母 - 'a' - 位移量 + 26) % 26 + 'a'
- 密钥处理:密钥词重复扩展至与明文/密文长度相同。例如,明文为
hello
(长度5),密钥为abc
(长度3),则扩展后的密钥为abcab
。 - 位移量:由密钥字母决定,
a
对应0,b
对应1,…,z
对应25。
请编写一个C++程序,实现加密和解密功能,并处理用户输入。
输入格式
- 第一行为一个大写字母
E
或D
,表示加密或解密。 - 第二行为待处理的字符串(明文或密文),仅包含小写字母。
- 第三行为密钥词,仅包含小写字母。
输出格式
- 输出加密或解密后的结果,全部为小写字母。
示例1
输入:
E
hello
abc
输出:
hfnlp
解释:密钥扩展为 abcab
,加密过程如下:
- h (7) + 0 → h
- e (4) + 1 → f
- l (11) + 2 → n
- l (11) + 0 → l
- o (14) + 1 → p
示例2
输入:
D
hfnlp
abc
输出:
hello
要求
- 实现函数
string encrypt(string plaintext, string keyword)
和string decrypt(string ciphertext, string keyword)
。 - 主函数中根据输入调用对应函数并输出结果。
- 密钥长度至少为1,无需处理非法输入。
参考代码框架
Cpp
#include <iostream>
#include <string>
using namespace std;
string encrypt(string plaintext, string keyword) {
// 补全加密代码
}
string decrypt(string ciphertext, string keyword) {
// 补全解密代码
}
int main() {
char mode;
string text, keyword;
cin >> mode >> text >> keyword;
if (mode == 'E') {
cout << encrypt(text, keyword) << endl;
} else if (mode == 'D') {
cout << decrypt(text, keyword) << endl;
}
return 0;
}
提示
- 使用
%
运算符处理循环位移。 - 解密时注意避免负数,可先加26再取模。
- 遍历字符串时,同步生成扩展后的密钥字母。
会C++请补全 encrypt
和 decrypt
函数,实现上述功能。
只会C请写完整代码。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容