#include "appkey.h"
#include "qmutex.h"
#include "qfile.h"
#include "qtimer.h"
#include "qdatetime.h"
#include "qapplication.h"
#include "qmessagebox.h"
AppKey *AppKey::self = NULL;
AppKey *AppKey::Instance()
{
if (!self) {
QMutex mutex;
QMutexLocker locker(&mutex);
if (!self) {
self = new AppKey;
}
}
return self;
}
AppKey::AppKey(QObject *parent) : QObject(parent)
{
keyData = "";
keyUseDate = false;
keyDate = "2017-01-01";
keyUseRun = false;
keyRun = 1;
keyUseCount = false;
keyCount = 10;
timer = new QTimer(this);
timer->setInterval(1000);
connect(timer, SIGNAL(timeout()), this, SLOT(checkTime()));
startTime = QDateTime::currentDateTime();
}
void AppKey::start()
{
//判断密钥文件是否存在,不存在则从资源文件复制出来,同时需要设置文件写权限
QString keyName = qApp->applicationDirPath() + "/key.db";
QFile keyFile(keyName);
if (!keyFile.exists() || keyFile.size() == 0) {
QMessageBox::critical(0, "错误", "密钥文件丢失,请联系供应商!");
exit(0);
}
//读取密钥文件
keyFile.open(QFile::ReadOnly);
keyData = keyFile.readLine();
keyFile.close();
//将从注册码文件中的密文解密,与当前时间比较是否到期
keyData = getXorEncryptDecrypt(keyData, 110);
QStringList data = keyData.split("|");
if (data.count() != 6) {
QMessageBox::critical(0, "错误", "注册码文件已损坏,程序将自动关闭!");
exit(0);
}
keyUseDate = (data.at(0) == "1" ? true : false);
keyDate = data.at(1);
keyUseRun = (data.at(2) == "1" ? true : false);
keyRun = data.at(3).toInt();
keyUseCount = (data.at(4) == "1" ? true : false);
keyCount = data.at(5).toInt();
//如果启用了时间限制
if (keyUseDate) {
QString nowDate = QDate::currentDate().toString("yyyy-MM-dd");
if (nowDate > keyDate) {
QMessageBox::critical(0, "错误", "软件已到期,请联系供应商更新注册码!");
exit(0);
}
}
//如果启用了运行时间显示
if (keyUseRun) {
timer->start();
}
}
void AppKey::stop()
{
timer->stop();
}
void AppKey::checkTime()
{
//找出当前时间与首次启动时间比较
QDateTime now = QDateTime::currentDateTime();
if (startTime.secsTo(now) >= (keyRun * 60)) {
QMessageBox::critical(0, "错误", "试运行时间已到,请联系供应商更新注册码!");
exit(0);
}
}
QString AppKey::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);
}
bool AppKey::checkCount(int count)
{
if (keyUseCount) {
if (count >= keyCount) {
QMessageBox::critical(0, "错误", "设备数量超过限制,请联系供应商更新注册码!");
return false;
}
}
return true;
}
没有合适的资源?快使用搜索试试~ 我知道了~
Qt编写密钥生成器+使用demo
共17个文件
cpp:5个
png:4个
pro:3个
5星 · 超过95%的资源 需积分: 44 321 下载量 96 浏览量
2019-02-26
09:21:19
上传
评论 14
收藏 115KB ZIP 举报
温馨提示
在很多商业软件中,需要提供一些可以试运行的版本,这样就需要配套密钥机制来控制,纵观大部分的试用版软件,基本上采用以下几种机制来控制。 1:远程联网激活,每次启动都联网查看使用时间等,这种方法最完美,缺点是没法联网的设备就歇菜了。 2:通过获取本地的硬盘+CPU等硬件的编号,做一个运算,生成一个激活码,超过半数的软件会采用此方法,缺点是不能自由控制软件的其他参数,比如软件中添加的设备数量的控制。 3:设定一个运行到期时间+数量限制+已运行时间的密钥文件,发给用户配套软件使用,缺点是如果仅仅设置的是运行到期时间,用户可以更改电脑时间来获取更长的使用时间,在电脑不联网的情况下。 本demo采用抛砖引玉的形式,用第三种方法来实现,密钥文件采用最简单的异或加密,可以自行改成其他加密方法。
资源推荐
资源详情
资源评论
收起资源包目录
key.zip (17个子文件)
key
key.pro 80B
keytool
keytool.pro 539B
frmmain.h 471B
frmmain.cpp 2KB
main.cpp 776B
frmmain.ui 4KB
keydemo
frmmain.h 333B
appkey.h 1KB
frmmain.cpp 455B
main.cpp 862B
frmmain.ui 986B
appkey.cpp 3KB
keydemo.pro 559B
snap
QQ截图20190226090557.png 35KB
QQ截图20190226090503.png 19KB
QQ截图20190226090720.png 38KB
QQ截图20190226090532.png 13KB
共 17 条
- 1
资源评论
- weixin_430868152020-12-25修改系统时间来重复使用这个问题在软件上能否解决?
- panyifei19922019-07-01很好,可以用
- linfeng_rs2019-09-12好用,资料不错
- kavstall2019-05-16很好,有用,感谢分享
- cz802020-03-16还在学习,感觉有用
feiyangqingyun
- 粉丝: 5w+
- 资源: 187
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (源码)基于Spring Boot和Vue的后台管理系统.zip
- 用于将 Power BI 嵌入到您的应用中的 JavaScript 库 查看文档网站和 Wiki 了解更多信息 .zip
- (源码)基于Arduino、Python和Web技术的太阳能监控数据管理系统.zip
- (源码)基于Arduino的CAN总线传感器与执行器通信系统.zip
- (源码)基于C++的智能电力系统通信协议实现.zip
- 用于 Java 的 JSON-RPC.zip
- 用 JavaScript 重新实现计算机科学.zip
- (源码)基于PythonOpenCVYOLOv5DeepSort的猕猴桃自动计数系统.zip
- 用 JavaScript 编写的贪吃蛇游戏 .zip
- (源码)基于ASP.NET Core的美术课程管理系统.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功