QT学习_20_一机一码加密授权

2024-01-09 19:40:17

为保护自己辛苦写出的程序,规避白嫖。通常需要对可执行程序进行加密授权。网上主流的方法是给主程序套壳,但是破解软件网站都快要翻烂了,还是没有找到满足自己需求的套壳软件。索性还是自己写这个加密授权软件。

0、中心思想

  • ?让软件获取此电脑的CPU和MAC地址等信息,然后组合成机器码,每个机器都是独一无二的
  • 添加只有自己才知道的公钥到机器码,与之组合成密码明文
  • 将密码明文用md5或者其他方式加密得到每个机器独一无二的密码
  • 读取注册表中代表本软件密码的参数,如果不匹配则进入授权界面
  • 授权成功后,将密码写入注册表,下一次使用将不再受到约束
  • 根据基于机器码的加密过程(添加只有自己知道的公钥),单独写一个机器码→授权码的授权软件。

1、项目文件和头文件

.pro &?.h

// .pro
QT       += network

// .h
#include <QtNetwork>
#include <QSettings>

2、生成机器码?

// 获取CPU信息
QString mainwindow::get_cpu_id()
{
    QString strCpuId = "";
    unsigned int dwBuf[4] = { 0 };
    unsigned long long ret = 0;

    __cpuid((int*)(void*)dwBuf, 1);

    ret = dwBuf[3];
    ret = ret << 32;

    QString str0 = QString::number(dwBuf[3], 16).toUpper();
    QString str0_1 = str0.rightJustified(8, '0');
    QString str1 = QString::number(dwBuf[0], 16).toUpper();
    QString str1_1 = str1.rightJustified(8, '0');
    strCpuId = str0_1 + str1_1;
    return strCpuId;
}

// 获得独一无二的机器码
QString mainwindow::get_machine_code()
{
    QString cpuid = get_cpu_id();
    QString macid = get_mac_id();
    QString UniqueCode = cpuid + macid;
    QString MachineCode = "";

    for(int i = 0; i < UniqueCode.size(); i++)
    {
        MachineCode = MachineCode + UniqueCode[i];
        if((i+1)%4==0 && i+1!=UniqueCode.size()){
            MachineCode = MachineCode + "-";
        }
    }

    return MachineCode;

}

3、加入公钥

// 加入公钥
QString mainwindow::get_visible_key(){
    QString machinecode = get_machine_code();
    m_str_machine_code = machinecode;
    QString Authorkey1 = "公钥1-自定义";
    QString Authorkey2 = "公钥2-自定义";
    QString ciphertext = Authorkey1+ "-" + machinecode + "-" + Authorkey2;
    return ciphertext;
}

4、用md5加密添加了公钥的组合明文

// 获得加密后的密码
QString mainwindow::get_md5_key(){
    QString ciphertext = get_visible_key();
    QString md5Str = QCryptographicHash::hash(ciphertext.toLatin1(),QCryptographicHash::Md5).toHex();
    return md5Str;
}

5、判断是否授权?


// 初始化判断是否已授权,只调用一次
bool mainwindow::is_authorized(){
    QString md5pwd = get_md5_key();
    m_str_md5_key = md5pwd;
    qDebug() << m_str_md5_key;
    QSettings setting("HKEY_CURRENT_USER\\Software\\自定义注册表的名字", QSettings::NativeFormat);
    QString mypwd = setting.value("自定义参数的名字", "").toString();
    if(mypwd == md5pwd){
        return true;
    }else{
        return false;
    }
}

6、授权成功写入注册表

// 授权成功将信息保存进入注册表
void authorize::save_authorization_info(QString md5_key)
{
    QSettings setting("HKEY_CURRENT_USER\\Software\\自定义注册表的名字", QSettings::NativeFormat);
    setting.setValue("自定义参数的名字", md5_key);
}

软件的授权界面、按钮操作、弹出授权界面和关闭授权界面的逻辑等内容,这些我就不分享了,上面已经提供了最核心的思想和最核心的功能,拿着这些东西就能够实现一机一码加密功能了。? 授权软件要单独写一个,可以说是非常简单,就不赘述了。

最后愿我们共同进步! 感谢您的阅读,欢迎留言讨论、收藏、点赞、分享。?

文章来源:https://blog.csdn.net/heqiunong/article/details/135487013
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。