QT学习_20_一机一码加密授权

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

0、中心思想

  •  让软件获取此电脑的CPU和MAC地址等信息,然后组合成机器码,每个机器都是独一无二的
  • 添加只有自己才知道的公钥到机器码,与之组合成密码明文
  • 将密码明文用md5或者其他方式加密得到每个机器独一无二的密码
  • 读取注册表中代表本软件密码的参数,如果不匹配则进入授权界面
  • 授权成功后,将密码写入注册表,下一次使用将不再受到约束
  • 根据基于机器码的加密过程(添加只有自己知道的公钥),单独写一个机器码→授权码的授权软件。

1、项目文件和头文件

.pro & .h

// .pro
QT       += network// .h
#include <QtNetwork>
#include <QSettings>

2、生成机器码 

// 获取CPU信息
QString mainwindow::get_cpu_id()
{QString strCpuId = "";unsigned int dwBuf[4] = { 0 };unsigned long long ret = 0;__cpuid((int*)(void*)dwBuf, 1);ret = dwBuf[3];ret = ret << 32;QString str0 = QString::number(dwBuf[3], 16).toUpper();QString str0_1 = str0.rightJustified(8, '0');QString str1 = QString::number(dwBuf[0], 16).toUpper();QString str1_1 = str1.rightJustified(8, '0');strCpuId = str0_1 + str1_1;return strCpuId;
}// 获得独一无二的机器码
QString mainwindow::get_machine_code()
{QString cpuid = get_cpu_id();QString macid = get_mac_id();QString UniqueCode = cpuid + macid;QString MachineCode = "";for(int i = 0; i < UniqueCode.size(); i++){MachineCode = MachineCode + UniqueCode[i];if((i+1)%4==0 && i+1!=UniqueCode.size()){MachineCode = MachineCode + "-";}}return MachineCode;}

3、加入公钥

// 加入公钥
QString mainwindow::get_visible_key(){QString machinecode = get_machine_code();m_str_machine_code = machinecode;QString Authorkey1 = "公钥1-自定义";QString Authorkey2 = "公钥2-自定义";QString ciphertext = Authorkey1+ "-" + machinecode + "-" + Authorkey2;return ciphertext;
}

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

// 获得加密后的密码
QString mainwindow::get_md5_key(){QString ciphertext = get_visible_key();QString md5Str = QCryptographicHash::hash(ciphertext.toLatin1(),QCryptographicHash::Md5).toHex();return md5Str;
}

5、判断是否授权 


// 初始化判断是否已授权,只调用一次
bool mainwindow::is_authorized(){QString md5pwd = get_md5_key();m_str_md5_key = md5pwd;qDebug() << m_str_md5_key;QSettings setting("HKEY_CURRENT_USER\\Software\\自定义注册表的名字", QSettings::NativeFormat);QString mypwd = setting.value("自定义参数的名字", "").toString();if(mypwd == md5pwd){return true;}else{return false;}
}

6、授权成功写入注册表

// 授权成功将信息保存进入注册表
void authorize::save_authorization_info(QString md5_key)
{QSettings setting("HKEY_CURRENT_USER\\Software\\自定义注册表的名字", QSettings::NativeFormat);setting.setValue("自定义参数的名字", md5_key);
}

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/608495.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是API网关代理?

带有API网关的代理服务显着增强了用户体验和性能。特别是对于那些使用需要频繁创建和轮换代理的工具的人来说&#xff0c;使用 API 可以节省大量时间并提高效率。 了解API API&#xff08;即应用程序编程接口&#xff09;充当服务提供商和用户之间的连接网关。通过 API 连接&a…

【PostgreSQL】在DBeaver中实现序列、函数、视图、触发器设计

【PostgreSQL】在DBeaver中实现序列、函数、触发器、视图设计 基本配置一、序列1.1、序列使用1.1.1、设置字段为主键&#xff0c;数据类型默认整型1.1.2、自定义序列&#xff0c;数据类型自定义 1.2、序列延申1.2.1、理论1.2.2、测试1.2.3、小结 二、函数2.1、SQL直接创建2.1.1…

L1-007 念数字(Java)

题目 输入一个整数&#xff0c;输出每个数字对应的拼音。当整数为负数时&#xff0c;先输出fu字。十个数字对应的拼音如下&#xff1a; 0: ling 1: yi 2: er 3: san 4: si 5: wu 6: liu 7: qi 8: ba 9: jiu输入格式&#xff1a; 输入在一行中给出一个整数&#xff0c;如&…

React-路由进阶

一、路由的使用 1.声明式导航 在src/index.js文件中定义一个路由模式&#xff08;可选&#xff0c;也可以在具体的某个组件中使用Router&#xff09; import React from "react"; import ReactDOM from "react-dom";// 设置路由模式 import {HashRouter…

Python教程37:使用turtle画一个戴帽子的皮卡丘

---------------turtle源码集合--------------- Python教程36&#xff1a;海龟画图turtle写春联 Python源码35&#xff1a;海龟画图turtle画中国结 Python源码31&#xff1a;海龟画图turtle画七道彩虹 Python源码30&#xff1a;海龟画图turtle画紫色的小熊 Python源码29&a…

基于宝塔搭建Discuz!论坛

一、安装宝塔 我是在我的虚拟机上安装图的宝塔 虚拟机版本&#xff1a;Ubuntu 18.04 wget -O install.sh https://download.bt.cn/install/install-ubuntu_6.0.sh && sudo bash install.sh 6dca892c安装完成之后在浏览器输入你的地址 https://你的域名&#xff08;或…

【Java的导入导出Excel操作详细介绍】

本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文峰…

etcd集群搭建

etcd构建自身高可用集群主要有三种形式&#xff1a; 静态发现: 预先已知etcd集群中有哪些节点&#xff0c;在启动时通过--initial-cluster参数直接指定好etcd的各个节点地址etcd动态发现: 静态配置前提是在搭建集群之前已经提前知道各节点的信息&#xff0c;而实际应用中可能存…

抽奖小程序

import random import keyboard import timedef make_choice():while True:choice_selected random.choices([乾, 坤, 坎, 离, 兑, 震, 巽, 艮])[0]print(choice_selected, end\r)# time.sleep(0.1)if keyboard.is_pressed(enter):return choice_selectedif __name__ __main_…

基于JavaWeb+BS架构+SpringBoot+Vue校园一卡通系统的设计和实现

基于JavaWebBS架构SpringBootVue校园一卡通系统的设计和实现 文末获取源码Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 文末获取源码 Lun文目录 第一章 概述 4 1.1 研究背景 4 1.2研究目的及意义 4 1.3国内外发展现状 4 1…

视觉SALM与激光SLAM的区别

前言&#xff1a; 这里比较一下视觉SLAM和激光SLAM的区别&#xff0c;仅比较其在算法层面上的一些不同&#xff0c;这里拿视觉SLAM算法&#xff1a;ORB-SLAM系列和激光SLAM算法&#xff1a;LOAM系列对比。 一&#xff1a;特征提取 1.ORB-SLAM&#xff08;视觉SLAM&#xff0…

什么是跨境电商独立站?

你是否有过这样的经历&#xff1a;当你在网上浏览一些商品时&#xff0c;发现有些网站的域名很奇怪&#xff0c;比如 .com、.net、.co等&#xff0c;而且网站的界面和设计也和国内的电商平台不太一样。 你可能会好奇&#xff0c;这些网站是什么&#xff1f;它们是怎么做的&…

网络安全之你的浏览器记录真的安全吗?

密码是每个人最私密的东西&#xff0c;轻易是不会展示给他人的&#xff0c;那么我如何能知道你电脑上浏览器里保存的密码呢&#xff1f;浏览器是大家在网上冲浪最常用的软件&#xff0c;在登录一些网站填写账号密码后&#xff0c;浏览器为了方便大家使用&#xff0c;会提示是否…

2.4G SOC无线收发芯片:XL2401D 产品介绍

XL2401D芯片是工作在2.400~2.483GHz世界通用ISM频段,集成微控制器的的SOC无线收发芯片。芯片集成射频收发机、频率收生器、晶体振荡器、调制解调器等功能模块&#xff0c;并且支持对多组网和带 ACK的通信模式。发射输出功率、工作频道以及通信数据率均可配置。芯片内含以EPROM作…

unity小程序websocket:nginx配置https (wss)转http (ws)及其他问题解决

目录 前言 实际运用场景 处理流程如下 nginx配置ssl和wss 配置过程中遇到的问题 1、无法连接服务器 2、通过IP可以访问&#xff0c;域名却不行 问题描述 解决 3、如何判断该域名是否备案了 前言 为了服务器网络的通用性&#xff0c;我们在实现移动端的游戏转微信小程序…

Python教程38:使用turtle画动态粒子爱心+文字爱心

Turtle库是Python语言中的一个标准库&#xff0c;它提供了一种有趣的方式来介绍编程和图形绘制的基本概念。Turtle库使用一个虚拟的“海龟”来绘制图形。你可以控制海龟的方向、速度和位置&#xff0c;通过向前移动、向左转或向右转等命令来绘制线条、圆弧多边形等图形。 -----…

Java 反射(一)

反射 1.反射的介绍 1.反射机制允话程序在执行期间借助于Refelction API取得任何类的信息&#xff08;比如成员变量&#xff0c;构造器&#xff0c;成员方法等&#xff09;并能操作对象的属性及方法&#xff0c;反射在设计模式和框架底层都会用到 2.加载完类之后&#xff0c;在…

API调试怎么做?Apipost快速上手

前言 Apipost是一款支持 RESTful API、SOAP API、GraphQL API等多种API类型&#xff0c;支持 HTTPS、WebSocket、gRPC多种通信协议的API调试工具。除此之外&#xff0c;Apipost 还提供了自动化测试、团队协作、等多种功能。这些丰富的功能简化了工作流程&#xff0c;提高了研发…

mybatis注意事项/异常

一&#xff1a;mybatis Plus自动拼装sql异常 Error Sql/mybatisplus框架方法失效 Cause: com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: Failed to process, Error SQL: " 常见场景&#xff1a; 1.1XML使用了跟框架同名方法&#xff0c;例如selectLis…

CodeWave智能开发平台--03--目标:应用创建--08联系人管理

摘要 本文是网易数帆CodeWave智能开发平台系列的第11篇&#xff0c;主要介绍了基于CodeWave平台文档的新手入门进行学习&#xff0c;实现一个完整的应用&#xff0c;本文主要完成08联系人管理 CodeWave智能开发平台的11次接触 CodeWave参考资源 网易数帆CodeWave开发者社区…