最近封装算法的SDK给客户使用,领导要求加一个通过读取系统时间来限制客户使用期的功能,于是拙劣的加了一个读取系统时间,并进行MD5加密,与提前写好的MD5库文件进行比对,以验证有效期。
设置有效期,加密并保存成二进制文件:
fstream f;
f.open("configFile", ofstream::app | ios::binary | ofstream::out);
if (!f.is_open())
{
cerr << "file open failed!" << endl;
getchar();
exit(0);
}
for (int i = 20180403; i < 20180431; ++i)//有效期自己设定
{
string s = to_string(i);
unsigned char encrypt[9] = { 0 };
for (int j = 0; j < s.size(); ++j)
{
encrypt[j] = (unsigned char)s[j];
}
encrypt[8] = '\0';
unsigned char decrypt[16];
memset(decrypt, 0, sizeof(decrypt)*sizeof(unsigned char));
MD5Init(&md5);
MD5Update(&md5, encrypt, strlen((char*)encrypt));
MD5Final(&md5, decrypt);
printf("\n加密前:%s\n加密后32位:", encrypt);
for (int ii = 0; ii < 16; ii++)
{
printf("%02x", decrypt[ii]);
f.write((char*)&decrypt[ii], sizeof(decrypt[ii]));
}
}
f.close();
读取系统时间并比对:
#ifdef CHECK_CONFIGFILE
MD5 md5;
time_t t = time(0);
char tmp[9];
strftime(tmp, sizeof(tmp), "%Y%m%d", localtime(&t));
unsigned char decrypt[16];
memset(decrypt, 0, sizeof(decrypt) * sizeof(unsigned char));
MD5Init(&md5);
MD5Update(&md5, (unsigned char*)tmp, strlen((char*)tmp));
MD5Final(&md5, decrypt);
std::fstream f;
f.open("configFile", std::ifstream::in | std::ios::binary);
if (!f.is_open())
{
std::cerr << "configFile open failed!" << std::endl;
getchar();
return FALSE;
}
bool validCode = false;
for (int ii = 0; ; ++ii)
{
unsigned char decrypt0[16] = { 0 };
if (f.peek() == EOF)
{
break;
}
for (int i = 0; i < 16; i++)
{
f.read((char*)&decrypt0[i], sizeof(decrypt0[i]));
//printf("%02x", decrypt0[i]);
}
if (0 == strcmpu(decrypt0, decrypt, 16))
{
validCode = true;
break;
}
}
f.close();
if (!validCode)
{
std::cout << "Detection DLL 超过使用期限";
return FALSE;
}
#endif