C/C++对字串简单进行可逆加密(2)

上次讲到密钥容易被试出来的情况,我突然想到把明文(密文)的长度也利用起来,这样每次明文(密文)的长度不同,得到的密文(明文)也不同,是不是就增加了试出密钥的难呢?

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));
}

测试过发现,只要密钥有一位不对,密文就一点都解不出来。仔细看代码,除了与密钥异或,就只有将密钥字串中所有字符的值的和实用。当然有更好的方法,希望大家能给点建议。

代码下载地址:https://files.cnblogs.com/bllqbz/EncodeString1(2).zip

PS:刚发现C/C++对字串简单进行可逆加密(1)中代码使用不正确,有严重的问题,给您带来麻烦,深感歉意。


posted on 2011-08-29 11:23  zimmerk  阅读(2596)  评论(5编辑  收藏  举报

导航