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

对一个自己开发的程序进行加密,主要思路是先获取目标机器的机器码(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;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值