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 ^

相关推荐
零意@18 分钟前
ubuntu切换不同版本的python
windows·python·ubuntu
何曾参静谧35 分钟前
「C/C++」C/C++ 之 变量作用域详解
c语言·开发语言·c++
AI街潜水的八角1 小时前
基于C++的决策树C4.5机器学习算法(不调包)
c++·算法·决策树·机器学习
JSU_曾是此间年少1 小时前
数据结构——线性表与链表
数据结构·c++·算法
写bug的小屁孩2 小时前
前后端交互接口(三)
运维·服务器·数据库·windows·用户界面·qt6.3
此生只爱蛋2 小时前
【手撕排序2】快速排序
c语言·c++·算法·排序算法
何曾参静谧2 小时前
「C/C++」C/C++ 指针篇 之 指针运算
c语言·开发语言·c++
lulu_gh_yu3 小时前
数据结构之排序补充
c语言·开发语言·数据结构·c++·学习·算法·排序算法
ULTRA??4 小时前
C加加中的结构化绑定(解包,折叠展开)
开发语言·c++
hairenjing11234 小时前
在 Android 手机上从SD 卡恢复数据的 6 个有效应用程序
android·人工智能·windows·macos·智能手机