BUUCTF_ACTF新生赛_crypto

classic0

附件里面有三个文件,压缩包有密码,根据hints.txt的提示哼,压缩包的密码?这是小Z童鞋的生日吧==,进行8位数字的爆破,得到密码19990306

得到一个C文件,代码是

#include<stdio.h>
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<stdio.h>
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

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

SRLU{LZPL_S_UASHKXUPD_NXYTFTJT}

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

#include <stdio.h>
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}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值