这个题目是和凯斯密码相关的,可以通过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。
按任意键关闭此窗口. . .