很久没写了,忙完了结婚就一直在忙TopSpin4,现在得点空了,要好好补一补,先从简单的开始~

前一段时间工作上需要,用到了个简单的加密方法,在这里记录一下算法,权作笔记:

加密

// strSrc为源码, strKey为附加码
CString Encrypt(const CString& strSrc, CString strKey)
{
	int nKeyLen = strKey.GetLength();
	if (nKeyLen == 0)
		strKey = _T("XXXXXX"); // 如果附加码为空

	srand((unsigned)time(NULL));
	int nRange = 256;
	int nOffset = (rand() % nRange);
	CString strDest = _T("");
	strDest.Format("%1.2x", nOffset); // 第一字符为随机码

	int nSrcAsc = 0;
	int nKeyPos = 0;
	for (int nSrcPos = 0; nSrcPos < strSrc.GetLength(); nSrcPos++)
	{
		int n = strSrc[nSrcPos];
		nSrcAsc = (strSrc[nSrcPos] + nOffset) % 255;
		if (nKeyPos < nKeyLen-1 )
			nKeyPos += 1;
		else
			nKeyPos = 1;
		nSrcAsc = nSrcAsc ^ strKey[nKeyPos]; // 附加码影响
		CString strTemp = _T("");
		strTemp.Format("%1.2x", nSrcAsc);
		strDest += strTemp;
		nOffset = nSrcAsc; // 依次影响后面的编码
	}
	return strDest; // 加密后长度为2n+2
}

解密

// strSrc为目标码, strKey为附加码, 须一致 
CString Decrypt(const CString& strSrc, CString strKey)
{
	int nKeyLen = strKey.GetLength();
	if (nKeyLen == 0)
		strKey = _T("XXXXXX"); // 如果附加码为空

	char *stopstring;
	int nOffset = strtoul(strSrc.Mid(0,2), &stopstring, 16); // 去处第一个随机码 
	int nSrcPos = 2;
	int nSrcAsc = 0;
	int nKeyPos = 0;
	int nTempSrcAsc = 0;
	CString strDest;
	do
	{
		nSrcAsc = strtoul(strSrc.Mid(nSrcPos,2), &stopstring, 16); // 依次取出每一位码 
		//if (nSrcAsc == 0) break;
		if (nKeyPos < nKeyLen-1)
		{
			nKeyPos += 1;
		}
		else
		{
			nKeyPos = 1;
		}
		nTempSrcAsc = nSrcAsc ^ strKey[nKeyPos]; // 异或附加码 
		if (nTempSrcAsc <= nOffset) // 解码 
		{
			nTempSrcAsc = 255 + nTempSrcAsc – nOffset;
		}
		else
		{
			nTempSrcAsc -= nOffset;
		}
		CString strTemp;
		strTemp.Format("%c",nTempSrcAsc);
		strDest += strTemp;
		nOffset = nSrcAsc;
		nSrcPos += 2;
	} while (nSrcPos <= strSrc.GetLength());
	strDest=strDest.Mid(0,(strSrc.GetLength()-2)/2); 
	return strDest;
}