一个数据库系统的注册原理:
在讨论这前先来了解一下异或运算的性质:
若c=a^b;
则a=c^b;b=a^c;
基本思路如下:
(1)int(用户C盘序列号^用户名^1234567890123)生成一个序列号N(是字符串CString类型);
(2)系统检测到你的软件还没注册就自动生成一个文件,文件保存了你输入的用户名和序列号 N.公司会叫你EMail这个文件到他们公司邮箱,公司再返回一个注册码的!
(3)如果发回一个注册码,系统会判断 用户名^用户C盘序列号 =注册码?来进入系统的!注册成 功后再把用户名和注册码保存到系统文件(ini)中下次登陆就会检测这个文件,这次是判断 用户名^注册码=用户C盘序列号? 来判断进入系统了!
推理:
从上得到三条有用信息:
(1)用户名对于用户和公司来说都是已知的
(2)int(用户C盘序列号^1234567890123)=N(经过Format变成字符串)
(3)用户名^用户C盘序列号=注册码
从(1)和上面的异或性质推出: atoi(N)^1234567890123=用户C盘序列号 (3)
从(2)和异或性质推出: 注册码=用户C盘序列号^用户名 (4)
从(3),(4)式再推出
注册码=atoi(N)^1234567890123^用户名
用户名和序列号N都发给了公司,公司就是利用这条公司进行求注册码!
理解了这个思路后我就写了个生成注册码的程序:
就是逆运算吧了!假如我是那公司,发到我手上的信息已经有两个了,用户名和序列号N;这样,主要我用atoi(序列号)^1234567890123就可以求得注册码了,只不过在做的时候就是类型转换有点复杂吧了!!
为了便于复习把代码贴出来:
LPCTSTR lpRootPathName="C:\\";
LPTSTR lpVolumeNameBuffer=new char[12];
DWORD nVolumnNameSize=12;
DWORD MaximumComponentLength;
DWORD FileSystemFlags;
LPTSTR lpFileSystemNameBuffer=new char[10];
DWORD FileSystemNameLength=12;
GetVolumeInformation(lpRootPathName,lpVolumeNameBuffer,nVolumnNameSize,&m_VolumnSerialNumber,&MaximumComponentLength,&FileSystemFlags,lpFileSystemNameBuffer,FileSystemNameLength);
delete(lpVolumeNameBuffer);
delete(lpFileSystemNameBuffer);
上面就是将C盘序列号放到DWORD类型的m_VolumnSerialNumber中!
sSerialNumber.Format("%d",m_VolumnSerialNumber^1234567890123);
生成的序列号就保存在sSerialNumber中!
int(用户C盘序列号^1234567890123)=N已经完成!
下面是 用户名^用户C盘序列号=注册码
CString sName,sNameCode,sCode;
this->m_EdtUserName.GetWindowText(sName);
char * cNameCode=sName.GetBuffer(sName.GetLength());
DWORD dNameCode=*cNameCode;
sCode.Format("%d",m_VolumnSerialNumber^dNameCode);
sCode就保存了注册码!