一、软件目的
应项目需求,需要为编写的软件添加一层保护,防止滥用。
二、软件环境
Qt5.9+Windows
主要加密算法:MD5
MD5简单介绍:MD5是一种不可逆的加密算法,类似计算hash值,不同的数据字符无论长短,经过MD5计算后都会得到一组32位的16进制字符,这组字符只有极小的概率重复,因此可以作为一般加密使用。
三、实现效果
可以对机器码(MAC、CPUID)进行加密
输出加密后的注册码
可以设置级别等
再根据注册码验证字符
四、主要内容
获取机器码:
void systemInfo::getCPU(QString &cpu)
{
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();
cpu = result;
}
void systemInfo::getMAC(QString &mac)
{
// 获取所有网络接口列表
QList<QNetworkInterface> nets = QNetworkInterface::allInterfaces();
int nCnt = nets.count();
QString strMacAddr = "";
for (int i = 0; i < nCnt; i++)
{
// 如果此网络接口被激活并且正在运行并且不是回环地址,则就是我们需要找的Mac地址
if (nets[i].flags().testFlag(QNetworkInterface::IsUp) && nets[i].flags().testFlag(QNetworkInterface::IsRunning) && !nets[i].flags().testFlag(QNetworkInterface::IsLoopBack))
{
strMacAddr = nets[i].hardwareAddress();
break;
}
}
mac = strMacAddr.replace(":","");
}
void systemInfo::getTime(int &Stime)
{
QDateTime time = QDateTime::currentDateTime();//获取当前时间
Stime = time.toTime_t();//将当前时间转为时间戳:一串唯一的数字字符
//qDebug()<<"系统时间戳"<<Stime;
}
加密程序
class MD5
{
public:
MD5();
~MD5();
//初始化字符串
void md5Init(QString &md5);
//md5加密,可选加密级别
QString md5Encrypt(int i,QString &str);
//MD5验证,比较机器码
int md5Verify(QString bm);
protected:
systemInfo *sys;
};
//md5加密
QString MD5::md5Encrypt(int i,QString &str)
{
md5Init(str);
// qDebug()<<"机器码:"<<str;
QString salt1 = "kiioawal%@#kahl$*jllalk<[;wd38;Khaw;7775fsaaiUY':";
QString salt2 = "iol*W72_76w7daio83kOkdla(ldwawdajw8;w;aawfwadiUdw";
QString salt3 = "dawd&jY5jkajw!_76w7k[;wd3;wadwags;aidaduiikwdUdwa";
QString jiami,miwen;
if(i==1)
{
jiami = salt1 + str;
}
else if(i==2)
{
jiami = salt2 + str;
}
else if(i==3)
{
jiami = salt3 + str;
}
QByteArray ba,bb;
QCryptographicHash md(QCryptographicHash::Md5);
ba.append(jiami);
md.addData(ba);
bb = md.result();
miwen.append(bb.toHex());
return miwen;
}
注册码验证
int MD5::md5Verify(QString bm)
{
QString str;
QString miwen1 = md5Encrypt(1,str);
QString miwen2 = md5Encrypt(2,str);
QString miwen3 = md5Encrypt(3,str);
if(QString::compare(bm, miwen1) == 0)
{
int time;
sys->getTime(time);
qDebug()<<"time:"<<time;
return 1;
}
else if(QString::compare(bm, miwen2) == 0)
{
return 2;
}
else if(QString::compare(bm, miwen3) == 0)
{
return 3;
}
else
{
return 0;
}
}
源代码:代码