维吉尼亚密码加密与解密

维吉尼亚密码加密与解密

题目名称:维吉尼亚密码加密与解密

问题描述

维吉尼亚密码是一种多表代换密码,使用重复的密钥词对每个字母进行位移加密或解密。具体规则如下:

  • 加密:密文字母 = (明文字母 - '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

要求

  1. 实现函数 string encrypt(string plaintext, string keyword) 和 string decrypt(string ciphertext, string keyword)
  2. 主函数中根据输入调用对应函数并输出结果。
  3. 密钥长度至少为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++请补全 encryptdecrypt 函数,实现上述功能。
只会C请写完整代码。

© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容