一個(gè)數(shù)據(jù)庫(kù)系統(tǒng)的注冊(cè)原理:
在討論這前先來(lái)了解一下異或運(yùn)算的性質(zhì):
若c=a^b;
則a=c^b;b=a^c;
基本思路如下:
(1)int(用戶(hù)C盤(pán)序列號(hào)^用戶(hù)名^1234567890123)生成一個(gè)序列號(hào)N(是字符串CString類(lèi)型);
(2)系統(tǒng)檢測(cè)到你的軟件還沒(méi)注冊(cè)就自動(dòng)生成一個(gè)文件,文件保存了你輸入的用戶(hù)名和序列號(hào) N.公司會(huì)叫你EMail這個(gè)文件到他們公司郵箱,公司再返回一個(gè)注冊(cè)碼的!
(3)如果發(fā)回一個(gè)注冊(cè)碼,系統(tǒng)會(huì)判斷 用戶(hù)名^用戶(hù)C盤(pán)序列號(hào) =注冊(cè)碼?來(lái)進(jìn)入系統(tǒng)的!注冊(cè)成 功后再把用戶(hù)名和注冊(cè)碼保存到系統(tǒng)文件(ini)中下次登陸就會(huì)檢測(cè)這個(gè)文件,這次是判斷 用戶(hù)名^注冊(cè)碼=用戶(hù)C盤(pán)序列號(hào)? 來(lái)判斷進(jìn)入系統(tǒng)了!
推理:
從上得到三條有用信息:
(1)用戶(hù)名對(duì)于用戶(hù)和公司來(lái)說(shuō)都是已知的
(2)int(用戶(hù)C盤(pán)序列號(hào)^1234567890123)=N(經(jīng)過(guò)Format變成字符串)
(3)用戶(hù)名^用戶(hù)C盤(pán)序列號(hào)=注冊(cè)碼
從(1)和上面的異或性質(zhì)推出: atoi(N)^1234567890123=用戶(hù)C盤(pán)序列號(hào) (3)
從(2)和異或性質(zhì)推出: 注冊(cè)碼=用戶(hù)C盤(pán)序列號(hào)^用戶(hù)名 (4)
從(3),(4)式再推出
注冊(cè)碼=atoi(N)^1234567890123^用戶(hù)名
用戶(hù)名和序列號(hào)N都發(fā)給了公司,公司就是利用這條公司進(jìn)行求注冊(cè)碼!
理解了這個(gè)思路后我就寫(xiě)了個(gè)生成注冊(cè)碼的程序:
就是逆運(yùn)算吧了!假如我是那公司,發(fā)到我手上的信息已經(jīng)有兩個(gè)了,用戶(hù)名和序列號(hào)N;這樣,主要我用atoi(序列號(hào))^1234567890123就可以求得注冊(cè)碼了,只不過(guò)在做的時(shí)候就是類(lèi)型轉(zhuǎn)換有點(diǎn)復(fù)雜吧了!!
為了便于復(fù)習(xí)把代碼貼出來(lái):
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盤(pán)序列號(hào)放到DWORD類(lèi)型的m_VolumnSerialNumber中!
sSerialNumber.Format("%d",m_VolumnSerialNumber^1234567890123);
生成的序列號(hào)就保存在sSerialNumber中!
int(用戶(hù)C盤(pán)序列號(hào)^1234567890123)=N已經(jīng)完成!
下面是 用戶(hù)名^用戶(hù)C盤(pán)序列號(hào)=注冊(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就保存了注冊(cè)碼!