BUUCTF_ACTF新生赛_crypto

classic0

附件里面有三个文件,压缩包有密码,根据hints.txt的提示哼,压缩包的密码?这是小Z童鞋的生日吧==,进行8位数字的爆破,得到密码19990306
BUUCTF_ACTF新生赛_crypto_第1张图片
得到一个C文件,代码是

#include
char flag[25] = ***
int main()
{
	int i;
	for(i=0;i<25;i++)
	{
		flag[i] -= 3;
		flag[i] ^= 0x7;
		printf("%c",flag[i]);
	}
	return 0; 
}
一个flag加密的算法

cipher文件里面的内容就是加密之后的flag,按照上面的思路,写一个解密的代码跑一下就出来了

#include
char flag[25] = "Ygvdmq[lYate[elghqvakl}";
int main()
{
	int i;
	for(i=0;i<25;i++)
	{
	    flag[i] ^= 0x7;
		flag[i] += 3;
		printf("%c",flag[i]);
	}
	return 0;
}

得到actf{my_naive_encrytion}

classic1

附件里面有两个文件,vigenere.zip需要密码,通过hints.txt的内容得到密码circle

hints.txt的内容
哇,这里有压缩包的密码哦,于是我低下了头,看向了我的双手,试图从中找到某些规律
xdfv ujko98 edft54 xdfv pok,.; wsdr43

这里更具这个提示,看下键盘,发现这些都是圈起来某一个字符的,按照顺序来就得到密码了。解压得到文件
BUUCTF_ACTF新生赛_crypto_第2张图片

SRLU{LZPL_S_UASHKXUPD_NXYTFTJT}

压缩包的名字提示是vigenere(维吉尼亚密码),根据ACTF→SRLU,得到密钥SP。
一个C加密解密维吉尼亚密码的的脚本

#include 
void encryption()
{
    int a,b,i=0,j=0;
    char x[100],k[10],y[100];
    printf("请输入密文:");
    gets(x);
    printf("\n");
    printf("请输入密钥:");
    gets(k);
    printf("\n");
    a=strlen(x);
    b=strlen(k);
    strlwr(k);
    if(a>b)
    {
        for(i=0;i<a;i++)
        {
            y[i]=(x[i]+k[j]-97-97)%26+97;
            printf("%c",y[i]);
            j++;
            if(j>=b)
                j=0;
        }
    }
    else
        {
            for(i=0;i<a;i++)
            {
                y[i]=(x[i]+k[j]-97-97)%26+97;
                printf("%c",y[i]);
                j++;
            }
        }
    printf("\n");
}
void decryption()
{
    int a,b,i=0,j=0;
    char x[100],k[10],y[100];
    printf("请输入密文:");
    gets(x);
    printf("\n");
    printf("请输入密钥:");
    gets(k);
    printf("\n");
    a=strlen(x);
    b=strlen(k);
    strlwr(k);
    if(a>b)
    {
        for(i=0;i<a;i++)
        {
            if(x[i]<97)
            {
                y[i]=(x[i]-(k[j]-32)+26)%26+65;
                printf("%c",y[i]);
            }
            else
            {
                y[i]=(x[i]-k[j]+26)%26+97;
                printf("%c",y[i]);
            }
            j++;
            if(j>=b)
                j=0;
        }
    }
    else
    {
        for(i=0;i<a;i++)
        {
            y[i]=(x[i]-k[j]+26)%26+97;
            printf("%c",y[i]);
            j++;
        }
    }
    printf("\n");
}
void main()
{
    int i;
    list:printf("选择是编码还是解码:1.编码 2.解码 3.退出\n");
    scanf("%d",&i);
    getchar();
    switch(i)
    {
    case 1:encryption();
    goto list;
    case 2:decryption();
    goto list;
    case 3:exit(1);
    }
}

跑一下得到flag。

ACTFiWHATPAPCLASSICALPVIGENEREk
把对应的符号改回去就是
ACTF{WHAT_A_CLASSICAL_VIGENERE}

你可能感兴趣的:(BUUCTF_ACTF新生赛_crypto)