vc简单加密字符串

来源:互联网 发布:wifi万能钥匙软件下载 编辑:程序博客网 时间:2024/05/17 09:19

(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];
   }
  }
 }
}

原创粉丝点击