其实这题的难度降低了很多,直接告诉了你它的格式,这么一来第二个条件的就没有显得那么的重要了;
首先,看到那么多的数字,第一步就想到的是ASCII解码,直接给出脚本跑一跑就好了:
#include
#include
#define maxsize 100
//author_ZhouYetao
int main()
{
int a[maxsize], b, x;
printf("-----------------------------------------------------\n");
printf("cryptograph:");
for (int i = 0; i < maxsize; i++)
{
scanf_s("%d", &a[i]);
if (a[i] == -1)
{
b = i;
break;
}
}
printf("-----------------------------------------------------\n");
printf("Enter the key:\n");
scanf_s("%d", &x);
for (int i = 0; i < b; i++)
a[i] += x;
printf("-----------------------------------------------------\n");
for (int i = 0; i < b; i++)
printf("%c", a[i]);
printf("\n-----------------------------------------------------\n");
printf("\n\n\n\n\n");
}
因为这里没有牵涉到凯撒加密,所以第二个key值只要输0就可以了;
然后发现输出的是一串并不是很乱的乱码:OCU{CFTELXOUYDECTNGAHOHRNFIENM}IOTA;
通过对其分析,就发现了一些端倪,仔细一看,就发现这个是一个分组的加密,首先判断有几种分组的情况,发现数组一共是35位,那么只能分解成为5*7or7*5的类型,之后的首先需要通过观察,发现前七位“OCU{CFT”可以组成有关“CTF{”的字样,所以就可以断定改串字符串应该是切分成5*7的格式;
确定了切分的格式之后,接下来需要确定的就是排列的格式,这里唯一可以判断的就是第一个中的“CTF{”,和最后一个的“}”两者可以确定顺序,先分组:
OCU { CFT
ELXOUY D
ECTNGAH
OHRNFI E
NM } I OTA
这里的一个问题就是第一个里有两个“C”,所以这里一共有四种情况,所以这里又需要一个脚本去实现,手动的话太容易出错了:
#include
#include
int main()
{
char a[5][7] = { {'O','C','U','{','C','F','T'},{'E','L','X','O','U','Y','D'},{'E','C','T','N','G','A','H'},{'O','H','R','N','F','I','E'},{'N','M','}','I','O','T','A'} };
int b1[7] = { 2,7,6,4,1,5,3/*1*/};
int b2[7] = { 2,7,6,4,5,1,3/*2*/};
int b3[7] = { 5,7,6,4,1,2,3/*3*/};
int b4[7] = { 5,7,6,4,2,1,3/*4*/};
int temp;
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 7; j++)
{
temp = b1[j];
printf("%c", a[i][temp-1]);
}
}
printf("\n");
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 7; j++)
{
temp = b2[j];
printf("%c", a[i][temp - 1]);
}
}
printf("\n");
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 7; j++)
{
temp = b3[j];
printf("%c", a[i][temp - 1]);
}
}
printf("\n");
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 7; j++)
{
temp = b4[j];
printf("%c", a[i][temp - 1]);
}
}
printf("\n");
}
然后就可以得到四个flag:
CTF{OCULDYOEUXCHANEGTHEINOFRMATINO}
CTF{COULDYOUEXCHANGETHEINFORMATION}
CTF{OCUUDYOELXGHANECTFEINOHROATINM}
CTF{COUUDYOLEXGHANCETFEINHOROATIMN}
通过观察,发现第二组的是一句完整的句子,所以得到flag:CTF{COULDYOUEXCHANGETHEINFORMATION}