加密算法如下:(据说和base64类似)解码代码只要能把"Vba]Wc]eW_<lIn{GzXGZlxSRghc["解成"jianxin007/所罗门之蛇就可以了!"int WINAPI fnEncode6BitBufW(unsigned char *pszSrc, TCHAR *pszDest, int nSrcLen, int nDestLen)
{
int nDestPos = 0;
int nRestCount = 0;
unsigned char chMade = 0, chRest = 0; for (int i = 0; i < nSrcLen; i++)
{
if (nDestPos >= nDestLen) break;
chMade = ((chRest | (pszSrc[i] >> (2 + nRestCount))) & 0x3f);
chRest = (((pszSrc[i] << (8 - (2 + nRestCount))) >> 2) & 0x3f); nRestCount += 2; if (nRestCount < 6)
pszDest[nDestPos++] = chMade + 0x3c;
else
{
if (nDestPos < nDestLen - 1)
{
pszDest[nDestPos++] = chMade + 0x3c;
pszDest[nDestPos++] = chRest + 0x3c;
}
else
pszDest[nDestPos++] = chMade + 0x3c; nRestCount = 0;
chRest = 0;
}
} if (nRestCount > 0)
pszDest[nDestPos++] = chRest + 0x3c; pszDest[nDestPos] = L'\0'; return nDestPos;
}
{
int nDestPos = 0;
int nRestCount = 0;
unsigned char chMade = 0, chRest = 0; for (int i = 0; i < nSrcLen; i++)
{
if (nDestPos >= nDestLen) break;
chMade = ((chRest | (pszSrc[i] >> (2 + nRestCount))) & 0x3f);
chRest = (((pszSrc[i] << (8 - (2 + nRestCount))) >> 2) & 0x3f); nRestCount += 2; if (nRestCount < 6)
pszDest[nDestPos++] = chMade + 0x3c;
else
{
if (nDestPos < nDestLen - 1)
{
pszDest[nDestPos++] = chMade + 0x3c;
pszDest[nDestPos++] = chRest + 0x3c;
}
else
pszDest[nDestPos++] = chMade + 0x3c; nRestCount = 0;
chRest = 0;
}
} if (nRestCount > 0)
pszDest[nDestPos++] = chRest + 0x3c; pszDest[nDestPos] = L'\0'; return nDestPos;
}
Testing Data:
Source String:jianxin007/所罗门之蛇.
Dest String:Vba]Wc]eW_<lIn{GzXGZlxSRghc[
Encryption Routine:
Loop chMade chRest nRestCount Src Dest
1 00011010 00100000 0 Src[0]=01101010 Dest[0] =chMade+0x3c
2 00100110 00100100 2 Src[1]=01101001 Dest[1]=chMade+0x3c
3 00100101 00100001 4 Src[2]=01100001 Dest[2]= chMade+0x3cDest[3]= chRest+0x3c
Since nRestCount=6,now we set ChRest and nRestCount to 0,and restart encryption process…
… …
Accroding to the above table,we can see clearly that:in the first time of loop,chRest:00100000,the 5th and 6th bit(bold part) are equal to the corresponding bits in Src[0],and these two bits are saved to the value—chMade in the second time of loop.Obviously,we can compute chMade with the dest[1],which we have to use to compute src[0].Its expression is: ((Dest[1]-0x3c)<<2)>>6,and this value is the last two bit in Src[0],now we have got Src[0],and in the same way,we can compute Src[1] with chMade,of course,Src[2] needs to be computed with chRest.Now I give the two functions.Good luck!
int WINAPI fnEncode6BitBufW(unsigned char *pszSrc, TCHAR *pszDest, int nSrcLen, int nDestLen)
{
int nDestPos = 0;
int nRestCount = 0;
unsigned char chMade = 0, chRest = 0;
for (int i = 0; i < nSrcLen; i++){
if (nDestPos >= nDestLen) break;
chMade = ((chRest | (pszSrc[i] >> (2 + nRestCount))) & 0x3f);
chRest = (((pszSrc[i] << (8 - (2 + nRestCount))) >> 2) & 0x3f);
nRestCount += 2;
if (nRestCount < 6)
pszDest[nDestPos++] = chMade + 0x3c;
else{
if (nDestPos < nDestLen - 1){
pszDest[nDestPos++] = chMade + 0x3c;
pszDest[nDestPos++] = chRest + 0x3c;
}else
pszDest[nDestPos++] = chMade + 0x3c;//In fact,I think this sentence
//is non-functional.
nRestCount = 0;
chRest = 0;
}
}
if (nRestCount > 0)
pszDest[nDestPos++] = chRest + 0x3c;
pszDest[nDestPos] = L'\0';
return nDestPos;
}
int fnDecode6BitBufW(TCHAR *pszSrc, TCHAR *pszDest, int nSrcLen, int nDestLen)
{
int nDestPos = 0;
int nRestCount = 2;
unsigned char chMade = 0, chRest = 0;
for(int i=0;i<nSrcLen-1;i++){
if(nDestPos>=nDestLen-1)
return -1;/*INSUFFCIENT_BUFFER*/
if(nRestCount<6){
unsigned char m,m1;
m=pszSrc[i]-0x3c;
m=m<<nRestCount;
m1=pszSrc[i+1]-0x3c;
m1=m1<<2;
m1=m1>>(8-nRestCount);
pszDest[nDestPos++]=m|m1;
}else{
int m,m1;
m=pszSrc[i]-0x3c;
m=m<<nRestCount;
m1=pszSrc[i+1]-0x3c;
m1=m1<<2;
m1=m1>>(8-nRestCount);
pszDest[nDestPos++]=m|m1;
i++;
}
if(nRestCount>=6)
nRestCount=2;
else
nRestCount+=2;
}
pszDest[nDestPos]='\0';
return nDestPos;
}