C有没有好用Linux下的的Base64加密的方法?中文加密有问题,编码以后的字符串不能解码,但是数字和英文加密后的字符串没问题,可以解码。
这是我在网上找的方法
char * Encbase64(char * orgdata,unsigned long orglen,unsigned long newlen)
{
charp=NULL,ret=NULL;
int tlen=0;
if (orgdata==NULL|| orglen==0)
return NULL ;
tlen=orglen/3;
if(tlen%3!=0) tlen++;
tlen=tlen4;
newlen=tlen;
if ((ret=(char)malloc(tlen+1))==NULL)
return NULL;
memset(ret,0,tlen+1);
p=orgdata;tlen=orglen;
int i=0,j=0;
while(tlen>0)
{
Udata.c[0]=Udata.c[1]=Udata.c[2]=0;
for (i=0;i<3;i++)
{
if (tlen<1) break;
Udata.c[i]=(char)p;
tlen--;
p++;
}
if (i==0) break;
switch (i)
{
case 1:
/ret[j++]=_Base[Udata.Sdata.d];
ret[j++]=_Base[Udata.Sdata.c];
ret[j++]=_Base[64];
ret[j++]=_Base[64];*/
ret[j++]=_Base[Udata.c[0]>>2];
ret[j++]=_Base[((Udata.c[0]&0x03)<<4)|((Udata.c[1]&0xf0)>>4)];
ret[j++]=_Base[64];
ret[j++]=_Base[64];
break;
case 2:
/*ret[j++]=_Base[Udata.Sdata.d];
ret[j++]=_Base[Udata.Sdata.c];
ret[j++]=_Base[Udata.Sdata.b];
ret[j++]=_Base[64];*/
ret[j++]=_Base[Udata.c[0]>>2];
ret[j++]=_Base[((Udata.c[0]&0x03)<<4)|((Udata.c[1]&0xf0)>>4)];
ret[j++]=_Base[((Udata.c[1]&0x0f)<<2)|((Udata.c[2]&0xc0)>>6)];
ret[j++]=_Base[64];
break;
case 3:
/*ret[j++]=_Base[Udata.Sdata.d];
ret[j++]=_Base[Udata.Sdata.c];
ret[j++]=_Base[Udata.Sdata.b];
ret[j++]=_Base[Udata.Sdata.a];*/
ret[j++]=_Base[Udata.c[0]>>2];
ret[j++]=_Base[((Udata.c[0]&0x03)<<4)|((Udata.c[1]&0xf0)>>4)];
ret[j++]=_Base[((Udata.c[1]&0x0f)<<2)|((Udata.c[2]&0xc0)>>6)];
ret[j++]=_Base[Udata.c[2]&0x3f];
break;
default:
break;
}
}
ret[j]='\0';
return ret;
}
Linux下aa就是调用的上面的方法,编码以后的字符是错的,完全不能解码。