史萊姆論壇

史萊姆論壇 (http://forum.slime.com.tw/)
-   程式語言討論區 (http://forum.slime.com.tw/f76.html)
-   -   序號產生器的實作 教學 (http://forum.slime.com.tw/thread167126.html)

mini 2006-01-30 11:13 AM

序號產生器的實作 教學
 
這裡在 Yahoo知識+ 看到一則
因此直接(拿來用)貼出來
PHP 語法:

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argcchar *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 argcchar *argv[])
{
int ino=0;
char key[ASCII_NUM+ASCII_NUM*MULTIPLY_VALUE+2]="0"//計: 3個英文 + "-" + 6個阿拉伯數字 + '\0'
char *name;
int handle;

cout << "Name: ";
gets(name);
for(
i=0i<strlen(name) ;i++){
    
//cout << (int)name[i] << endl;
    
no+=name[i];
}
//cout << no << endl;

try{
    
handleopen("key.exe"O_BINARY);
    
srand(filelength(handle)+no);
    
close(handle);
}
catch(
std::exception &e){ }

for(
int j=0j<3j++){
    
no=0;
    
    for(
i=0i<ASCII_NUM ;i++){
      
key[no++]= (char)(rand()%26 +65); //轉成英文字母 
    
}
    
key[no++]= '-';
    for(
i=0i<(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~

羅迪 2006-01-31 08:19 AM

mini大大,可否作一個使用實例?

mini 2006-02-01 02:10 PM

引用:

作者: 羅迪
mini大大,可否作一個使用實例?

http://www.slime2.com.tw/forums/show...45#post1472045
那個範例也就是驗證


所有時間均為台北時間。現在的時間是 01:01 AM

Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2024, Jelsoft Enterprises Ltd.

『服務條款』

* 有問題不知道該怎麼解決嗎?請聯絡本站的系統管理員 *


SEO by vBSEO 3.6.1