16,472
社区成员
发帖
与我相关
我的任务
分享
//解密算法
CString CToolManagementView::Decrypt_Ex(LPCTSTR lpszSrc) // 解密函数
{
ASSERT(lpszSrc != NULL && AfxIsValidString(lpszSrc));
const unsigned int BASE64_DECODE_TABLE[256] = {
255, 255, 255, 255, 255, 255, 255, 255, // 00 - 07
255, 255, 255, 255, 255, 255, 255, 255, // 08 - 15
255, 255, 255, 255, 255, 255, 255, 255, // 16 - 23
255, 255, 255, 255, 255, 255, 255, 255, // 24 - 31
255, 255, 255, 255, 255, 255, 255, 255, // 32 - 39
255, 255, 255, 62, 255, 255, 255, 63, // 40 - 47
52, 53, 54, 55, 56, 57, 58, 59, // 48 - 55
60, 61, 255, 255, 255, 255, 255, 255, // 56 - 63
255, 0, 1, 2, 3, 4, 5, 6, // 64 - 71
7, 8, 9, 10, 11, 12, 13, 14, // 72 - 79
15, 16, 17, 18, 19, 20, 21, 22, // 80 - 87
23, 24, 25, 255, 255, 255, 255, 255, // 88 - 95
255, 26, 27, 28, 29, 30, 31, 32, // 96 - 103
33, 34, 35, 36, 37, 38, 39, 40, // 104 - 111
41, 42, 43, 44, 45, 46, 47, 48, // 112 - 119
49, 50, 51, 255, 255, 255, 255, 255, // 120 - 127
255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255 };
const int nSrcCount = (int)_tcslen(lpszSrc);
int nSize = nSrcCount / 4 * 3;
if (lpszSrc[nSrcCount - 1] == '=')
nSize--;
if (lpszSrc[nSrcCount - 2] == '=')
nSize--;
char* pOutBuffer = new char[nSize + 3];
ZeroMemory(pOutBuffer, nSize + 3);
LPCTSTR pInBuffer = lpszSrc;
UINT iTest, iPack;
for (int i = 0; i<nSize / 3; i++)
{
for (int j = 0; j<4; j++)
{
iTest = BASE64_DECODE_TABLE[*pInBuffer++]; // Read from InputBuffer.
//InPtr++;
if (iTest == 0xFF)
{
j--;
continue; //读到255非法字符
}
iPack = iPack << 6;
iPack = iPack | iTest;
}
pOutBuffer[2] = iPack;
iPack = iPack >> 8;
pOutBuffer[1] = iPack;
iPack = iPack >> 8;
pOutBuffer[0] = iPack;
//准备写入后3位
pOutBuffer += 3; iPack = 0;
}
switch (nSize % 3)
{
case 1:
iTest = BASE64_DECODE_TABLE[*pInBuffer++]; // Read from InputBuffer.
if (iTest != 0xFF)
{
iPack = iPack << 6;
iPack = iPack | iTest;
}
iTest = BASE64_DECODE_TABLE[*pInBuffer++]; // Read from InputBuffer.
if (iTest != 0xFF)
{
iPack = iPack << 6;
iPack = iPack | iTest;
}
iPack = iPack >> 4;
pOutBuffer[0] = iPack;
pOutBuffer++;
break;
case 2:
iTest = BASE64_DECODE_TABLE[*pInBuffer++]; // Read from InputBuffer.
if (iTest != 0xFF)
{
iPack = iPack << 6;
iPack = iPack | iTest;
}
iTest = BASE64_DECODE_TABLE[*pInBuffer++]; // Read from InputBuffer.
if (iTest != 0xFF)
{
iPack = iPack << 6;
iPack = iPack | iTest;
}
iTest = BASE64_DECODE_TABLE[*pInBuffer++]; // Read from InputBuffer.
if (iTest != 0xFF)
{
iPack = iPack << 6;
iPack = iPack | iTest;
}
iPack = iPack >> 2;
pOutBuffer[1] = iPack;
iPack = iPack >> 8;
pOutBuffer[0] = iPack;
pOutBuffer += 2;
break;
default:
break;
}
pOutBuffer -= nSize;
CString strDecode = pOutBuffer;
delete pOutBuffer; //这里编译不过
return strDecode;
}