• 7003阅读
  • 9回复

Qt编写密钥生成器+使用demo(开源) [复制链接]

上一主题 下一主题
离线liudianwu
 

图酷模式  只看楼主 倒序阅读 楼主  发表于: 2019-02-26
在很多商业软件中,需要提供一些可以试运行的版本,这样就需要配套密钥机制来控制,纵观大部分的试用版软件,基本上采用以下几种机制来控制。
1:远程联网激活,每次启动都联网查看使用时间等,这种方法最完美,缺点是没法联网的设备就歇菜了。
2:通过获取本地的硬盘+CPU等硬件的编号,做一个运算,生成一个激活码,超过半数的软件会采用此方法,缺点是不能自由控制软件的其他参数,比如软件中添加的设备数量的控制。
3:设定一个运行到期时间+数量限制+已运行时间的密钥文件,发给用户配套软件使用,缺点是如果仅仅设置的是运行到期时间,用户可以更改电脑时间来获取更长的使用时间,在电脑不联网的情况下。
本demo采用抛砖引玉的形式,用第三种方法来实现,密钥文件采用最简单的异或加密,可以自行改成其他加密方法。
完整源码下载 key.zip (115 K) 下载次数:504




核心代码:
  1. #include "frmmain.h"
  2. #include "ui_frmmain.h"
  3. #include "qmessagebox.h"
  4. #include "qfile.h"
  5. frmMain::frmMain(QWidget *parent) : QWidget(parent), ui(new Ui::frmMain)
  6. {
  7.     ui->setupUi(this);
  8.     this->initForm();
  9. }
  10. frmMain::~frmMain()
  11. {
  12.     delete ui;
  13. }
  14. void frmMain::initForm()
  15. {
  16.     QStringList min;
  17.     min << "1" << "5" << "10" << "20" << "30";
  18.     for (int i = 1; i <= 24; i++) {
  19.         min << QString::number(i * 60);
  20.     }
  21.     ui->cboxMin->addItems(min);
  22.     ui->cboxMin->setCurrentIndex(1);
  23.     ui->dateEdit->setDate(QDate::currentDate());
  24.     for (int i = 5; i <= 150; i = i + 5) {
  25.         ui->cboxCount->addItem(QString("%1").arg(i));
  26.     }
  27. }
  28. QString frmMain::getXorEncryptDecrypt(const QString &data, char key)
  29. {
  30.     //采用异或加密,也可以自行更改算法
  31.     QByteArray buffer = data.toLatin1();
  32.     int size = buffer.size();
  33.     for (int i = 0; i < size; i++) {
  34.         buffer[i] = buffer.at(i) ^ key;
  35.     }
  36.     return QLatin1String(buffer);
  37. }
  38. void frmMain::on_btnOk_clicked()
  39. {
  40.     bool useDate = ui->ckDate->isChecked();
  41.     bool useRun = ui->ckRun->isChecked();
  42.     bool useCount = ui->ckCount->isChecked();
  43.     if (!useDate && !useRun && !useCount) {
  44.         if (QMessageBox::question(this, "询问", "确定要生成没有任何限制的密钥吗?") != QMessageBox::Yes) {
  45.             return;
  46.         }
  47.     }
  48.     QString strDate = ui->dateEdit->date().toString("yyyy-MM-dd");
  49.     QString strRun = ui->cboxMin->currentText();
  50.     QString strCount = ui->cboxCount->currentText();
  51.     QString key = QString("%1|%2|%3|%4|%5|%6").arg(useDate).arg(strDate).arg(useRun).arg(strRun).arg(useCount).arg(strCount);
  52.     QFile file(QApplication::applicationDirPath() + "/key.db");
  53.     file.open(QFile::WriteOnly | QIODevice::Text);
  54.     file.write(getXorEncryptDecrypt(key, 110).toLatin1());
  55.     file.close();
  56.     QMessageBox::information(this, "提示", "生成密钥成功,将 key.db 文件拷贝到对应目录即可!");
  57. }
  58. void frmMain::on_btnClose_clicked()
  59. {
  60.     this->close();
  61. }


欢迎关注微信公众号:Qt实战 (各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发)QQ:517216493  WX:feiyangqingyun  QQ群:751439350
离线nigoole

只看该作者 1楼 发表于: 2019-02-26
给大侠暖场!
有句话说得好:好好学习,天天向上。加油~~!有上船的朋友联系企鹅393320854
离线liudianwu

只看该作者 2楼 发表于: 2019-02-26
回 nigoole 的帖子
nigoole:给大侠暖场![表情] [表情] [表情]  (2019-02-26 09:32) 

感谢倪大侠的捧场,倍感荣幸!
欢迎关注微信公众号:Qt实战 (各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发)QQ:517216493  WX:feiyangqingyun  QQ群:751439350
离线305750665

只看该作者 3楼 发表于: 2019-02-26
刘总终于出山了,沉默很久了
雨田哥: 群号:853086607
QQ: 3246214072

刘典武-feiyangqingyun:专业各种自定义控件编写+UI定制+输入法定制+视频监控+工业控制+仪器仪表+嵌入式linux+各种串口网络通信,童叟无欺,量大从优,欢迎咨询购买定制!QQ:517216493
离线ccazqyy

只看该作者 4楼 发表于: 2019-02-26
          
离线liuchangyin

只看该作者 5楼 发表于: 2019-02-26
离线crazy

只看该作者 6楼 发表于: 2019-02-26
必须要顶一顶
C/C++/Qt爱好者
邮箱: kevinlq0912@163.com
公众号: devstone
博客:http://kevinlq.com/

只看该作者 7楼 发表于: 2019-02-27
做的不错
离线hanheyfon

只看该作者 8楼 发表于: 2019-02-28
把第一次注册的时间写注册表,以后启动时检查一下此值,是不是可以防止用户通过修改系统时间来避免试用期时间限制
离线fuqingtao

只看该作者 9楼 发表于: 2019-07-26
快速回复
限100 字节
 
上一个 下一个