参考一
自研软件为了防止被人任意复制传播,需要设置注册使用模式。基本原理:通过计算机的特异性编号,加上自己的编码,使用加密算法算出一个生成码。
一、计算机的特异性编号
硬盘的编号:最后一块硬盘的编号就行(有些计算机可能有多块硬盘);
CPU的编号;
网卡的编号;最后一块网卡的MAC地址就行;
BIOS的编号;
获取系统的安装日期;
1.1 函数示例
#include <QProcess>
QString getWMIC(const QString &cmd)
{
//获取硬盘的序列号:wmic diskdrive get serialnumber
//获取cpu的序列号:wmic cpu get processorid
//获取网卡的MAC地址:wmic nicconfig get macaddress
//查询BIOS序列号:wmic bios get serialnumber
//查询操作系统安装时间:wmic os get installdate
//QString cmd="wmic cpu get processorid";
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("\r", "");
result = result.replace("\n", "");
result = result.simplified();
return result;
}
1.2 工程化处理
获取的这些序列号都很长,而且不同windows版本的电脑,wmic命令可能不同,所以需要进行工程化处理。
(1)各类序列号只取最后一块的;
(2)各类序列号只取后4位,但是:MAC地址取后2位,系统安装时间取前8位;
(3)对于无效查询,将其跳过,但是:如果所有的查询都无效,直接禁止使用软件。
1.3 示例代码
//函数:读取计算机硬件信息
QString KeyGen::GetPCMsg(void)
{
//获取硬盘的序列号:wmic diskdrive get serialnumber
QString tempStr=getWMIC("wmic diskdrive get serialnumber");
QString pwd1 = tempStr.right(4); // 截取字符串的右边字符
//获取cpu的序列号:wmic cpu get processorid
tempStr=getWMIC("wmic cpu get processorid");
QString pwd2 = tempStr.right(4); // 截取字符串的右边字符
//获取网卡的MAC地址:wmic nicconfig get macaddress
tempStr=getWMIC("wmic nicconfig get macaddress");
QString pwd3 = tempStr.right(2); // 截取字符串的右边字符
//查询BIOS序列号:wmic bios get serialnumber
tempStr=getWMIC("wmic bios get serialnumber");
QString pwd4 = tempStr.right(4); // 截取字符串的右边字符
//查询操作系统安装时间:wmic os get installdate
tempStr=getWMIC("wmic os get installdate");
QString pwd5 = tempStr.left(8); // 截取字符串的右边字符
return pwd1+pwd2+pwd3+pwd4+pwd5;
}
二、加密算法
使用Qt自带的MD5算法。
#include <QCryptographicHash>//加密所需
// MD5 加密
QString MD5_encryption(const QString &data)
{
QCryptographicHash md5(QCryptographicHash::Md5); //使用MD5加密
md5.addData(data.toUtf8(),data.size()); // 添加数据
QByteArray bArry = md5.result(); //获取MD5加密后的密码
QString md5_data;
md5_data.append(bArry.toHex());
return md5_data;
}
三、验证是否注册
验证注册号:读取ini文件,和程序计算的结果进行对比。
3.1 main.cpp文件
#pragma execution_character_set("utf-8")
#include "mainwindow.h"
#include <QApplication>
#include "keygen.h"
#include <QMessageBox>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
if(KeyGen::verifyKey())
{
//验证成功
w.show();
return a.exec();
}else{
//验证不成功
QMessageBox::warning(NULL, "警告","该软件还未注册,请联系软件开发师注册使用!");
return 0;
}
}
3.2 keygen.h文件
#ifndef KEYGEN_H
#define KEYGEN_H
#include <QProcess>//获取计算机信息所需
#include <QCryptographicHash>//加密所需
#include <QDebug>//打印日志所需
#include <QSettings>//读取配置文件所需
#include <QDir>//读取配置文件所需
QString getWMIC(const QString &cmd);
// MD5 加密
QString MD5_encryption(const QString &data);
class KeyGen
{
public:
KeyGen();
~KeyGen();
//函数:读取计算机硬件信息
static QString GetPCMsg(void);
//函数:生成注册码
static QString generateKey(QString);
//函数:验证注册码
static bool verifyKey();
};
//构建函数
KeyGen::KeyGen()
{
}
//析构函数
KeyGen::~KeyGen()
{
}
//函数:读取计算机硬件信息
QString KeyGen::GetPCMsg(void)
{
//获取硬盘的序列号:wmic diskdrive get serialnumber
QString tempStr=getWMIC("wmic diskdrive get serialnumber");
QString pwd1 = tempStr.right(4); // 截取字符串的右边字符
//获取cpu的序列号:wmic cpu get processorid
tempStr=getWMIC("wmic cpu get processorid");
QString pwd2 = tempStr.right(4); // 截取字符串的右边字符
//获取网卡的MAC地址:wmic nicconfig get macaddress
tempStr=getWMIC("wmic nicconfig get macaddress");
QString pwd3 = tempStr.right(2); // 截取字符串的右边字符
//查询BIOS序列号:wmic bios get serialnumber
tempStr=getWMIC("wmic bios get serialnumber");
QString pwd4 = tempStr.right(4); // 截取字符串的右边字符
//查询操作系统安装时间:wmic os get installdate
tempStr=getWMIC("wmic os get installdate");
QString pwd5 = tempStr.left(8); // 截取字符串的右边字符
return pwd1+pwd2+pwd3+pwd4+pwd5;
}
//函数:生成注册码
QString KeyGen::generateKey(QString data)
{
data="XXXX"+data+"XXXX";
return MD5_encryption(data);
}
//函数:验证注册码
bool KeyGen::verifyKey()
{
//读取注册表文件License.ini
QString importfilepath=QDir::currentPath()+"/License.ini";
QSettings *mConfigIni = new QSettings(importfilepath, QSettings::IniFormat);
QString mKey_Local=mConfigIni->value("Key").toString();
qDebug()<<mKey_Local;
//读取系统配置并生成注册码
QString tempStr=GetPCMsg();
QString mKey_Now=generateKey(tempStr).left(8);
qDebug()<<mKey_Now;
//判断
if(mKey_Local==mKey_Now)
{
return true;
}else{
return false;
}
}
QString getWMIC(const QString &cmd)
{
//获取硬盘的序列号:wmic diskdrive get serialnumber
//获取cpu的序列号:wmic cpu get processorid
//获取网卡的MAC地址:wmic nicconfig get macaddress
//获取主板的序列号:wmic baseboard get serialnumber
//查询BIOS序列号:wmic bios get serialnumber
//查询操作系统安装时间:wmic os get installdate
//QString cmd="wmic cpu get processorid";
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("\r", "");
result = result.replace("\n", "");
result = result.simplified();
return result;
}
// MD5 加密
QString MD5_encryption(const QString &data)
{
QCryptographicHash md5(QCryptographicHash::Md5); //使用MD5加密
md5.addData(data.toUtf8(),data.size()); // 添加数据
QByteArray bArry = md5.result(); //获取MD5加密后的密码
QString md5_data;
md5_data.append(bArry.toHex());
return md5_data;
}
#endif // KEYGEN_H
四、注册机
void MainWindow::on_pushButton_clicked()
{
QString tempStr=ui->lineEdit->text();
if(tempStr!=NULL)
{
ui->lineEdit_2->setText(KeyGen::generateKey(tempStr).left(11));
}
}