QT学习_20_软件一机一码的加密与授权

为保护自己辛苦写出的程序,规避白嫖。通常需要对可执行程序进行加密授权。网上主流的方法是给主程序套壳,但是破解软件网站都快要翻烂了,还是没有找到满足自己需求的套壳软件。索性还是自己写这个加密授权软件。本文的主要内容就是实现QT软件的一机一码的加密与授权

目录

0、中心思想

1、项目文件和头文件

2、生成机器码 

3、加入公钥

4、用md5加密添加了公钥的组合明文

5、判断是否授权 

6、授权成功写入注册表


0、中心思想

  •  让软件获取此电脑的CPU和MAC地址等信息,然后组合成机器码,每个机器都是独一无二的
  • 添加只有自己才知道的公钥到机器码,与之组合成密码明文
  • 将密码明文用md5或者其他方式加密得到每个机器独一无二的密码
  • 读取注册表中代表本软件密码的参数,如果不匹配则进入授权界面,如下图所示

  • 授权成功后,将密码写入注册表,下一次使用将不再受到约束
  • 根据基于机器码的加密过程(添加只有自己知道的公钥),自己单独写一个机器码→授权码的授权软件,如下图所示,需要授权的电脑发送机器码给你,你生成授权码后发送给他。

本文的内容所实现功能是类似于QT-C++ 注册机软件,生成机器码和注册码,支持授权时间_qt制作注册机-CSDN博客

这篇博客的功能,这篇博客的第一张动态图非常的贴切。

请一定先理解中心思想,再往下看!

1、项目文件和头文件

.pro & .h

 
  1. // .pro

  2. QT += network

  3. // .h

  4. #include <QtNetwork>

  5. #include <QSettings>

2、生成机器码 

 
  1. // 获取MAC地址信息

  2. QString mainwindow::get_mac_id()

  3. {

  4. QList<QNetworkInterface> nets = QNetworkInterface::allInterfaces();

  5. int nCnt = nets.count();

  6. QString strMacAddr = "";

  7. for(int i = 0; i < nCnt; i++)

  8. {

  9. if(nets[i].flags().testFlag(QNetworkInterface::IsUp) &&

  10. nets[i].flags().testFlag(QNetworkInterface::IsRunning) &&

  11. !nets[i].flags().testFlag(QNetworkInterface::IsLoopBack))

  12. {

  13. for(int j = 0; j < nets[i].addressEntries().size(); j++)

  14. {

  15. if(nets[i].addressEntries().at(j).ip() != QHostAddress::LocalHost &&

  16. nets[i].addressEntries().at(j).ip().protocol() == QAbstractSocket::IPv4Protocol)

  17. {

  18. strMacAddr = nets[i].hardwareAddress();

  19. }

  20. }

  21. }

  22. }

  23. strMacAddr.remove(':');

  24. return strMacAddr;

  25. }

  26. // 获取CPU信息

  27. QString mainwindow::get_cpu_id()

  28. {

  29. QString strCpuId = "";

  30. unsigned int dwBuf[4] = { 0 };

  31. unsigned long long ret = 0;

  32. __cpuid((int*)(void*)dwBuf, 1);

  33. ret = dwBuf[3];

  34. ret = ret << 32;

  35. QString str0 = QString::number(dwBuf[3], 16).toUpper();

  36. QString str0_1 = str0.rightJustified(8, '0');

  37. QString str1 = QString::number(dwBuf[0], 16).toUpper();

  38. QString str1_1 = str1.rightJustified(8, '0');

  39. strCpuId = str0_1 + str1_1;

  40. return strCpuId;

  41. }

  42. // 获得独一无二的机器码

  43. QString mainwindow::get_machine_code()

  44. {

  45. QString cpuid = get_cpu_id();

  46. QString macid = get_mac_id();

  47. QString UniqueCode = cpuid + macid;

  48. QString MachineCode = "";

  49. for(int i = 0; i < UniqueCode.size(); i++)

  50. {

  51. MachineCode = MachineCode + UniqueCode[i];

  52. if((i+1)%4==0 && i+1!=UniqueCode.size()){

  53. MachineCode = MachineCode + "-";

  54. }

  55. }

  56. return MachineCode;

  57. }

3、加入公钥

 
  1. // 加入公钥

  2. QString mainwindow::get_visible_key(){

  3. QString machinecode = get_machine_code();

  4. m_str_machine_code = machinecode;

  5. QString Authorkey1 = "公钥1-自定义";

  6. QString Authorkey2 = "公钥2-自定义";

  7. QString ciphertext = Authorkey1+ "-" + machinecode + "-" + Authorkey2;

  8. return ciphertext;

  9. }

4、用md5加密添加了公钥的组合明文

 
  1. // 获得加密后的密码

  2. QString mainwindow::get_md5_key(){

  3. QString ciphertext = get_visible_key();

  4. QString md5Str = QCryptographicHash::hash(ciphertext.toLatin1(),QCryptographicHash::Md5).toHex();

  5. return md5Str;

  6. }

5、判断是否授权 

 
  1. // 初始化判断是否已授权,只调用一次

  2. bool mainwindow::is_authorized(){

  3. QString md5pwd = get_md5_key();

  4. m_str_md5_key = md5pwd;

  5. qDebug() << m_str_md5_key;

  6. QSettings setting("HKEY_CURRENT_USER\\Software\\自定义注册表的名字", QSettings::NativeFormat);

  7. QString mypwd = setting.value("自定义参数的名字", "").toString();

  8. if(mypwd == md5pwd){

  9. return true;

  10. }else{

  11. return false;

  12. }

  13. }

6、授权成功写入注册表

 
  1. // 授权成功将信息保存进入注册表

  2. void authorize::save_authorization_info(QString md5_key)

  3. {

  4. QSettings setting("HKEY_CURRENT_USER\\Software\\自定义注册表的名字", QSettings::NativeFormat);

  5. setting.setValue("自定义参数的名字", md5_key);

  6. }

保存之后的注册表如下图所示 

软件的授权界面、按钮操作、弹出授权界面和关闭授权界面的逻辑等内容,这些我就不分享了,上面已经提供了最核心的思想和最核心的功能,拿着这些东西就能够实现一机一码加密功能了。  授权软件要单独写一个,可以说是非常简单,就不赘述了。

最后愿我们共同进步! 感谢您的阅读,欢迎留言讨论、收藏、点赞、分享。 

QT学习_20_软件一机一码的加密与授权_qt qt-c++注册机,注册码生成-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值