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

正如大多数挑战站点那样,通常会有一些初级的加密加密供您训练,而这其中您经常会碰到这个古老而奇妙的凯撒密码。
我欢迎您来尝试一下这些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