(1)//如下,字符串加密
inline void SimpleEcryptXOR2(char *value, char cBgnInit, char cEndInit)
{
int len=int(strlen(value));
for(int iRight=0;iRight<len-1;iRight++)
{
if(value[iRight]!=value[iRight+1]) //防止出现空字符
value[iRight]^=value[iRight+1];
}
if(value[len-1]!=cEndInit)value[len-1]^=cEndInit; //如无if,当字串结尾出现与cEndInit相同的字符时,则解密时会形成
乱码
for(int iLeft=len-1;iLeft>0;iLeft--) //对未加密到的部分加密,对加密到的部分再加密
{
if(value[iLeft]!=value[iLeft-1])
value[iLeft]^=value[iLeft-1];
}
if(value[0]!=cBgnInit)value[0]^=cBgnInit; //如无if,当字串开头连续出现两个与cBgnInit相同的字符时,会形成空串
}
//字符串解密
inline void SimpleDecryptXOR2(char *value, char cBgnInit, char cEndInit)
{
int len=int(strlen(value));
if(len>0)
{
if(value[0]!=cBgnInit)value[0]^=cBgnInit;
for(int iRight=0;iRight<len-1;iRight++)
{
if(value[iRight]!=value[iRight+1])
value[iRight+1]^=value[iRight];
}
if(value[len-1]!=cEndInit)value[len-1]^=cEndInit;
for(int iLeft=len-1;iLeft>0;iLeft--)
{
if(value[iLeft]!=value[iLeft-1])
value[iLeft-1]^=value[iLeft];
}
}
}
(2)//对字符串需要注意结束符,不太适用字符串
char strKey[] = {0x03,0x25, 0x45, 0x5F, 0xFA};//你的密钥,长度随你定了
CString szData("你的要加密的数据");
char *pData = szData.GetBuffer(0);
char *p = new char[szData.GetLength()];
int nKeyLen = sizeof(strKey);
for(int i=0; i<szData.GetLength(); i++)
{
*pData = *pData ^ strKey[i%nKeyLen];//每字节与对应的密钥字节进行异或运算
pData++;
}
(3)//此加密方法,采用了变长加宽的办法,可以保证生成的字串在某些编码下合法有效
//映射
unsigned char t; //随机映射到ascii码表
char tCh1,tCh2;
for(int i=0 ;i<len;i++)
{
t=in[i];
if(t<32) //0-31 32个字符
{
tCh1=32+rand()%24;
tCh2=t+(tCh1-32)*4+3;
}
else if(t<127) //31-126 //95个字符
{
tCh1=56+rand()%24;
tCh2=t;
}
else if(t<160) //127-159 //33个字符
{
tCh1=80+rand()%24;
tCh2=t-(tCh1-78)*4-3;
}
else //160-255 //95个字符
{
tCh1=104+rand()%23;
tCh2=t-128;
}
out+=tCh1;
out+=tCh2;
}
//逆映射
char tCh1,tCh2;
unsigned char t;
for(int i=0 ;i<len;i+=2)
{
tCh1=in[i];
tCh2=in[i+1];
if(tCh1<56)t=tCh2-(tCh1-32)*4-3;
else if(tCh1<80)t=tCh2;
else if(tCh1<104)t=tCh2+(tCh1-78)*4+3;
else t=tCh2+128;
out+=t;
}
//与第一种加密方法组合
using namespace std;
inline void SimpleEcryptXOR2(char *in, CString& out,char cBgnInit, char cEndInit)
{
int len=int(strlen(in));
if(len)
{
for(int iRight=0;iRight<len-1;iRight++)
{
if(in[iRight]!=in[iRight+1])
in[iRight]^=in[iRight+1];
}
if(in[len-1]!=cEndInit)in[len-1]^=cEndInit;
for(int iLeft=len-1;iLeft>0;iLeft--)
{
if(in[iLeft]!=in[iLeft-1])
in[iLeft]^=in[iLeft-1];
}
if(in[0]!=cBgnInit)in[0]^=cBgnInit;
unsigned char t; //随机映射到ascii码表
char tCh1,tCh2;
for(int i=0 ;i<len;i++)
{
t=in[i];
if(t<32) //0-31 32个字符
{
tCh1=32+rand()%24;
tCh2=t+(tCh1-32)*4+3;
}
else if(t<127) //31-126 //95个字符
{
tCh1=56+rand()%24;
tCh2=t;
}
else if(t<160) //127-159 //33个字符
{
tCh1=80+rand()%24;
tCh2=t-(tCh1-78)*4-3;
}
else //160-255 //95个字符
{
tCh1=104+rand()%23;
tCh2=t-128;
}
out+=tCh1;
out+=tCh2;
}
}
}
inline void SimpleDecryptXOR2(char *in, CString& out,char cBgnInit, char cEndInit)
{
int len=int(strlen(in));
if(len>0)
{
char tCh1,tCh2;
unsigned char t;
for(int i=0 ;i<len;i+=2)
{
tCh1=in[i];
tCh2=in[i+1];
if(tCh1<56)t=tCh2-(tCh1-32)*4-3;
else if(tCh1<80)t=tCh2;
else if(tCh1<104)t=tCh2+(tCh1-78)*4+3;
else t=tCh2+128;
out+=t;
}
char* value=out.GetBuffer(0);
len=int(strlen(value));
if(len>0)
{
if(value[0]!=cBgnInit)value[0]^=cBgnInit;
for(int iRight=0;iRight<len-1;iRight++)
{
if(value[iRight]!=value[iRight+1])
value[iRight+1]^=value[iRight];
}
if(value[len-1]!=cEndInit)value[len-1]^=cEndInit;
for(int iLeft=len-1;iLeft>0;iLeft--)
{
if(value[iLeft]!=value[iLeft-1])
value[iLeft-1]^=value[iLeft];
}
}
}
}