密码学的基础,凯撒密码。或许很多人在一些趣味书中有做到过。我记得在谢希仁编写的《计算机网络》中就有这么一题,十分的有趣。所谓凯撒密码,就是将字母的顺序依次先后或前移几位。这是非常简单的加密,如果加密文字的长度适中,你甚至可以自己手动破译出来。


接下来对该题进行分析

首先我们看一下题目说了些什么

正如大多数挑战站点那样,通常会有一些初级的加密加密供您训练,而这其中您经常会碰到这个古老而奇妙的凯撒密码。

我欢迎您来尝试一下这些WeChall风格的训练挑战 :)

加油吧!

很好,就是一段简单的介绍,没有有用的信息。不过这里的凯撒密码也相当的简单,仅仅需要一些分析和尝试即可解决。譬如我们看到这段文字中NBY这三个字符出现了好几次,对于英文中的一些常见3字单词就有CAN THE之类。我们可以逐一尝试我们发现如果向后移6位NBY便会变为THE,那么我们把所有的单词都尝试一下,发现成立。

亦或者更加简单粗暴的方法。既然是移动指定的位数,那我们不如通过程序来将这一段话全部移指定位数,通过一次次尝试找到目标结果。下面给出相应的代码。

/*凯撒密码(大写)正反向*/
#include <iostream>
#include <string>
using namespace std;
void fun(char a[], int n)
{
    int i = 0;
    while (a[i])
    {
        if (a[i] < 65 || a[i]>90)
        {
            i++;
            continue;
        }
        a[i] = a[i] + n;
        while (a[i] < 65) a[i] = a[i] + 26;
        while (a[i] > 90) a[i] = a[i] - 26;
        i++;
    }
}

int main()
{
    char a[100];
    int n;
    cout << "键入字符串:(最大长度为100000)" << endl;
    cin.getline(a, 100);
    cout << "键入操作数:(正负皆可)" << endl;
    cin >> n;
    fun(a, n);
    int i = 0;
    cout << "变换后字符串为:" << endl;
    while (a[i])
    {
        cout << a[i];
        i++;
    }
    cout << endl;
    return 0;
}

执行一下程序,将需要破译的密文输入,并输入想要检验的操作数,检查结果。

将最后的solution输入到题目下方的文本框并提交,本题通过。


(003)Training:Crypto - Caesar I
https://Mundnaity.moe/post/WeChall-003
作者
申酉和风
发布于
2019-12-19
许可协议