You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

143 lines
3.7 KiB
C++

#include "lpCryptokey.h"
#include <QCryptographicHash>
#include "lpHardwareInfo.h"
#include <QSettings>
namespace lpCryptokey
{
const QString ComponyKey = "hzleaper";
QString genSerialNumber(const QString& mac)
{
unsigned long long ulMacTmp = 0;
QString newMac = mac + ComponyKey;
std::string mStrMac = newMac.toStdString();
mStrMac.erase(std::remove(mStrMac.begin(), mStrMac.end(), ':'), mStrMac.end());
mStrMac.erase(std::remove(mStrMac.begin(), mStrMac.end(), '-'), mStrMac.end());
for (int i = 0; i < mStrMac.size(); i++)
{
ulMacTmp = ulMacTmp << 4;
char cStr = mStrMac.at(i);
if (cStr >= '0'&&cStr <= '9')
ulMacTmp += (int)(mStrMac.at(i) - '0');
else if (cStr >= 'a'&&cStr <= 'f')
ulMacTmp += (int)(mStrMac.at(i) - 'a' + 10);
else if (cStr >= 'A'&&cStr <= 'F')
ulMacTmp += (int)(mStrMac.at(i) - 'A' + 10);
else
ulMacTmp += 0;
}
QString serial = QString("%1").arg(ulMacTmp);
QString key = QString("%1").arg(serial.mid(serial.size()-9,-1).toInt(),9,10, QLatin1Char('0'));
return key;
}
QString genEncryption(const QString& serial)
{
QByteArray byte;
byte.append(serial + ComponyKey);
QByteArray MD5byte = QCryptographicHash::hash(byte, QCryptographicHash::Md4);
QString str = MD5byte.toHex().toUpper();
int size = 20;
int kNum = 4;
QString strKey;
for (int n = 0; n < size / kNum; n++) {
strKey += str.mid(n * kNum, kNum);
if (n < (size / kNum) - 1)
strKey += "-";
}
return strKey;
}
bool compareCrypto(const QString& serial, const QString& key)
{
QString tmpKey = genEncryption(serial);
if (tmpKey == key)
return true;
return false;
}
}
lpCheckKey::lpCheckKey()
{
lpHardwareInfo::instance()->init();
rsa_op.set_params();
rsa_op.open_prikey_pubkey();
rsa_op.open_pubkey();
}
lpCheckKey::~lpCheckKey()
{
}
//检查linese是否匹配
bool lpCheckKey::checkLinese()
{
std::string hardDriveID = lpHardwareInfo::instance()->getHardDrive();
std::string cpuID = lpHardwareInfo::instance()->getCpuID();
std::string BoardID = lpHardwareInfo::instance()->getMotherBoardID();
std::string macID = lpHardwareInfo::instance()->getMacAddress();
if (hardDriveID.size() > 0)
{
m_SerialNo = lpCryptokey::genSerialNumber(QString(hardDriveID.c_str()) + QString(cpuID.c_str()));
}
else {
m_SerialNo = lpCryptokey::genSerialNumber(QString(BoardID.c_str()) + QString(macID.c_str()));
}
QSettings settingKey("Leaper_Register");
QString strKey = settingKey.value("key").toString();
bool bRegister = settingKey.value("register", false).toBool();
QString serialNo = settingKey.value("serialNo").toString();
if (m_SerialNo != serialNo)
{
if (bRegister == true)
{
return true;
}
}
QByteArray lineseData = genLinese(m_SerialNo.toLatin1());
if (lineseData == strKey)
return true;
else
return false;
}
bool lpCheckKey::checkLinese(QString serialNo, QString linese)
{
QByteArray lineseData = genLinese(serialNo.toLatin1());
if (QString(lineseData) == linese)
{
QSettings settingKey("Leaper_Register");
settingKey.setValue("key", linese);
settingKey.setValue("register", true);
settingKey.setValue("serialNo", serialNo);
return true;
}
else
return false;
}
QString lpCheckKey::getSerialNo() const
{
return m_SerialNo;
}
QByteArray lpCheckKey::genLinese(QByteArray serialNo)
{
QByteArray character = serialNo;
if (character.length() >= 116)
{
character = character.mid(0, 116);
}
int enc_len = 0;
unsigned char *enc_data = NULL;
unsigned char *enc_data2 = NULL;
rsa_op.prikey_encrypt((BYTE*)character.data(), character.length() + 1, (unsigned char **)&enc_data, enc_len);
QByteArray licenseKey((char*)enc_data, enc_len);
QByteArray licenseKeyForHex = licenseKey.toHex();
return licenseKeyForHex;
}