攻防世界 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了……
浙公网安备 33010602011771号