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 ^

相关推荐
Ajiang282473530436 分钟前
对于C++中stack和queue的认识以及priority_queue的模拟实现
开发语言·c++
梓仁沐白3 小时前
ubuntu+windows双系统切换后蓝牙设备无法连接
windows·ubuntu
‘’林花谢了春红‘’5 小时前
C++ list (链表)容器
c++·链表·list
九鼎科技-Leo7 小时前
什么是 WPF 中的依赖属性?有什么作用?
windows·c#·.net·wpf
机器视觉知识推荐、就业指导7 小时前
C++设计模式:建造者模式(Builder) 房屋建造案例
c++
Yang.999 小时前
基于Windows系统用C++做一个点名工具
c++·windows·sql·visual studio code·sqlite3
熬夜学编程的小王9 小时前
【初阶数据结构篇】双向链表的实现(赋源码)
数据结构·c++·链表·双向链表
zz40_9 小时前
C++自己写类 和 运算符重载函数
c++
我不瘦但很逗9 小时前
Windows下使用DBeaver连接云数据库(MySQL)
数据库·windows