buuctf.crypto.看我回旋踢

发布时间 2023-03-23 20:30:41作者: redqx

这个题目是和凯斯密码相关的,可以通过flag的一些标志来判断
首先我们得到的数据是

synt{5pq1004q-86n5-46q8-o720-oro5on0417r1}

其中synt是flag在字母表中右移动13位的结果,如果移动多了就往回移动
比如26个字母,第25位移动到哪里去? (25+13)%26=12

其中字符串表

char t[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789{}-";

该加密算法只对字母移位,对非字母不管,比如-,{},0-9就不管
然后就是写一个C语言代码模拟一些这个过程了
运行环境: vs2022 x86 debug模式

#include<stdio.h> 
#include<string.h>

void table2index(char* t, char* input, int ilen)
{
	int tlen = strlen(t);
	int i = 0;
	int j = 0;
	for (i = 0; i < ilen; i++)
	{
		for (j = 0; j < tlen; j++)
		{
			if (input[i] == t[j])
			{
				input[i] = (char)j;
				break;
			}
		}
	}
	return;
}
void index2table(char* t, char* input, int ilen)
{
	int i = 0;
	for (i = 0; i < ilen; i++)
	{
		input[i] = t[input[i]];
	}
	return;
}
void fenc(char* t, char* input)
{
	//13位
	//右移5位,然后看最后一位
	int i = 0;
	int ilen = strlen(input);
	table2index(t, input, ilen);
	for (i = 0; i < ilen; i++)
	{
		if (input[i] >= 0 && input[i] <= 2 * 26 - 1)//是字母
		{
			if (input[i] < 26)//大写 
			{
				input[i] = (input[i] + 13) % 26;
			}
			else//小写 
			{
				input[i] = 26 + (input[i] + 13) % 26;
				//input[i] = 26 + (input[i] -26 +  13) % 26;
			}
		}
	}
	index2table(t, input, ilen);
}
void fdec(char* t, char* input)
{
	//13位
	//右移5位,然后看最后一位
	int i = 0;
	int ilen = strlen(input);
	table2index(t, input, ilen);
	for (i = 0; i < ilen; i++)
	{
		if (input[i] >= 0 && input[i] <= 2 * 26 - 1)//是字母
		{ 
			if (input[i] < 26)//大写 
			{
				input[i] = (input[i] + 13) % 26;
			}
			else//小写 
			{
				input[i] = 26 + (input[i] -13) % 26;
				//input[i] = 26 + (input[i] -26 +  13) % 26;
			}
		}
	}
	index2table(t, input, ilen);
}
int main()
{
	char t[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789{}-";
	//char input[] = "flag{5cd1004d-86a5-46d8-b720-beb5ba0417e1}";
	char encdata[] = "synt{5pq1004q-86n5-46q8-o720-oro5on0417r1}";

	fdec(t, encdata);
	printf("%s\n", encdata);
	fenc(t, encdata);
	printf("%s\n", encdata);
	return 0;
}

flag{5cd1004d-86a5-46d8-b720-beb5ba0417e1}
synt{5pq1004q-86n5-46q8-o720-oro5on0417r1}

E:\C\2022\C1\Debug\C1.exe (进程 20420)已退出,代码为 0。
按任意键关闭此窗口. . .