一、题目
二、思路
大帝的密码武器,以及题目中的罗马三巨头之一,由此可以联想到凯撒密码。
思路清晰,现在只需找到加密向量即可。
三、结果
#include<iostream>
#include<string>
using namespace std;
int main()
{
string a;//密文
string b=a;//存放明文
cout<<"要破解的密文:";
getline(cin,a);
int k; //未知密钥
//根据凯撒加密算法知明文有25种可能性,密钥为0时,就是本身,所以不算里面了
//暴力列出所有的25种情况
cout<<"所有可能的明文:"<<endl;
for(k=1;k<26;k++)
{
cout<<"密钥K="<<k<<"时:" ;
for(int i=0;i<a.length();i++)
{
if(a[i]!=' ')
{ //相减过程怕会出现负数,所以需要先“+26”操作再取余
if(a[i]>='a' && a[i]<='z') cout<<char((a[i]-k-'a'+26)%26+'a');
if(a[i]>='A' && a[i]<='Z') cout<<char((a[i]-k-'A'+26)%26+'A');
}
if(a[i]==' ') cout<<" ";
}
cout<<endl;
}
}
由图可看出,当密钥K=13时,明文为security。
#include "stdio.h"
#include "conio.h"
//程序流程:输入明文(小写字母)和密钥(1-25),输出正确的密文
// 接着对加密结果输入密钥(1-25),输出原来的明文
main()
{
int k,i=0;
char a[100],b[100]={0};
printf("请输入明文(小写字母):\n");
gets(a);
printf("请输入加密密钥(1-25):\n");
scanf("%d",&k);
//do-while循环里的代码运行时时好时坏,你能发现为什么吗?
do{
b[i]=(char)(a[i]+k);//后移k
if(b[i]>122) //如果大于122(z的ascii码)
b[i]=(char)(b[i]-26); //通过减26实现字母表的循环
i++;
}while(a[i]!='\0');
printf("密文为:\n");
puts(b);
}
最终得到PbzrPuvan,用花括号包起来就可以提交了flag{PbzrPuvan}