c++/windows软件绑定网卡加密,实现一机一码

💂 个人主页:pp不会算法v

🤟 版权: 本文由【pp不会算法v】原创、在CSDN首发、需要转载请联系博主

💬 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦

奇思妙想系列文章

一、c\c++ windows自动打开cmd并进入mysql

二、c++\windows实现qq消息连发,群发器

三、c++\windows软件绑定网卡加密,实现一机一码

文章目录

最近接了一个小单子做个绑定网卡加密的demo,也是第一次了解吧,还挺有趣分享一下

相信大家都接触过加密软件,提起加密软甲我最先想起的就是数据库可视化工具Navicat了,navicat有一种方式就是给你一串请求码然后要你输入激活码,这个激活码就是根据这个请求吗解密之后得到的,

而且这个激活成功之后换了一台电脑那么就无效了,因为这是一机一码,那么怎么实现一机一码的呢,肯定是和电脑的某些唯一标识绑定关联起来了

对于一台电脑独一无二的信息常见的有两种:

1、网卡信息

2、主机序列号

那么这就好办了,我们只要根据网卡信息和主机序列号生成一个密钥就行了,然后加密一下变为注册码,客户要根据这个注册码解密出密钥然后输入解密之后的密钥就能进入软件主界面、

但是我们只需要输入一次密钥就行了(成功的前提下),那么之后我们怎么进入了,这好办解密成功之后我们只要把这个密钥写进注册表就行,然后每次打开软件先去注册表读取密钥,然后自动解锁

其实很简单,我前面说的有点复杂了,

软件的工作流程大致为:

打开--》读取注册表--》有密码然后加密之后看跟注册码是否一样,如果注册表没有密码或者密码错误那么弹出一个对话框供显示注册码和密钥输入框--》输入密钥正确那么就写进注册表然后进入主界面

既然是在windows下的软件那么就用winapi就行了

这里要用到一个库iphlapi.lib

下面我就简单写个根据网卡信息生成的唯一字符串的接口

cpp 复制代码
CString Cdemo3App::GetPcinfoCode()
{
	std::string macAddress;
	IP_ADAPTER_INFO adapterInfo[16];
	DWORD bufferSize = sizeof(adapterInfo);
	DWORD result = GetAdaptersInfo(adapterInfo, &bufferSize);

	if (result == ERROR_SUCCESS)
	{
		PIP_ADAPTER_INFO pAdapterInfo = adapterInfo;
		std::stringstream ss;
		for (DWORD i = 0; i < pAdapterInfo->AddressLength; i++)
		{
			if (i > 0)
				ss << ":";
			ss << std::hex << (int)pAdapterInfo->Address[i];
		}
		macAddress = ss.str();
	}
	// 将 MAC 地址进行异或操作,得到全数字的结果
	std::string numericMacAddress;
	for (int i = 0; i < macAddress.length(); i++)
	{
		char numericChar = (char)(macAddress[i] ^ '0');
		numericMacAddress += numericChar;
	}
	CString pcInfo;
	pcInfo.Format(_T("%s"), numericMacAddress.c_str());
	CString resultStr, temp;
	for (int i = 0; i < pcInfo.GetLength(); i++)
	{
		temp.Format("%d", (int)pcInfo[i]);
		resultStr +=temp;
	}
	return resultStr;
}

加密解密:

这里我就用最简单的异或操作来加密那么解密就和加密的流程一样了,这应该属于是对称加密

cpp 复制代码
CString Cdemo3App::GetKey(CString pcInfoCode)
{
	CString str = "3214569872021041520024925592652165";

	CString result;
	for (int i = 0; i < pcInfoCode.GetLength() && i < str.GetLength(); i++)
	{
		TCHAR ch = (TCHAR)((pcInfoCode[i] - '0') ^ (str[i] - '0')) + '0';
		result += ch;
	}
	return result;
}

读取注册表

cpp 复制代码
CString keyPath = _T("Software\\YourCompany\\YourApp");

	CString savedKey;

	HKEY hKey;
	if (RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\myApp", 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS)
	{
		DWORD dataSize = 0;
		if (RegQueryValueEx(hKey, "Key", NULL, NULL, NULL, &dataSize) == ERROR_SUCCESS)
		{
			TCHAR* buffer = new TCHAR[dataSize / sizeof(TCHAR)];
			if (RegQueryValueEx(hKey, "Key", NULL, NULL, (LPBYTE)buffer, &dataSize) == ERROR_SUCCESS)
			{
				savedKey = buffer;
			}
			delete[] buffer;
		}

		RegCloseKey(hKey);
	}

写注册表

cpp 复制代码
	// 写入注册表
	CString key;
			HKEY hKey;
			if (RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\myApp", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &hKey, NULL) == ERROR_SUCCESS)
			{
				RegSetValueEx(hKey, "Key", 0, REG_SZ, (LPBYTE)(LPCTSTR)key, (key.GetLength() + 1) * sizeof(TCHAR));
				RegCloseKey(hKey);
			}

demo源码地址:https://github.com/ppywj/windows-.git

不求fork,但求觉得对你有帮助三连一下,这是我写文章的动力,谢谢 ^ V ^

相关推荐
冷眼看人间恩怨6 分钟前
【Qt笔记】QDockWidget控件详解
c++·笔记·qt·qdockwidget
红龙创客15 分钟前
某狐畅游24校招-C++开发岗笔试(单选题)
开发语言·c++
Lenyiin18 分钟前
第146场双周赛:统计符合条件长度为3的子数组数目、统计异或值为给定值的路径数目、判断网格图能否被切割成块、唯一中间众数子序列 Ⅰ
c++·算法·leetcode·周赛·lenyiin
Clockwiseee1 小时前
php伪协议
windows·安全·web安全·网络安全
yuanbenshidiaos2 小时前
c++---------数据类型
java·jvm·c++
十年一梦实验室2 小时前
【C++】sophus : sim_details.hpp 实现了矩阵函数 W、其导数,以及其逆 (十七)
开发语言·c++·线性代数·矩阵
taoyong0012 小时前
代码随想录算法训练营第十一天-239.滑动窗口最大值
c++·算法
这是我583 小时前
C++打小怪游戏
c++·其他·游戏·visual studio·小怪·大型·怪物
唐宋元明清21883 小时前
.NET 阻止系统睡眠/息屏
windows·电源
fpcc3 小时前
跟我学c++中级篇——C++中的缓存利用
c++·缓存