202603-2 凯撒密码(回忆版)

题目描述

凯撒密码是一种替换加密技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。

例如,当偏移量是 333 的时候,所有的字母 AAA 将被替换成 DDDBBB 被替换成 EEECCC 被替换成 FFF,以此类推,WWW 被替换成 ZZZXXX 被替换成 AAAYYY 被替换成 BBBZZZ 被替换成 CCC。这个加密方法是以罗马共和时期凯撒的名字命名的,据称当年凯撒曾用此方法与其将军们进行联系。

但是和所有的利用字母表进行替换的加密技术一样,凯撒密码非常容易被破解,而且在实际应用中也无法保证通信安全。

现在给你一个已破解的凯撒密码明文与密文,与一个有相同偏移量的未破解凯撒密码密文,请你帮忙破解它。

输入格式

输入共三行:

  • 第一行包含一个字符串,表示已破解的凯撒密码明文;
  • 第二行包含一个字符串,表示已破解的凯撒密码密文;
  • 第三行包含一个字符串,表示待破解的凯撒密码密文。

输出格式

输出一行,包含一个字符串,表示待破解的凯撒密码对应的明文。

样例输入

ABCDEFGVWXYZ
DEFGHIJYZABC
WKHTXLFNEURZQIRAMXPSVRYHWUKHODCBGRJ

样例输出

THEQUICKBROWNFOXJUMPSOVERTHELAZYDOG

解题思路

方法:计算偏移量 + 逆向解密

  1. 计算偏移量:通过已知的明文和密文对,计算偏移量 n=明文第一个字符−密文第一个字符n = 明文第一个字符 - 密文第一个字符n=明文第一个字符密文第一个字符

    • 例如:n=′A′−′D′=−3n = 'A' - 'D' = -3n=AD=3(或等价于 232323
  2. 解密过程:对待破解的密文进行解密,即将每个字符向前偏移 ∣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=AD=3

解密验证(以前几个字符为例):

  • ‘W’ → ‘W’ + (-3) = ‘T’
  • ‘K’ → ‘K’ + (-3) = ‘H’
  • ‘H’ → ‘H’ + (-3) = ‘E’
  • ‘T’ → ‘T’ + (-3) = ‘Q’

得到 “THEQ…”,与预期输出一致。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐