实验吧--密码学--古典密码

其实这题的难度降低了很多,直接告诉了你它的格式,这么一来第二个条件的就没有显得那么的重要了;

首先,看到那么多的数字,第一步就想到的是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}

你可能感兴趣的:(实验吧实验吧)