zoukankan      html  css  js  c++  java
  • Qt开源作品35-秘钥生成器

    一、前言

    在很多商业软件中,需要提供一些可以试运行的版本,这样就需要配套密钥机制来控制,纵观大部分的试用版软件,基本上采用以下几种机制来控制。

    • 远程联网激活,每次启动都联网查看使用时间等,这种方法最完美,缺点是没法联网的设备就歇菜了。
    • 通过获取本地的硬盘+CPU等硬件的编号,做一个运算,生成一个激活码,超过半数的软件会采用此方法,缺点是不能自由控制软件的其他参数,比如软件中添加的设备数量的控制。
    • 设定一个运行到期时间+数量限制+已运行时间的密钥文件,发给用户配套软件使用,缺点是如果仅仅设置的是运行到期时间,用户可以更改电脑时间来获取更长的使用时间,在电脑不联网的情况下。
      本demo采用抛砖引玉的形式,用第三种方法来实现,密钥文件采用最简单的异或加密,可以自行改成其他加密方法。

    二、代码思路

    QString frmMain::getWMIC(const QString &cmd)
    {
        //获取cpu名称:wmic cpu get Name
        //获取cpu核心数:wmic cpu get NumberOfCores
        //获取cpu线程数:wmic cpu get NumberOfLogicalProcessors
        //查询cpu序列号:wmic cpu get processorid
        //查询主板序列号:wmic baseboard get serialnumber
        //查询BIOS序列号:wmic bios get serialnumber
        //查看硬盘:wmic diskdrive get serialnumber
        QProcess p;
        p.start(cmd);
        p.waitForFinished();
        QString result = QString::fromLocal8Bit(p.readAllStandardOutput());
        QStringList list = cmd.split(" ");
        result = result.remove(list.last(), Qt::CaseInsensitive);
        result = result.replace("
    ", "");
        result = result.replace("
    ", "");
        result = result.simplified();
        return result;
    }
    
    QString frmMain::getCpuName()
    {
        return getWMIC("wmic cpu get name");
    }
    
    QString frmMain::getCpuId()
    {
        return getWMIC("wmic cpu get processorid");
    }
    
    QString frmMain::getDiskNum()
    {
        return getWMIC("wmic diskdrive where index=0 get serialnumber");
    }
    
    QString frmMain::getXorEncryptDecrypt(const QString &data, char key)
    {
        //采用异或加密,也可以自行更改算法
        QByteArray buffer = data.toLatin1();
        int size = buffer.size();
        for (int i = 0; i < size; i++) {
            buffer[i] = buffer.at(i) ^ key;
        }
    
        return QLatin1String(buffer);
    }
    
    void frmMain::on_btnOk_clicked()
    {
        bool useDate = ui->ckDate->isChecked();
        bool useRun = ui->ckRun->isChecked();
        bool useCount = ui->ckCount->isChecked();
    
        if (!useDate && !useRun && !useCount) {
            if (QMessageBox::question(this, "询问", "确定要生成没有任何限制的密钥吗?") != QMessageBox::Yes) {
                return;
            }
        }
    
        QString strDate = ui->dateEdit->date().toString("yyyy-MM-dd");
        QString strRun = ui->cboxMin->currentText();
        QString strCount = ui->cboxCount->currentText();
        QString key = QString("%1|%2|%3|%4|%5|%6").arg(useDate).arg(strDate).arg(useRun).arg(strRun).arg(useCount).arg(strCount);
    
        QFile file(QApplication::applicationDirPath() + "/key.db");
        file.open(QFile::WriteOnly | QIODevice::Text);
        file.write(getXorEncryptDecrypt(key, 110).toLatin1());
        file.close();
        QMessageBox::information(this, "提示", "生成密钥成功,将 key.db 文件拷贝到对应目录即可!");
    }
    

    三、效果图

    四、开源主页

    以上作品完整源码下载都在开源主页,会持续不断更新作品数量和质量,欢迎各位关注。

    1. 国内站点:https://gitee.com/feiyangqingyun/QWidgetDemo
    2. 国际站点:https://github.com/feiyangqingyun/QWidgetDemo
    3. 个人主页:https://blog.csdn.net/feiyangqingyun
    4. 知乎主页:https://www.zhihu.com/people/feiyangqingyun/
  • 相关阅读:
    Binary Tree Inorder Traversal
    Populating Next Right Pointers in Each Node
    Minimum Depth of Binary Tree
    Majority Element
    Excel Sheet Column Number
    Reverse Bits
    Happy Number
    House Robber
    Remove Linked List Elements
    Contains Duplicate
  • 原文地址:https://www.cnblogs.com/feiyangqingyun/p/13155711.html
Copyright © 2011-2022 走看看