GESP 2026年3月C++三级(凯撒密码----回忆版)
·
202603-2 凯撒密码(回忆版)
题目描述
凯撒密码是一种替换加密技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。
例如,当偏移量是 333 的时候,所有的字母 AAA 将被替换成 DDD,BBB 被替换成 EEE,CCC 被替换成 FFF,以此类推,WWW 被替换成 ZZZ,XXX 被替换成 AAA,YYY 被替换成 BBB,ZZZ 被替换成 CCC。这个加密方法是以罗马共和时期凯撒的名字命名的,据称当年凯撒曾用此方法与其将军们进行联系。
但是和所有的利用字母表进行替换的加密技术一样,凯撒密码非常容易被破解,而且在实际应用中也无法保证通信安全。
现在给你一个已破解的凯撒密码明文与密文,与一个有相同偏移量的未破解凯撒密码密文,请你帮忙破解它。
输入格式
输入共三行:
- 第一行包含一个字符串,表示已破解的凯撒密码明文;
- 第二行包含一个字符串,表示已破解的凯撒密码密文;
- 第三行包含一个字符串,表示待破解的凯撒密码密文。
输出格式
输出一行,包含一个字符串,表示待破解的凯撒密码对应的明文。
样例输入
ABCDEFGVWXYZ
DEFGHIJYZABC
WKHTXLFNEURZQIRAMXPSVRYHWUKHODCBGRJ
样例输出
THEQUICKBROWNFOXJUMPSOVERTHELAZYDOG
解题思路
方法:计算偏移量 + 逆向解密
-
计算偏移量:通过已知的明文和密文对,计算偏移量 n=明文第一个字符−密文第一个字符n = 明文第一个字符 - 密文第一个字符n=明文第一个字符−密文第一个字符
- 例如:n=′A′−′D′=−3n = 'A' - 'D' = -3n=′A′−′D′=−3(或等价于 232323)
-
解密过程:对待破解的密文进行解密,即将每个字符向前偏移 ∣n∣|n|∣n∣ 位
- 解密公式:明文字符=密文字符+n明文字符 = 密文字符 + n明文字符=密文字符+n
- 需要处理边界情况:若结果超过 ‘Z’,则减去 26;若小于 ‘A’,则加上 26
代码解析
#include <bits/stdc++.h>
using namespace std;
int main() {
string s1, s2, s;
cin >> s1 >> s2 >> s;
// 计算偏移量:明文-密文
int n = s1[0] - s2[0];
// 对待破解的密文进行解密
for (char i : s) {
i += n; // 向前偏移n位
// 处理边界情况,确保在'A'-'Z'范围内
if (i > 'Z') i -= 26;
else if (i < 'A') i += 26;
cout << i;
}
return 0;
}
样例验证
偏移量计算:
- n=′A′−′D′=−3n = 'A' - 'D' = -3n=′A′−′D′=−3
解密验证(以前几个字符为例):
- ‘W’ → ‘W’ + (-3) = ‘T’
- ‘K’ → ‘K’ + (-3) = ‘H’
- ‘H’ → ‘H’ + (-3) = ‘E’
- ‘T’ → ‘T’ + (-3) = ‘Q’
得到 “THEQ…”,与预期输出一致。
更多推荐
所有评论(0)