天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 67|回复: 0

自己编写c++代码对软件加密

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
对一个自己开发的程序进行加密,主要思路是先获取目标机器的机器码(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]

 

 

 

 

自己编写c++代码对软件加密
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

GMT+8, 2024-11-1 12:36 , Processed in 0.130398 second(s), 28 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表