diakla

导航

攻防世界 base64stego【base64伪加密】

一个伪加密https://blog.csdn.net/robacco/article/details/104857151,解压出来是一个base64的txt
base64的编码原理是这样的:
1.把原文转为二进制下的ASCII,八位一组
2.把整串二进制重分组为六位一组,末尾不够的补0,每组转回十进制按照base64加密表转为密文
3.密文个数必须是4的倍数,不够的在后面补=,因为是能被8整除的二进制位数转为能被4*6整除的二进制位数,所以=可能有0~2个
这里补0的个数的二倍等于补=的个数
虽然说是要补0,但是在实际解密的过程中,补的位会被直接删掉,所以补的这些位可以改动而不影响解码结果,取出base64码最后一个字符(不包含=)转成二进制,截取末尾=个数*2的的二进制位拼起来,八个一组转十进制的ASCII再转字符就能得到flag
解隐码的c++代码:

    #include<iostream>
    #include<cstdio>
    #include<string>
    #include<cstring>
    using namespace std;
    const int N=5005;
    int n,a[N],w=0;
    string s[N];
    int bas(int x)
    {
    	if(x>='A'&&x<='Z')
    		return x-65;
    	else if(x>='a'&&x<='z')
    		return x-97+26;
    	else if(x>='0'&&x<='9')
    		return x-48+52;
    	else if(x=='+')
    		return 62;
    	else
    		return 63;
    }
    int main()
    {
    	cin>>s[0];
    	for(int i=1;;i++)
    	{
    		cin>>s[i];
    		if(s[i].length()==0)
    		{
    			n=i;
    			break;
    		}
    	}//cout<<" "<<n<<endl;
    	for(int i=0;i<n;i++)
    	{
    		int m=s[i].length()-1,sm=0;
    		while(s[i][m]=='=')
    			sm++,m--;
    		int x=bas(s[i][m]);
    		// if(sm!=0)
    			// cout<<" "<<x<<endl;
    		if(sm==1)
    			a[w++]=(x>>1)&1,a[w++]=x&1;
    		else if(sm==2)
    			a[w++]=(x>>3)&1,a[w++]=(x>>2)&1,a[w++]=(x>>1)&1,a[w++]=x&1;
    	}
    	for(int i=0;i<w;i+=8)
    	{
    		int x=0;
    		for(int j=0;j<8;j++)
    			x=(x<<1)|a[i+j];//,cout<<a[i+j]<<endl;
    		printf("%c",(char)x);
    	}
    	return 0;
    }

ctf是不是不怎么用c++啊orz滚去学python了……

posted on 2020-09-26 11:55  diakla  阅读(202)  评论(0)    收藏  举报