上次讲到密钥容易被试出来的情况,我突然想到把明文(密文)的长度也利用起来,这样每次明文(密文)的长度不同,得到的密文(明文)也不同,是不是就增加了试出密钥的难呢?
void EncodeString(LPCTSTR lpszText, LPTSTR *lpszReturn, LPCTSTR lpszKey)
{
int nTextLen = 0;
char *cPos = NULL;
char *pDest = NULL;
if(lpszReturn) // 加密
{
nTextLen = ::_tcslen(lpszText);
pDest = new char[nTextLen + 3]; // ==\0
}
else // 解密
{
// 查找自定的中止标记
cPos = (LPTSTR)lpszText;
while(true) // 从这里可以看到,除非搜索到我们自定的中止标记,否则会一直搜索下去
{
if(*cPos == '=')
if(cPos[1] == '=')
if(cPos[2] == '\0')
break;
cPos++;
}
if(!cPos) // 没有找到结束标记,也不是加密
return;
nTextLen = cPos - lpszText;
pDest = (LPTSTR)lpszText;
}
int nKeyLen = ::_tcslen(lpszKey);
int i = 0;
int k = 0;
int t = nTextLen;
for(; i < nTextLen; i++)
{
if(lpszReturn) // 加密
{
pDest[i] = lpszText[i] + t;
pDest[i] = pDest[i] ^ lpszKey[k];
}
else // 解密,顺序与加密时相反
{
pDest[i] = lpszText[i] ^ lpszKey[k];
pDest[i] = pDest[i] - t;
}
k++;
t--;
if(k >= nKeyLen)
k = 0;
if(t <= 0)
t = nTextLen;
}
if(!cPos)
{
memcpy(pDest + nTextLen, _T("==\0"), 3 * sizeof(TCHAR));
*lpszReturn = pDest;
}
else
memset(pDest + nTextLen, _T('\0'), sizeof(TCHAR));
}
经过测试,发现作用还不是很明显,需要再改进,如果把每个字符的ASCII值加起来,这样只要有一个不正确都不能
void EncodeString(LPCTSTR lpszText, LPTSTR *lpszReturn, LPCTSTR lpszKey)
{
int nTextLen = 0;
char *cPos = NULL;
char *pDest = NULL;
if(lpszReturn) // 加密
{
nTextLen = ::_tcslen(lpszText);
pDest = new char[nTextLen + 3]; // ==\0
}
else // 解密
{
// 查找自定的中止标记
cPos = (LPTSTR)lpszText;
while(true) // 从这里可以看到,除非搜索到我们自定的中止标记,否则会一直搜索下去
{
if(*cPos == '=')
if(cPos[1] == '=')
if(cPos[2] == '\0')
break;
cPos++;
}
if(!cPos) // 没有找到结束标记,也不是加密
return;
nTextLen = cPos - lpszText;
pDest = (LPTSTR)lpszText;
}
int nKeyLen = ::_tcslen(lpszKey);
int i = 0;
int k = 0;
int t = nTextLen;
int cn = 0;
for(int a = 0; a < nKeyLen; a++) // 将密钥所有值加起来
cn += lpszKey[a];
for(; i < nTextLen; i++)
{
if(lpszReturn) // 加密
{
pDest[i] = lpszText[i] + t;
pDest[i] = pDest[i] ^ lpszKey[k];
pDest[i] = pDest[i] ^ cn;
}
else // 解密,顺序与加密时相反
{
pDest[i] = lpszText[i] ^ cn;
pDest[i] = pDest[i] ^ lpszKey[k];
pDest[i] = pDest[i] - t;
}
k++;
t--;
if(k >= nKeyLen)
k = 0;
if(t <= 0)
t = nTextLen;
}
if(!cPos)
{
memcpy(pDest + nTextLen, _T("==\0"), 3 * sizeof(TCHAR));
*lpszReturn = pDest;
}
else
memset(pDest + nTextLen, _T('\0'), sizeof(TCHAR));
}
测试过发现,只要密钥有一位不对,密文就一点都解不出来。仔细看代码,除了与密钥异或,就只有将密钥字串中所有字符的值的和实用。当然有更好的方法,希望大家能给点建议。
代码下载地址:http://files.cnblogs.com/bllqbz/EncodeString1(2).zip
PS:刚发现C/C++对字串简单进行可逆加密(1)中代码使用不正确,有严重的问题,给您带来麻烦,深感歉意。