序號產生器的實作 教學   
		
		
		
		這裡在 Yahoo知識+ 看到一則 
因此直接(拿來用)貼出來
 
	PHP 語法: 
	
		 
		
		
			
#include <cstdlib>
 #include <iostream>
 
 using namespace std;
 
 int main(int argc, char *argv[])
 {
 char name[80];
 int name_len,i;
 int sn1=0;
 unsigned long sn2=0x654789;
 
 system("cls");//clrscr();
 printf("please input you name:");
 gets(name);
 name_len=strlen(name);
 if (name_len>5)
 {
   for (i=0;i<name_len;i++)
   {
     sn1=sn1+name[i]*4;
     sn2=(3*sn2)-4;
   }
   printf("Serial is:BS-%lX-%d\n",sn2,sn1);
 }
 else{
   printf("name must longer than 5 letters!\n");
 }
 printf("Power by POW ^_^\n"); 
 
     system("PAUSE");
     return EXIT_SUCCESS;
 } 
 
		 
		
		 
	 
 上面程式限制需輸入至少6個英數字 
而利用特製的算式 
sn2=0x654789 
sn1=sn1+name[i]*4; 
sn2=(3*sn2)-4; 
使序號有一定的特性 
但 
一個 name 只有一組唯一的序號 
無法像一些專門的破解團體製作的製序號產生器一般 
按一下就算出一組新的
 
此時我們可以用亂數 rnd 來加入運算式達到目的 
只是此時會有一個問題 
在驗證之應用上如何解決呢 
(驗證有兩個方法,一為用同一個運算式,一為反運算式 來驗證結果) 
不過此時我們只要把握 rnd 的特性 
"設定亂數種子表" 
就好了 
C/C++ 我們可使用 srand 
對應檔案自己就使用 
handle=open("軟體自己.exe", O_BINARY); 
srand(filelength(handle)); 
因為相同檔案大小的軟體機會甚微 
如此可說就達到唯一性的特性 
(那如何作驗證呢,將開另一篇主體...)
 
最後寫一實例
 
	PHP 語法: 
	
		 
		
		
			
#include <cstdlib>
 #include <iostream>
 #include <fcntl.h> 
 
 #define ASCII_NUM 3
 #define MULTIPLY_VALUE 2
 
 using namespace std;
 
 int main(int argc, char *argv[])
 {
 int i, no=0;
 char key[ASCII_NUM+ASCII_NUM*MULTIPLY_VALUE+2]="0"; //計: 3個英文 + "-" + 6個阿拉伯數字 + '\0'
 char *name;
 int handle;
 
 cout << "Name: ";
 gets(name);
 for(i=0; i<strlen(name) ;i++){
     //cout << (int)name[i] << endl;
     no+=name[i];
 }
 //cout << no << endl;
 
 try{
     handle= open("key.exe", O_BINARY);
     srand(filelength(handle)+no);
     close(handle);
 }
 catch(std::exception &e){ }
 
 for(int j=0; j<3; j++){
     no=0;
     
     for(i=0; i<ASCII_NUM ;i++){
       key[no++]= (char)(rand()%26 +65); //轉成英文字母 
     }
     key[no++]= '-';
     for(i=0; i<(ASCII_NUM*MULTIPLY_VALUE) ;i++){
       key[no++]= (char)(rand()%10 +48); //轉成阿拉伯數字 
     }
 
     cout << "Serial is: " << key << endl;
 }
     system("PAUSE");
     return EXIT_SUCCESS;
 } 
 
		 
		
		 
	 
 以上藉由 
#define ASCII_NUM 3 
#define MULTIPLY_VALUE 2 
來控制序號格式 
輸入一個name 試算出三組序號
 
序號產生器其實與軟體序號驗證是一體兩面 
只要稍加修改就可崁入軟體啟用程序中 
有自己寫軟體的朋友門可以直接拿上述程式崁入應用 
有問題的版友也歡迎就此篇疑慮提出問題
 
希望大家會喜歡~thx~  
	 |