#include "pass.h"
static char HexArray[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
/***************************Encode132***********/
/* Future: 将一个字符串按一定算法进行加密 */
/* Input: char *sIn: 要加密的字符串 */
/* 每个字符会产生3位 */
/* Output: char *sOut: 加密后的字符串 */
/* ********************************************/
void Encode132(char *sIn,char *sOut)
{
int iRan,iPos;
unsigned i;
char bAscii,bTemp;
char Result[100];
if(strlen(sIn)==0)
{
strcpy(sOut,"");
return;
}
memset(Result,0,100);
srand(time(NULL));
iRan=rand()%4;
iPos=0;
for(i=0;i<strlen(sIn);i++)
{
bAscii=sIn[i];
bTemp=bAscii;
bTemp=bTemp >> 5; //取第5高位
Result[iPos++]=HexArray[bTemp];
bTemp=bAscii;
bTemp=(bTemp & 0x1C) >> 2; /* 1C是11100,再右移2位,即取中间3位*/
Result[iPos++]=HexArray[bTemp];
bTemp=bAscii;
bTemp=bTemp & 3; /* 3是0x11,即取最后2位*/
bTemp=iRan*4+bTemp; //虽然加了随机数,由于*4,即是加在第3位上,所以不影响,仅起迷惑作用。
Result[iPos++]=HexArray[bTemp];
}
Result[iPos++]=iRan+0x30; //最后再加一位迷惑位
Result[iPos]='\0';
strcpy(sOut,Result);
}
/***************************Decode132***********/
/* Future: 将一个字符串按一定算法进行加密 */
/* Input: char *sIn: 要解密的字符串 */
/* Output: char *sOut: 解密后的字符串 */
/* ********************************************/
void Decode132(char *sIn,char *sOut)
{
unsigned i,j,iPos;
char bAscii;
char Result[100];
if (strlen(sIn)<4)
{
strcpy(sOut,"");
return;
}
i=0;
memset(Result,0,100);
iPos=0;
while (1)
{
j=0;
while (1)
{
if (sIn[i+2]==HexArray[j]) break;
j++;
if (j>=16)
{
strcpy(sOut,"");
return;
}
}
bAscii=(sIn[i]-0x30)*32+(sIn[i+1]-0x30)*4+(j & 3);
Result[iPos++]=bAscii;
i+=3;
if ((i+1)>=strlen(sIn)) break;
}
Result[iPos]='\0';
strcpy(sOut,Result);
}
/***************************LicenseCheck*******/
/* Future: 判断一个可执行程序是否经过许可认证 */
/* Input: char *strProgramName: 程序名 */
/* Return: -1: 程序名.key 文件不存在� */
/* -2: 程序名.key 文件内容不对,非法运 */
/* 1: 可以使用 */
/* ********************************************/
int LicenseCheck( char *strProgramName )
{
char strLisenceFile[200]={NULL};
char strCommandLine[200]={NULL};
char strFileNetAddress[200]={NULL};
char strFactNetAddress[200]={NULL};
char strTmpFile[200]={NULL};
char strLine[200];
char strTmpString[200]={NULL};
char strDecodeAddress[200]={NULL};
int rtn, len;
FILE *fpLisenceFile;
FILE *fpTmp;
sprintf(strLisenceFile, "%s.key", strProgramName);
fpLisenceFile = fopen( strLisenceFile, "r");
if(fpLisenceFile == NULL )
return NOLICENSE;
fscanf(fpLisenceFile, "%s", strFileNetAddress);
fclose(fpLisenceFile);
len = strlen(strFileNetAddress);
if((strFileNetAddress[len-2] == 0x0d) && (strFileNetAddress[len-1] == 0x0a))
strFileNetAddress[len-2] = 0; //防止文件传送时加上回车换行
sprintf(strTmpFile, "%s.tmp", strProgramName);
sprintf(strCommandLine, "ifconfig -a|grep ether >%s", strTmpFile);//获得网卡物理地址到临时文件中
rtn = system(strCommandLine);
if (rtn < 0)
return OTHER_ERROR;
fpTmp = fopen(strTmpFile, "r");
if(fpTmp == NULL)
return OTHER_ERROR;
fgets(strLine, sizeof(strLine), fpTmp);
sscanf( strLine, "%s%s", strTmpString, strFactNetAddress);
fclose(fpTmp);
unlink(strTmpFile);
Decode132(strFileNetAddress, strDecodeAddress);
if(strcmp(strFactNetAddress, strDecodeAddress) == 0)
return LICENSE_CORRECT;
else
return LICENSE_UNCORRECT;
}