|
对一个自己开发的程序进行加密,主要思路是先获取目标机器的机器码(mac地址或者cpu的序列号)。然后写一个简单的加密算法对机器码进行加密,并输出一个license文件。自己开发的程序就读取目标机器码,并读取license文件解码成机器码,看两者是否相符合,不符合则退出程序。这里只给了mac地址的代码,但是mac地址是可以伪装修改的,对于电脑不是唯一的安全性。用cpu序列号更好,可以自己百度下例子。
获得目标的mac地址
void GetMac(std::vector < std::string >& vMac)
{
vMac.clear();
char data[4096];
ZeroMemory(data, 4096);
unsigned long len = 4000;
PIP_ADAPTER_INFO pinfo = (PIP_ADAPTER_INFO)data;
DWORD ret = GetAdaptersInfo(pinfo, &len);
if (ret != ERROR_SUCCESS)
return;
while (pinfo)
{
if (pinfo->Type == MIB_IF_TYPE_ETHERNET)
{
char sbuf[20];
std::string sret;
for (int k = 0; k < 5; k++)
{
sprintf(sbuf, "%02X-", pinfo->Address[k]);
sret += sbuf;
}
sprintf(sbuf, "%02X", pinfo->Address[5]);
sret += sbuf;
vMac.push_back(sret);
}
pinfo = pinfo->Next;
}
}
#define C1 52845
#define C2 22719
WORD key = 1314;
string Encrypt(string S, WORD Key) // 加密函数
{
string Result, str;
int i, j;
Result = S; // 初始化结果字符串
for (i = 0; i < S.length(); i++) // 依次对字符串中各字符进行操作
{
Result[i] = S[i] ^ (Key >> 8); // 将密钥移位后与字符异或
Key = ((BYTE)Result[i] + Key)*C1 + C2; // 产生下一个密钥
}
S = Result; // 保存结果
Result = ""; // 清除结果
for (i = 0; i < S.length(); i++) // 对加密结果进行转换
{
j = (BYTE)S[i]; // 提取字符
// 将字符转换为两个字母保存
str = "12"; // 设置str长度为2
str[0] = 65 + j / 26;//这里将65可以改为其他值,产生不同的效果,相应的,解密处要改为相同的数
str[1] = 65 + j % 26;
Result += str;
}
return Result;
}
string Decrypt(string S, WORD Key) // 解密函数
{
string Result, str;
int i, j;
Result.empty(); // 清除结果
for (i = 0; i < S.length() / 2; i++) // 将字符串两个字母一组进行处理
{
j = ((BYTE)S[2 * i] - 65) * 26;//相应的,解密处要改为相同的数
j += (BYTE)S[2 * i + 1] - 65;
str = "1"; // 设置str长度为1
str[0] = j;
Result += str; // 追加字符,还原字符串
}
S = Result; // 保存中间结果
for (i = 0; i < S.length(); i++) // 依次对字符串中各字符进行操作
{
Result[i] = (BYTE)S[i] ^ (Key >> 8); // 将密钥移位后与字符异或
Key = ((BYTE)S[i] + Key)*C1 + C2; // 产生下一个密钥
}
return Result;
}
[code]原文链接:https://blog.csdn.net/qq_19408603/article/details/117525135[/code] |
|