很好的C++加密算法

  • 格式:doc
  • 大小:27.50 KB
  • 文档页数:3

很好的C++加密算法
优点就是同一个源文件,通过同一个密匙加密后得到的密文不相同。这样增加了
破译难度。

#include
#include
#include

char* substr(const char* _str, int pos, int len)
{
static char ptr[10];

memcpy(ptr, _str+pos-1, len);
ptr[len] = '\0';

return ptr;
}

//加密函数
string EncrypKey(const char* src, const char* key)
{
int KeyPos = -1;
int SrcPos = 0;
int SrcAsc = 0;
time_t t;

int KeyLen = strlen(key);
if(KeyLen == 0)
return "";

srand((unsigned) time(&t));
int offset = rand() % 255;

char buff[3];
sprintf(buff, "%1.2x", offset);
string dest = buff;

for(int i = 0; i < strlen(src); i++)
{
SrcAsc = (src[i] + offset) % 255;

if (KeyPos < KeyLen-1)
KeyPos++;
else
KeyPos = 0;

SrcAsc = SrcAsc ^ key[KeyPos];
memset(buff, 0, sizeof(buff));
sprintf(buff, "%1.2x", SrcAsc);
dest = dest + (string)buff;

offset = SrcAsc;
}
return dest;
}

//解密函数
string UncrypKey(const char* src, const char* key)
{
int KeyLen = strlen(key);
if(KeyLen == 0)
return "";

int KeyPos = -1;
int offset = 0;
string dest = "";
int SrcPos = 0;
int SrcAsc = 0;
int TmpSrcAsc = 0;

char buff[5];
sprintf(buff, "0x%s", substr(src, 1, 2));
sscanf(buff, "%x", &offset);
SrcPos = 3;
while(SrcPos <= strlen(src))
{
sprintf(buff, "0x%s", substr(src, SrcPos, 2));
sscanf(buff, "%x", &SrcAsc);
if (KeyPos < KeyLen-1)
KeyPos++;
else
KeyPos = 0;

TmpSrcAsc = SrcAsc ^ key[KeyPos];
if (TmpSrcAsc <= offset)
TmpSrcAsc = 255 + TmpSrcAsc - offset;
else
TmpSrcAsc = TmpSrcAsc - offset;

dest += char(TmpSrcAsc);
offset = SrcAsc;
SrcPos = SrcPos + 2;
}

return dest;
}